| 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 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 74 raw_data->set_hashes(data, data_size); | 74 raw_data->set_hashes(data, data_size); |
| 75 raw_data->clear_add_numbers(); | 75 raw_data->clear_add_numbers(); |
| 76 for (size_t i = 0; i < add_chunk_numbers.size(); ++i) { | 76 for (size_t i = 0; i < add_chunk_numbers.size(); ++i) { |
| 77 raw_data->add_add_numbers(add_chunk_numbers[i]); | 77 raw_data->add_add_numbers(add_chunk_numbers[i]); |
| 78 } | 78 } |
| 79 | 79 |
| 80 return new SBChunkData(raw_data.release()); | 80 return new SBChunkData(raw_data.release()); |
| 81 } | 81 } |
| 82 | 82 |
| 83 // Create add chunk with a single prefix. | 83 // Create add chunk with a single prefix. |
| 84 SBChunkData* AddChunkPrefix(int chunk_number, SBPrefix prefix) { | 84 SBChunkData* AddChunkPrefix(int chunk_number, SBPrefix prefix) { |
| 85 return BuildChunk(chunk_number, safe_browsing::ChunkData::ADD, | 85 return BuildChunk(chunk_number, safe_browsing::ChunkData::ADD, |
| 86 safe_browsing::ChunkData::PREFIX_4B, | 86 safe_browsing::ChunkData::PREFIX_4B, |
| 87 &prefix, sizeof(prefix), | 87 &prefix, sizeof(prefix), |
| 88 std::vector<int>()); | 88 std::vector<int>()); |
| 89 } | 89 } |
| 90 | 90 |
| 91 // Create add chunk with a single prefix generated from |value|. | 91 // Create add chunk with a single prefix generated from |value|. |
| 92 SBChunkData* AddChunkPrefixValue(int chunk_number, | 92 SBChunkData* AddChunkPrefixValue(int chunk_number, |
| 93 const std::string& value) { | 93 const std::string& value) { |
| 94 return AddChunkPrefix(chunk_number, SBPrefixForString(value)); | 94 return AddChunkPrefix(chunk_number, SBPrefixForString(value)); |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 | 252 |
| 253 } // namespace | 253 } // namespace |
| 254 | 254 |
| 255 class SafeBrowsingDatabaseTest : public PlatformTest { | 255 class SafeBrowsingDatabaseTest : public PlatformTest { |
| 256 public: | 256 public: |
| 257 void SetUp() override { | 257 void SetUp() override { |
| 258 PlatformTest::SetUp(); | 258 PlatformTest::SetUp(); |
| 259 | 259 |
| 260 // Setup a database in a temporary directory. | 260 // Setup a database in a temporary directory. |
| 261 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 261 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 262 database_.reset(new SafeBrowsingDatabaseNew); | |
| 263 database_filename_ = | 262 database_filename_ = |
| 264 temp_dir_.path().AppendASCII("SafeBrowsingTestDatabase"); | 263 temp_dir_.path().AppendASCII("SafeBrowsingTestDatabase"); |
| 265 database_->Init(database_filename_); | 264 |
| 265 ResetAndReloadFullDatabase(); |
| 266 } | 266 } |
| 267 | 267 |
| 268 void TearDown() override { | 268 void TearDown() override { |
| 269 database_.reset(); | 269 database_.reset(); |
| 270 | 270 |
| 271 PlatformTest::TearDown(); | 271 PlatformTest::TearDown(); |
| 272 } | 272 } |
| 273 | 273 |
| 274 // Reloads the |database_| in a new SafeBrowsingDatabaseNew object with all |
| 275 // stores enabled. |
| 276 void ResetAndReloadFullDatabase() { |
| 277 SafeBrowsingStoreFile* browse_store = new SafeBrowsingStoreFile(); |
| 278 SafeBrowsingStoreFile* download_store = new SafeBrowsingStoreFile(); |
| 279 SafeBrowsingStoreFile* csd_whitelist_store = new SafeBrowsingStoreFile(); |
| 280 SafeBrowsingStoreFile* download_whitelist_store = |
| 281 new SafeBrowsingStoreFile(); |
| 282 SafeBrowsingStoreFile* extension_blacklist_store = |
| 283 new SafeBrowsingStoreFile(); |
| 284 SafeBrowsingStoreFile* side_effect_free_whitelist_store = |
| 285 new SafeBrowsingStoreFile(); |
| 286 SafeBrowsingStoreFile* ip_blacklist_store = new SafeBrowsingStoreFile(); |
| 287 SafeBrowsingStoreFile* unwanted_software_store = |
| 288 new SafeBrowsingStoreFile(); |
| 289 database_.reset( |
| 290 new SafeBrowsingDatabaseNew(browse_store, |
| 291 download_store, |
| 292 csd_whitelist_store, |
| 293 download_whitelist_store, |
| 294 extension_blacklist_store, |
| 295 side_effect_free_whitelist_store, |
| 296 ip_blacklist_store, |
| 297 unwanted_software_store)); |
| 298 database_->Init(database_filename_); |
| 299 } |
| 300 |
| 274 void GetListsInfo(std::vector<SBListChunkRanges>* lists) { | 301 void GetListsInfo(std::vector<SBListChunkRanges>* lists) { |
| 275 lists->clear(); | 302 lists->clear(); |
| 276 ASSERT_TRUE(database_->UpdateStarted(lists)); | 303 ASSERT_TRUE(database_->UpdateStarted(lists)); |
| 277 database_->UpdateFinished(true); | 304 database_->UpdateFinished(true); |
| 278 } | 305 } |
| 279 | 306 |
| 280 // Helper function to do an AddDel or SubDel command. | 307 // Helper function to do an AddDel or SubDel command. |
| 281 void DelChunk(const std::string& list, | 308 void DelChunk(const std::string& list, |
| 282 int chunk_id, | 309 int chunk_id, |
| 283 bool is_sub_del) { | 310 bool is_sub_del) { |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 chunks.push_back( | 380 chunks.push_back( |
| 354 SubChunkPrefixValue(200, "www.phishy.com/notevil1.html", 1999)); | 381 SubChunkPrefixValue(200, "www.phishy.com/notevil1.html", 1999)); |
| 355 chunks.push_back( | 382 chunks.push_back( |
| 356 SubChunkPrefixValue(201, "www.phishy2.com/notevil1.html", 1999)); | 383 SubChunkPrefixValue(201, "www.phishy2.com/notevil1.html", 1999)); |
| 357 | 384 |
| 358 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 385 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 359 database_->InsertChunks(safe_browsing_util::kPhishingList, chunks.get()); | 386 database_->InsertChunks(safe_browsing_util::kPhishingList, chunks.get()); |
| 360 database_->UpdateFinished(true); | 387 database_->UpdateFinished(true); |
| 361 | 388 |
| 362 GetListsInfo(&lists); | 389 GetListsInfo(&lists); |
| 363 ASSERT_EQ(2U, lists.size()); | 390 ASSERT_LE(2U, lists.size()); |
| 364 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); | 391 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); |
| 365 EXPECT_EQ("1-3", lists[0].adds); | 392 EXPECT_EQ("1-3", lists[0].adds); |
| 366 EXPECT_EQ("7", lists[0].subs); | 393 EXPECT_EQ("7", lists[0].subs); |
| 367 EXPECT_EQ(safe_browsing_util::kPhishingList, lists[1].name); | 394 EXPECT_EQ(safe_browsing_util::kPhishingList, lists[1].name); |
| 368 EXPECT_EQ("47", lists[1].adds); | 395 EXPECT_EQ("47", lists[1].adds); |
| 369 EXPECT_EQ("200-201", lists[1].subs); | 396 EXPECT_EQ("200-201", lists[1].subs); |
| 370 } | 397 } |
| 371 | 398 |
| 372 TEST_F(SafeBrowsingDatabaseTest, ListNameForBrowseAndDownload) { | 399 TEST_F(SafeBrowsingDatabaseTest, ListNameForBrowseAndDownload) { |
| 373 database_.reset(); | |
| 374 base::MessageLoop loop; | |
| 375 SafeBrowsingStoreFile* browse_store = new SafeBrowsingStoreFile(); | |
| 376 SafeBrowsingStoreFile* download_store = new SafeBrowsingStoreFile(); | |
| 377 SafeBrowsingStoreFile* csd_whitelist_store = new SafeBrowsingStoreFile(); | |
| 378 SafeBrowsingStoreFile* download_whitelist_store = new SafeBrowsingStoreFile(); | |
| 379 SafeBrowsingStoreFile* extension_blacklist_store = | |
| 380 new SafeBrowsingStoreFile(); | |
| 381 SafeBrowsingStoreFile* ip_blacklist_store = new SafeBrowsingStoreFile(); | |
| 382 database_.reset(new SafeBrowsingDatabaseNew(browse_store, | |
| 383 download_store, | |
| 384 csd_whitelist_store, | |
| 385 download_whitelist_store, | |
| 386 extension_blacklist_store, | |
| 387 NULL, | |
| 388 ip_blacklist_store)); | |
| 389 database_->Init(database_filename_); | |
| 390 | |
| 391 ScopedVector<SBChunkData> chunks; | 400 ScopedVector<SBChunkData> chunks; |
| 392 | 401 |
| 393 std::vector<SBListChunkRanges> lists; | 402 std::vector<SBListChunkRanges> lists; |
| 394 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 403 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 395 | 404 |
| 396 // Insert malware, phish, binurl and bindownload add chunks. | 405 // Insert malware, phish, binurl and bindownload add chunks. |
| 397 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/malware.html")); | 406 chunks.push_back(AddChunkPrefixValue(1, "www.evil.com/malware.html")); |
| 398 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 407 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); |
| 399 | 408 |
| 400 chunks.clear(); | 409 chunks.clear(); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 417 chunks.push_back(AddChunkFullHashValue(8, | 426 chunks.push_back(AddChunkFullHashValue(8, |
| 418 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" | 427 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" |
| 419 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); | 428 "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")); |
| 420 database_->InsertChunks(safe_browsing_util::kExtensionBlacklist, | 429 database_->InsertChunks(safe_browsing_util::kExtensionBlacklist, |
| 421 chunks.get()); | 430 chunks.get()); |
| 422 | 431 |
| 423 chunks.clear(); | 432 chunks.clear(); |
| 424 chunks.push_back(AddChunkHashedIpValue(9, "::ffff:192.168.1.0", 120)); | 433 chunks.push_back(AddChunkHashedIpValue(9, "::ffff:192.168.1.0", 120)); |
| 425 database_->InsertChunks(safe_browsing_util::kIPBlacklist, chunks.get()); | 434 database_->InsertChunks(safe_browsing_util::kIPBlacklist, chunks.get()); |
| 426 | 435 |
| 436 chunks.clear(); |
| 437 chunks.push_back(AddChunkPrefixValue(10, "www.unwanted.com/software.html")); |
| 438 database_->InsertChunks(safe_browsing_util::kUnwantedUrlList, chunks.get()); |
| 439 |
| 427 database_->UpdateFinished(true); | 440 database_->UpdateFinished(true); |
| 428 | 441 |
| 429 GetListsInfo(&lists); | 442 GetListsInfo(&lists); |
| 430 ASSERT_EQ(7U, lists.size()); | 443 ASSERT_EQ(9U, lists.size()); |
| 431 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); | 444 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); |
| 432 EXPECT_EQ("1", lists[0].adds); | 445 EXPECT_EQ("1", lists[0].adds); |
| 433 EXPECT_TRUE(lists[0].subs.empty()); | 446 EXPECT_TRUE(lists[0].subs.empty()); |
| 434 EXPECT_EQ(safe_browsing_util::kPhishingList, lists[1].name); | 447 EXPECT_EQ(safe_browsing_util::kPhishingList, lists[1].name); |
| 435 EXPECT_EQ("2", lists[1].adds); | 448 EXPECT_EQ("2", lists[1].adds); |
| 436 EXPECT_TRUE(lists[1].subs.empty()); | 449 EXPECT_TRUE(lists[1].subs.empty()); |
| 437 EXPECT_EQ(safe_browsing_util::kBinUrlList, lists[2].name); | 450 EXPECT_EQ(safe_browsing_util::kBinUrlList, lists[2].name); |
| 438 EXPECT_EQ("3", lists[2].adds); | 451 EXPECT_EQ("3", lists[2].adds); |
| 439 EXPECT_TRUE(lists[2].subs.empty()); | 452 EXPECT_TRUE(lists[2].subs.empty()); |
| 440 EXPECT_EQ(safe_browsing_util::kCsdWhiteList, lists[3].name); | 453 EXPECT_EQ(safe_browsing_util::kCsdWhiteList, lists[3].name); |
| 441 EXPECT_EQ("5", lists[3].adds); | 454 EXPECT_EQ("5", lists[3].adds); |
| 442 EXPECT_TRUE(lists[3].subs.empty()); | 455 EXPECT_TRUE(lists[3].subs.empty()); |
| 443 EXPECT_EQ(safe_browsing_util::kDownloadWhiteList, lists[4].name); | 456 EXPECT_EQ(safe_browsing_util::kDownloadWhiteList, lists[4].name); |
| 444 EXPECT_EQ("6", lists[4].adds); | 457 EXPECT_EQ("6", lists[4].adds); |
| 445 EXPECT_TRUE(lists[4].subs.empty()); | 458 EXPECT_TRUE(lists[4].subs.empty()); |
| 446 EXPECT_EQ(safe_browsing_util::kExtensionBlacklist, lists[5].name); | 459 EXPECT_EQ(safe_browsing_util::kExtensionBlacklist, lists[5].name); |
| 447 EXPECT_EQ("8", lists[5].adds); | 460 EXPECT_EQ("8", lists[5].adds); |
| 448 EXPECT_TRUE(lists[5].subs.empty()); | 461 EXPECT_TRUE(lists[5].subs.empty()); |
| 449 EXPECT_EQ(safe_browsing_util::kIPBlacklist, lists[6].name); | 462 EXPECT_EQ(safe_browsing_util::kIPBlacklist, lists[7].name); |
| 450 EXPECT_EQ("9", lists[6].adds); | 463 EXPECT_EQ("9", lists[7].adds); |
| 451 EXPECT_TRUE(lists[6].subs.empty()); | 464 EXPECT_TRUE(lists[7].subs.empty()); |
| 465 EXPECT_EQ(safe_browsing_util::kUnwantedUrlList, lists[8].name); |
| 466 EXPECT_EQ("10", lists[8].adds); |
| 467 EXPECT_TRUE(lists[8].subs.empty()); |
| 452 | 468 |
| 453 database_.reset(); | 469 database_.reset(); |
| 454 } | 470 } |
| 455 | 471 |
| 456 // Checks database reading and writing for browse. | 472 // Checks database reading and writing for browse and unwanted PrefixSets. |
| 457 TEST_F(SafeBrowsingDatabaseTest, BrowseDatabase) { | 473 TEST_F(SafeBrowsingDatabaseTest, BrowseAndUnwantedDatabasesAndPrefixSets) { |
| 458 std::vector<SBListChunkRanges> lists; | 474 struct TestCase { |
| 459 ScopedVector<SBChunkData> chunks; | 475 using TestListContainsBadUrl = bool (SafeBrowsingDatabase::*)( |
| 460 | 476 const GURL& url, |
| 461 chunks.push_back(AddChunkPrefix2Value(1, | 477 std::vector<SBPrefix>* prefix_hits, |
| 462 "www.evil.com/phishing.html", | 478 std::vector<SBFullHashResult>* cache_hits); |
| 463 "www.evil.com/malware.html")); | 479 |
| 464 chunks.push_back(AddChunkPrefix4Value(2, | 480 const char* test_list_name; |
| 465 "www.evil.com/notevil1.html", | 481 size_t expected_list_index; |
| 466 "www.evil.com/notevil2.html", | 482 TestListContainsBadUrl test_list_contains_bad_url; |
| 467 "www.good.com/good1.html", | 483 } const kTestCases[] { |
| 468 "www.good.com/good2.html")); | 484 { safe_browsing_util::kMalwareList, 0U, |
| 469 chunks.push_back(AddChunkPrefixValue(3, "192.168.0.1/malware.html")); | 485 &SafeBrowsingDatabase::ContainsBrowseUrl }, |
| 470 chunks.push_back(AddChunkFullHashValue(7, "www.evil.com/evil.html")); | 486 { safe_browsing_util::kPhishingList, 1U, |
| 471 | 487 &SafeBrowsingDatabase::ContainsBrowseUrl }, |
| 472 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 488 { safe_browsing_util::kUnwantedUrlList, 8U, |
| 473 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 489 &SafeBrowsingDatabase::ContainsUnwantedSoftwareUrl }, |
| 474 database_->UpdateFinished(true); | 490 }; |
| 475 | 491 |
| 476 // Make sure they were added correctly. | 492 for (const auto& test_case : kTestCases) { |
| 477 GetListsInfo(&lists); | 493 SCOPED_TRACE(std::string("Tested list at fault => ") + |
| 478 ASSERT_LE(1U, lists.size()); | 494 test_case.test_list_name); |
| 479 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); | 495 |
| 480 EXPECT_EQ("1-3,7", lists[0].adds); | 496 std::vector<SBListChunkRanges> lists; |
| 481 EXPECT_TRUE(lists[0].subs.empty()); | 497 ScopedVector<SBChunkData> chunks; |
| 482 | 498 |
| 483 std::vector<SBPrefix> prefix_hits; | 499 chunks.push_back(AddChunkPrefix2Value(1, |
| 484 std::vector<SBFullHashResult> cache_hits; | 500 "www.evil.com/phishing.html", |
| 485 EXPECT_TRUE(database_->ContainsBrowseUrl( | 501 "www.evil.com/malware.html")); |
| 486 GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits)); | 502 chunks.push_back(AddChunkPrefix4Value(2, |
| 487 ASSERT_EQ(1U, prefix_hits.size()); | 503 "www.evil.com/notevil1.html", |
| 488 EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]); | 504 "www.evil.com/notevil2.html", |
| 489 EXPECT_TRUE(cache_hits.empty()); | 505 "www.good.com/good1.html", |
| 490 | 506 "www.good.com/good2.html")); |
| 491 EXPECT_TRUE(database_->ContainsBrowseUrl( | 507 chunks.push_back(AddChunkPrefixValue(3, "192.168.0.1/malware.html")); |
| 492 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); | 508 chunks.push_back(AddChunkFullHashValue(7, "www.evil.com/evil.html")); |
| 493 | 509 |
| 494 EXPECT_TRUE(database_->ContainsBrowseUrl( | 510 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 495 GURL("http://www.evil.com/notevil1.html"), &prefix_hits, &cache_hits)); | 511 database_->InsertChunks(test_case.test_list_name, chunks.get()); |
| 496 | 512 database_->UpdateFinished(true); |
| 497 EXPECT_TRUE(database_->ContainsBrowseUrl( | 513 |
| 498 GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits)); | 514 // Make sure they were added correctly. |
| 499 | 515 GetListsInfo(&lists); |
| 500 EXPECT_TRUE(database_->ContainsBrowseUrl( | 516 |
| 501 GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits)); | 517 ASSERT_LE(1U, lists.size()); |
| 502 | 518 EXPECT_EQ(test_case.test_list_name, |
| 503 EXPECT_TRUE(database_->ContainsBrowseUrl( | 519 lists[test_case.expected_list_index].name); |
| 504 GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits)); | 520 EXPECT_EQ("1-3,7", lists[test_case.expected_list_index].adds); |
| 505 | 521 EXPECT_TRUE(lists[test_case.expected_list_index].subs.empty()); |
| 506 EXPECT_TRUE(database_->ContainsBrowseUrl( | 522 |
| 507 GURL("http://192.168.0.1/malware.html"), &prefix_hits, &cache_hits)); | 523 std::vector<SBPrefix> prefix_hits; |
| 508 | 524 std::vector<SBFullHashResult> cache_hits; |
| 509 EXPECT_FALSE(database_->ContainsBrowseUrl( | 525 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 510 GURL("http://www.evil.com/"), &prefix_hits, &cache_hits)); | 526 GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits)); |
| 511 EXPECT_TRUE(prefix_hits.empty()); | 527 ASSERT_EQ(1U, prefix_hits.size()); |
| 512 EXPECT_TRUE(cache_hits.empty()); | 528 EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]); |
| 513 | 529 EXPECT_TRUE(cache_hits.empty()); |
| 514 EXPECT_FALSE(database_->ContainsBrowseUrl( | 530 |
| 515 GURL("http://www.evil.com/robots.txt"), &prefix_hits, &cache_hits)); | 531 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 516 | 532 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); |
| 517 EXPECT_TRUE(database_->ContainsBrowseUrl( | 533 |
| 518 GURL("http://www.evil.com/evil.html"), &prefix_hits, &cache_hits)); | 534 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 519 ASSERT_EQ(1U, prefix_hits.size()); | 535 GURL("http://www.evil.com/notevil1.html"), &prefix_hits, &cache_hits)); |
| 520 EXPECT_EQ(SBPrefixForString("www.evil.com/evil.html"), prefix_hits[0]); | 536 |
| 521 | 537 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 522 // Attempt to re-add the first chunk (should be a no-op). | 538 GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits)); |
| 523 // see bug: http://code.google.com/p/chromium/issues/detail?id=4522 | 539 |
| 524 chunks.clear(); | 540 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 525 chunks.push_back(AddChunkPrefix2Value(1, | 541 GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits)); |
| 526 "www.evil.com/phishing.html", | 542 |
| 527 "www.evil.com/malware.html")); | 543 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 528 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 544 GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits)); |
| 529 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 545 |
| 530 database_->UpdateFinished(true); | 546 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 531 | 547 GURL("http://192.168.0.1/malware.html"), &prefix_hits, &cache_hits)); |
| 532 GetListsInfo(&lists); | 548 |
| 533 ASSERT_LE(1U, lists.size()); | 549 EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 534 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); | 550 GURL("http://www.evil.com/"), &prefix_hits, &cache_hits)); |
| 535 EXPECT_EQ("1-3,7", lists[0].adds); | 551 EXPECT_TRUE(prefix_hits.empty()); |
| 536 EXPECT_TRUE(lists[0].subs.empty()); | 552 EXPECT_TRUE(cache_hits.empty()); |
| 537 | 553 |
| 538 // Test removing a single prefix from the add chunk. | 554 EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 539 chunks.clear(); | 555 GURL("http://www.evil.com/robots.txt"), &prefix_hits, &cache_hits)); |
| 540 chunks.push_back(SubChunkPrefixValue(4, "www.evil.com/notevil1.html", 2)); | 556 |
| 541 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 557 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 542 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 558 GURL("http://www.evil.com/evil.html"), &prefix_hits, &cache_hits)); |
| 543 database_->UpdateFinished(true); | 559 ASSERT_EQ(1U, prefix_hits.size()); |
| 544 | 560 EXPECT_EQ(SBPrefixForString("www.evil.com/evil.html"), prefix_hits[0]); |
| 545 EXPECT_TRUE(database_->ContainsBrowseUrl( | 561 |
| 546 GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits)); | 562 // Attempt to re-add the first chunk (should be a no-op). |
| 547 ASSERT_EQ(1U, prefix_hits.size()); | 563 // see bug: http://code.google.com/p/chromium/issues/detail?id=4522 |
| 548 EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]); | 564 chunks.clear(); |
| 549 EXPECT_TRUE(cache_hits.empty()); | 565 chunks.push_back(AddChunkPrefix2Value(1, |
| 550 | 566 "www.evil.com/phishing.html", |
| 551 EXPECT_FALSE(database_->ContainsBrowseUrl( | 567 "www.evil.com/malware.html")); |
| 552 GURL("http://www.evil.com/notevil1.html"), &prefix_hits, &cache_hits)); | 568 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 553 EXPECT_TRUE(prefix_hits.empty()); | 569 database_->InsertChunks(test_case.test_list_name, chunks.get()); |
| 554 EXPECT_TRUE(cache_hits.empty()); | 570 database_->UpdateFinished(true); |
| 555 | 571 |
| 556 EXPECT_TRUE(database_->ContainsBrowseUrl( | 572 GetListsInfo(&lists); |
| 557 GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits)); | 573 ASSERT_LE(1U, lists.size()); |
| 558 | 574 EXPECT_EQ(test_case.test_list_name, |
| 559 EXPECT_TRUE(database_->ContainsBrowseUrl( | 575 lists[test_case.expected_list_index].name); |
| 560 GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits)); | 576 EXPECT_EQ("1-3,7", lists[test_case.expected_list_index].adds); |
| 561 | 577 EXPECT_TRUE(lists[test_case.expected_list_index].subs.empty()); |
| 562 EXPECT_TRUE(database_->ContainsBrowseUrl( | 578 |
| 563 GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits)); | 579 // Test removing a single prefix from the add chunk. |
| 564 | 580 chunks.clear(); |
| 565 GetListsInfo(&lists); | 581 chunks.push_back(SubChunkPrefixValue(4, "www.evil.com/notevil1.html", 2)); |
| 566 ASSERT_LE(1U, lists.size()); | 582 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 567 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); | 583 database_->InsertChunks(test_case.test_list_name, chunks.get()); |
| 568 EXPECT_EQ("1-3,7", lists[0].adds); | 584 database_->UpdateFinished(true); |
| 569 EXPECT_EQ("4", lists[0].subs); | 585 |
| 570 | 586 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 571 // Test the same sub chunk again. This should be a no-op. | 587 GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits)); |
| 572 // see bug: http://code.google.com/p/chromium/issues/detail?id=4522 | 588 ASSERT_EQ(1U, prefix_hits.size()); |
| 573 chunks.clear(); | 589 EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]); |
| 574 chunks.push_back(SubChunkPrefixValue(4, "www.evil.com/notevil1.html", 2)); | 590 EXPECT_TRUE(cache_hits.empty()); |
| 575 | 591 |
| 576 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 592 EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 577 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 593 GURL("http://www.evil.com/notevil1.html"), &prefix_hits, &cache_hits)); |
| 578 database_->UpdateFinished(true); | 594 EXPECT_TRUE(prefix_hits.empty()); |
| 579 | 595 EXPECT_TRUE(cache_hits.empty()); |
| 580 GetListsInfo(&lists); | 596 |
| 581 ASSERT_LE(1U, lists.size()); | 597 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 582 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); | 598 GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits)); |
| 583 EXPECT_EQ("1-3,7", lists[0].adds); | 599 |
| 584 EXPECT_EQ("4", lists[0].subs); | 600 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 585 | 601 GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits)); |
| 586 // Test removing all the prefixes from an add chunk. | 602 |
| 587 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 603 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 588 AddDelChunk(safe_browsing_util::kMalwareList, 2); | 604 GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits)); |
| 589 database_->UpdateFinished(true); | 605 |
| 590 | 606 GetListsInfo(&lists); |
| 591 EXPECT_FALSE(database_->ContainsBrowseUrl( | 607 ASSERT_LE(1U, lists.size()); |
| 592 GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits)); | 608 EXPECT_EQ(test_case.test_list_name, |
| 593 | 609 lists[test_case.expected_list_index].name); |
| 594 EXPECT_FALSE(database_->ContainsBrowseUrl( | 610 EXPECT_EQ("1-3,7", lists[test_case.expected_list_index].adds); |
| 595 GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits)); | 611 EXPECT_EQ("4", lists[test_case.expected_list_index].subs); |
| 596 | 612 |
| 597 EXPECT_FALSE(database_->ContainsBrowseUrl( | 613 // Test the same sub chunk again. This should be a no-op. |
| 598 GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits)); | 614 // see bug: http://code.google.com/p/chromium/issues/detail?id=4522 |
| 599 | 615 chunks.clear(); |
| 600 GetListsInfo(&lists); | 616 chunks.push_back(SubChunkPrefixValue(4, "www.evil.com/notevil1.html", 2)); |
| 601 ASSERT_LE(1U, lists.size()); | 617 |
| 602 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); | 618 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 603 EXPECT_EQ("1,3,7", lists[0].adds); | 619 database_->InsertChunks(test_case.test_list_name, chunks.get()); |
| 604 EXPECT_EQ("4", lists[0].subs); | 620 database_->UpdateFinished(true); |
| 605 | 621 |
| 606 // The adddel command exposed a bug in the transaction code where any | 622 GetListsInfo(&lists); |
| 607 // transaction after it would fail. Add a dummy entry and remove it to | 623 ASSERT_LE(1U, lists.size()); |
| 608 // make sure the transcation works fine. | 624 EXPECT_EQ(test_case.test_list_name, |
| 609 chunks.clear(); | 625 lists[test_case.expected_list_index].name); |
| 610 chunks.push_back(AddChunkPrefixValue(44, "www.redherring.com/index.html")); | 626 EXPECT_EQ("1-3,7", lists[test_case.expected_list_index].adds); |
| 611 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 627 EXPECT_EQ("4", lists[test_case.expected_list_index].subs); |
| 612 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 628 |
| 613 | 629 // Test removing all the prefixes from an add chunk. |
| 614 // Now remove the dummy entry. If there are any problems with the | 630 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 615 // transactions, asserts will fire. | 631 AddDelChunk(test_case.test_list_name, 2); |
| 616 AddDelChunk(safe_browsing_util::kMalwareList, 44); | 632 database_->UpdateFinished(true); |
| 617 | 633 |
| 618 // Test the subdel command. | 634 EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 619 SubDelChunk(safe_browsing_util::kMalwareList, 4); | 635 GURL("http://www.evil.com/notevil2.html"), &prefix_hits, &cache_hits)); |
| 620 database_->UpdateFinished(true); | 636 |
| 621 | 637 EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 622 GetListsInfo(&lists); | 638 GURL("http://www.good.com/good1.html"), &prefix_hits, &cache_hits)); |
| 623 ASSERT_LE(1U, lists.size()); | 639 |
| 624 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); | 640 EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 625 EXPECT_EQ("1,3,7", lists[0].adds); | 641 GURL("http://www.good.com/good2.html"), &prefix_hits, &cache_hits)); |
| 626 EXPECT_TRUE(lists[0].subs.empty()); | 642 |
| 627 | 643 GetListsInfo(&lists); |
| 628 // Test a sub command coming in before the add. | 644 ASSERT_LE(1U, lists.size()); |
| 629 chunks.clear(); | 645 EXPECT_EQ(test_case.test_list_name, |
| 630 chunks.push_back(SubChunkPrefix2Value(5, | 646 lists[test_case.expected_list_index].name); |
| 631 "www.notevilanymore.com/index.html", | 647 EXPECT_EQ("1,3,7", lists[test_case.expected_list_index].adds); |
| 632 10, | 648 EXPECT_EQ("4", lists[test_case.expected_list_index].subs); |
| 633 "www.notevilanymore.com/good.html", | 649 |
| 634 10)); | 650 // The adddel command exposed a bug in the transaction code where any |
| 635 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 651 // transaction after it would fail. Add a dummy entry and remove it to |
| 636 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 652 // make sure the transcation works fine. |
| 637 database_->UpdateFinished(true); | 653 chunks.clear(); |
| 638 | 654 chunks.push_back(AddChunkPrefixValue(44, "www.redherring.com/index.html")); |
| 639 EXPECT_FALSE(database_->ContainsBrowseUrl( | 655 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 640 GURL("http://www.notevilanymore.com/index.html"), | 656 database_->InsertChunks(test_case.test_list_name, chunks.get()); |
| 641 &prefix_hits, | 657 |
| 642 &cache_hits)); | 658 // Now remove the dummy entry. If there are any problems with the |
| 643 | 659 // transactions, asserts will fire. |
| 644 // Now insert the tardy add chunk and we don't expect them to appear | 660 AddDelChunk(test_case.test_list_name, 44); |
| 645 // in database because of the previous sub chunk. | 661 |
| 646 chunks.clear(); | 662 // Test the subdel command. |
| 647 chunks.push_back(AddChunkPrefix2Value(10, | 663 SubDelChunk(test_case.test_list_name, 4); |
| 648 "www.notevilanymore.com/index.html", | 664 database_->UpdateFinished(true); |
| 649 "www.notevilanymore.com/good.html")); | 665 |
| 650 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 666 GetListsInfo(&lists); |
| 651 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 667 ASSERT_LE(1U, lists.size()); |
| 652 database_->UpdateFinished(true); | 668 EXPECT_EQ(test_case.test_list_name, |
| 653 | 669 lists[test_case.expected_list_index].name); |
| 654 EXPECT_FALSE(database_->ContainsBrowseUrl( | 670 EXPECT_EQ("1,3,7", lists[test_case.expected_list_index].adds); |
| 655 GURL("http://www.notevilanymore.com/index.html"), | 671 EXPECT_TRUE(lists[test_case.expected_list_index].subs.empty()); |
| 656 &prefix_hits, | 672 |
| 657 &cache_hits)); | 673 // Test a sub command coming in before the add. |
| 658 | 674 chunks.clear(); |
| 659 EXPECT_FALSE(database_->ContainsBrowseUrl( | 675 chunks.push_back(SubChunkPrefix2Value(5, |
| 660 GURL("http://www.notevilanymore.com/good.html"), | 676 "www.notevilanymore.com/index.html", |
| 661 &prefix_hits, | 677 10, |
| 662 &cache_hits)); | 678 "www.notevilanymore.com/good.html", |
| 663 | 679 10)); |
| 664 // Reset and reload the database. The database will rely on the prefix set. | 680 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 665 database_.reset(new SafeBrowsingDatabaseNew); | 681 database_->InsertChunks(test_case.test_list_name, chunks.get()); |
| 666 database_->Init(database_filename_); | 682 database_->UpdateFinished(true); |
| 667 | 683 |
| 668 // Check that a prefix still hits. | 684 EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 669 EXPECT_TRUE(database_->ContainsBrowseUrl( | 685 GURL("http://www.notevilanymore.com/index.html"), |
| 670 GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits)); | 686 &prefix_hits, |
| 671 ASSERT_EQ(1U, prefix_hits.size()); | 687 &cache_hits)); |
| 672 EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]); | 688 |
| 673 | 689 // Now insert the tardy add chunk and we don't expect them to appear |
| 674 // Also check that it's not just always returning true in this case. | 690 // in database because of the previous sub chunk. |
| 675 EXPECT_FALSE(database_->ContainsBrowseUrl( | 691 chunks.clear(); |
| 676 GURL("http://www.evil.com/"), &prefix_hits, &cache_hits)); | 692 chunks.push_back(AddChunkPrefix2Value(10, |
| 677 | 693 "www.notevilanymore.com/index.html", |
| 678 // Check that the full hash is still present. | 694 "www.notevilanymore.com/good.html")); |
| 679 EXPECT_TRUE(database_->ContainsBrowseUrl( | 695 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 680 GURL("http://www.evil.com/evil.html"), &prefix_hits, &cache_hits)); | 696 database_->InsertChunks(test_case.test_list_name, chunks.get()); |
| 681 ASSERT_EQ(1U, prefix_hits.size()); | 697 database_->UpdateFinished(true); |
| 682 EXPECT_EQ(SBPrefixForString("www.evil.com/evil.html"), prefix_hits[0]); | 698 |
| 699 EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 700 GURL("http://www.notevilanymore.com/index.html"), |
| 701 &prefix_hits, |
| 702 &cache_hits)); |
| 703 |
| 704 EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 705 GURL("http://www.notevilanymore.com/good.html"), |
| 706 &prefix_hits, |
| 707 &cache_hits)); |
| 708 |
| 709 // Reset and reload the database. The database will rely on the prefix set. |
| 710 ResetAndReloadFullDatabase(); |
| 711 |
| 712 // Check that a prefix still hits. |
| 713 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 714 GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits)); |
| 715 ASSERT_EQ(1U, prefix_hits.size()); |
| 716 EXPECT_EQ(SBPrefixForString("www.evil.com/phishing.html"), prefix_hits[0]); |
| 717 |
| 718 // Also check that it's not just always returning true in this case. |
| 719 EXPECT_FALSE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 720 GURL("http://www.evil.com/"), &prefix_hits, &cache_hits)); |
| 721 |
| 722 // Check that the full hash is still present. |
| 723 EXPECT_TRUE((database_.get()->*test_case.test_list_contains_bad_url)( |
| 724 GURL("http://www.evil.com/evil.html"), &prefix_hits, &cache_hits)); |
| 725 ASSERT_EQ(1U, prefix_hits.size()); |
| 726 EXPECT_EQ(SBPrefixForString("www.evil.com/evil.html"), prefix_hits[0]); |
| 727 } |
| 683 } | 728 } |
| 684 | 729 |
| 685 // Test adding zero length chunks to the database. | 730 // Test adding zero length chunks to the database. |
| 686 TEST_F(SafeBrowsingDatabaseTest, ZeroSizeChunk) { | 731 TEST_F(SafeBrowsingDatabaseTest, ZeroSizeChunk) { |
| 687 std::vector<SBListChunkRanges> lists; | 732 std::vector<SBListChunkRanges> lists; |
| 688 ScopedVector<SBChunkData> chunks; | 733 ScopedVector<SBChunkData> chunks; |
| 689 | 734 |
| 690 // Populate with a couple of normal chunks. | 735 // Populate with a couple of normal chunks. |
| 691 chunks.push_back(AddChunkPrefix2Value(1, | 736 chunks.push_back(AddChunkPrefix2Value(1, |
| 692 "www.test.com/test1.html", | 737 "www.test.com/test1.html", |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 779 chunks.push_back(AddChunkPrefix2Value(1, | 824 chunks.push_back(AddChunkPrefix2Value(1, |
| 780 "www.evil.com/phishing.html", | 825 "www.evil.com/phishing.html", |
| 781 "www.evil.com/malware.html")); | 826 "www.evil.com/malware.html")); |
| 782 | 827 |
| 783 std::vector<SBListChunkRanges> lists; | 828 std::vector<SBListChunkRanges> lists; |
| 784 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 829 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 785 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 830 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); |
| 786 database_->UpdateFinished(true); | 831 database_->UpdateFinished(true); |
| 787 | 832 |
| 788 // Cache should be cleared after updating. | 833 // Cache should be cleared after updating. |
| 789 EXPECT_TRUE(database_->browse_gethash_cache_.empty()); | 834 EXPECT_TRUE(database_->prefix_gethash_cache_.empty()); |
| 790 | 835 |
| 791 SBFullHashResult full_hash; | 836 SBFullHashResult full_hash; |
| 792 full_hash.list_id = safe_browsing_util::MALWARE; | 837 full_hash.list_id = safe_browsing_util::MALWARE; |
| 793 | 838 |
| 794 std::vector<SBFullHashResult> results; | 839 std::vector<SBFullHashResult> results; |
| 795 std::vector<SBPrefix> prefixes; | 840 std::vector<SBPrefix> prefixes; |
| 796 | 841 |
| 797 // Add a fullhash result for each prefix. | 842 // Add a fullhash result for each prefix. |
| 798 full_hash.hash = SBFullHashForString("www.evil.com/phishing.html"); | 843 full_hash.hash = SBFullHashForString("www.evil.com/phishing.html"); |
| 799 results.push_back(full_hash); | 844 results.push_back(full_hash); |
| 800 prefixes.push_back(full_hash.hash.prefix); | 845 prefixes.push_back(full_hash.hash.prefix); |
| 801 | 846 |
| 802 full_hash.hash = SBFullHashForString("www.evil.com/malware.html"); | 847 full_hash.hash = SBFullHashForString("www.evil.com/malware.html"); |
| 803 results.push_back(full_hash); | 848 results.push_back(full_hash); |
| 804 prefixes.push_back(full_hash.hash.prefix); | 849 prefixes.push_back(full_hash.hash.prefix); |
| 805 | 850 |
| 806 database_->CacheHashResults(prefixes, results, kCacheLifetime); | 851 database_->CacheHashResults(prefixes, results, kCacheLifetime); |
| 807 } | 852 } |
| 808 | 853 |
| 809 TEST_F(SafeBrowsingDatabaseTest, HashCaching) { | 854 TEST_F(SafeBrowsingDatabaseTest, HashCaching) { |
| 810 PopulateDatabaseForCacheTest(); | 855 PopulateDatabaseForCacheTest(); |
| 811 | 856 |
| 812 // We should have both full hashes in the cache. | 857 // We should have both full hashes in the cache. |
| 813 EXPECT_EQ(2U, database_->browse_gethash_cache_.size()); | 858 EXPECT_EQ(2U, database_->prefix_gethash_cache_.size()); |
| 814 | 859 |
| 815 // Test the cache lookup for the first prefix. | 860 // Test the cache lookup for the first prefix. |
| 816 std::vector<SBPrefix> prefix_hits; | 861 std::vector<SBPrefix> prefix_hits; |
| 817 std::vector<SBFullHashResult> cache_hits; | 862 std::vector<SBFullHashResult> cache_hits; |
| 818 EXPECT_TRUE(database_->ContainsBrowseUrl( | 863 EXPECT_TRUE(database_->ContainsBrowseUrl( |
| 819 GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits)); | 864 GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits)); |
| 820 EXPECT_TRUE(prefix_hits.empty()); | 865 EXPECT_TRUE(prefix_hits.empty()); |
| 821 ASSERT_EQ(1U, cache_hits.size()); | 866 ASSERT_EQ(1U, cache_hits.size()); |
| 822 EXPECT_TRUE(SBFullHashEqual( | 867 EXPECT_TRUE(SBFullHashEqual( |
| 823 cache_hits[0].hash, SBFullHashForString("www.evil.com/phishing.html"))); | 868 cache_hits[0].hash, SBFullHashForString("www.evil.com/phishing.html"))); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 859 GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits)); | 904 GURL("http://www.evil.com/phishing.html"), &prefix_hits, &cache_hits)); |
| 860 prefix_hits.clear(); | 905 prefix_hits.clear(); |
| 861 cache_hits.clear(); | 906 cache_hits.clear(); |
| 862 | 907 |
| 863 // Test that an AddDel for the original chunk removes the last cached entry. | 908 // Test that an AddDel for the original chunk removes the last cached entry. |
| 864 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 909 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 865 AddDelChunk(safe_browsing_util::kMalwareList, 1); | 910 AddDelChunk(safe_browsing_util::kMalwareList, 1); |
| 866 database_->UpdateFinished(true); | 911 database_->UpdateFinished(true); |
| 867 EXPECT_FALSE(database_->ContainsBrowseUrl( | 912 EXPECT_FALSE(database_->ContainsBrowseUrl( |
| 868 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); | 913 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); |
| 869 EXPECT_TRUE(database_->browse_gethash_cache_.empty()); | 914 EXPECT_TRUE(database_->prefix_gethash_cache_.empty()); |
| 870 prefix_hits.clear(); | 915 prefix_hits.clear(); |
| 871 cache_hits.clear(); | 916 cache_hits.clear(); |
| 872 | 917 |
| 873 // Test that the cache won't return expired values. First we have to adjust | 918 // Test that the cache won't return expired values. First we have to adjust |
| 874 // the cached entries' received time to make them older, since the database | 919 // the cached entries' received time to make them older, since the database |
| 875 // cache insert uses Time::Now(). First, store some entries. | 920 // cache insert uses Time::Now(). First, store some entries. |
| 876 PopulateDatabaseForCacheTest(); | 921 PopulateDatabaseForCacheTest(); |
| 877 | 922 |
| 878 std::map<SBPrefix, SBCachedFullHashResult>* hash_cache = | 923 std::map<SBPrefix, SBCachedFullHashResult>* hash_cache = |
| 879 &database_->browse_gethash_cache_; | 924 &database_->prefix_gethash_cache_; |
| 880 EXPECT_EQ(2U, hash_cache->size()); | 925 EXPECT_EQ(2U, hash_cache->size()); |
| 881 | 926 |
| 882 // Now adjust one of the entries times to be in the past. | 927 // Now adjust one of the entries times to be in the past. |
| 883 const SBPrefix key = SBPrefixForString("www.evil.com/malware.html"); | 928 const SBPrefix key = SBPrefixForString("www.evil.com/malware.html"); |
| 884 std::map<SBPrefix, SBCachedFullHashResult>::iterator iter = | 929 std::map<SBPrefix, SBCachedFullHashResult>::iterator iter = |
| 885 hash_cache->find(key); | 930 hash_cache->find(key); |
| 886 ASSERT_TRUE(iter != hash_cache->end()); | 931 ASSERT_TRUE(iter != hash_cache->end()); |
| 887 iter->second.expire_after = Time::Now() - TimeDelta::FromMinutes(1); | 932 iter->second.expire_after = Time::Now() - TimeDelta::FromMinutes(1); |
| 888 | 933 |
| 889 EXPECT_TRUE(database_->ContainsBrowseUrl( | 934 EXPECT_TRUE(database_->ContainsBrowseUrl( |
| (...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1044 // TODO(shess): Disabled until ScopedLogMessageIgnorer resolved. | 1089 // TODO(shess): Disabled until ScopedLogMessageIgnorer resolved. |
| 1045 // http://crbug.com/56448 | 1090 // http://crbug.com/56448 |
| 1046 TEST_F(SafeBrowsingDatabaseTest, DISABLED_FileCorruptionHandling) { | 1091 TEST_F(SafeBrowsingDatabaseTest, DISABLED_FileCorruptionHandling) { |
| 1047 // Re-create the database in a captive message loop so that we can | 1092 // Re-create the database in a captive message loop so that we can |
| 1048 // influence task-posting. Database specifically needs to the | 1093 // influence task-posting. Database specifically needs to the |
| 1049 // file-backed. | 1094 // file-backed. |
| 1050 database_.reset(); | 1095 database_.reset(); |
| 1051 base::MessageLoop loop; | 1096 base::MessageLoop loop; |
| 1052 SafeBrowsingStoreFile* store = new SafeBrowsingStoreFile(); | 1097 SafeBrowsingStoreFile* store = new SafeBrowsingStoreFile(); |
| 1053 database_.reset(new SafeBrowsingDatabaseNew(store, NULL, NULL, NULL, NULL, | 1098 database_.reset(new SafeBrowsingDatabaseNew(store, NULL, NULL, NULL, NULL, |
| 1054 NULL, NULL)); | 1099 NULL, NULL, NULL)); |
| 1055 database_->Init(database_filename_); | 1100 database_->Init(database_filename_); |
| 1056 | 1101 |
| 1057 // This will cause an empty database to be created. | 1102 // This will cause an empty database to be created. |
| 1058 std::vector<SBListChunkRanges> lists; | 1103 std::vector<SBListChunkRanges> lists; |
| 1059 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1104 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1060 database_->UpdateFinished(true); | 1105 database_->UpdateFinished(true); |
| 1061 | 1106 |
| 1062 // Create a sub chunk to insert. | 1107 // Create a sub chunk to insert. |
| 1063 ScopedVector<SBChunkData> chunks; | 1108 ScopedVector<SBChunkData> chunks; |
| 1064 chunks.push_back(SubChunkPrefixValue(7, | 1109 chunks.push_back(SubChunkPrefixValue(7, |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1099 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1144 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1100 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 1145 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); |
| 1101 database_->UpdateFinished(true); | 1146 database_->UpdateFinished(true); |
| 1102 EXPECT_TRUE(base::PathExists(database_filename_)); | 1147 EXPECT_TRUE(base::PathExists(database_filename_)); |
| 1103 | 1148 |
| 1104 database_.reset(); | 1149 database_.reset(); |
| 1105 } | 1150 } |
| 1106 | 1151 |
| 1107 // Checks database reading and writing. | 1152 // Checks database reading and writing. |
| 1108 TEST_F(SafeBrowsingDatabaseTest, ContainsDownloadUrl) { | 1153 TEST_F(SafeBrowsingDatabaseTest, ContainsDownloadUrl) { |
| 1109 database_.reset(); | |
| 1110 base::MessageLoop loop; | |
| 1111 SafeBrowsingStoreFile* browse_store = new SafeBrowsingStoreFile(); | |
| 1112 SafeBrowsingStoreFile* download_store = new SafeBrowsingStoreFile(); | |
| 1113 SafeBrowsingStoreFile* csd_whitelist_store = new SafeBrowsingStoreFile(); | |
| 1114 database_.reset(new SafeBrowsingDatabaseNew(browse_store, | |
| 1115 download_store, | |
| 1116 csd_whitelist_store, | |
| 1117 NULL, | |
| 1118 NULL, | |
| 1119 NULL, | |
| 1120 NULL)); | |
| 1121 database_->Init(database_filename_); | |
| 1122 | |
| 1123 const char kEvil1Url1[] = "www.evil1.com/download1/"; | 1154 const char kEvil1Url1[] = "www.evil1.com/download1/"; |
| 1124 const char kEvil1Url2[] = "www.evil1.com/download2.html"; | 1155 const char kEvil1Url2[] = "www.evil1.com/download2.html"; |
| 1125 | 1156 |
| 1126 // Add a simple chunk with one hostkey for download url list. | 1157 // Add a simple chunk with one hostkey for download url list. |
| 1127 ScopedVector<SBChunkData> chunks; | 1158 ScopedVector<SBChunkData> chunks; |
| 1128 chunks.push_back(AddChunkPrefix2Value(1, kEvil1Url1, kEvil1Url2)); | 1159 chunks.push_back(AddChunkPrefix2Value(1, kEvil1Url1, kEvil1Url2)); |
| 1129 | 1160 |
| 1130 std::vector<SBListChunkRanges> lists; | 1161 std::vector<SBListChunkRanges> lists; |
| 1131 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1162 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1132 database_->InsertChunks(safe_browsing_util::kBinUrlList, chunks.get()); | 1163 database_->InsertChunks(safe_browsing_util::kBinUrlList, chunks.get()); |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1210 TEST_F(SafeBrowsingDatabaseTest, Whitelists) { | 1241 TEST_F(SafeBrowsingDatabaseTest, Whitelists) { |
| 1211 database_.reset(); | 1242 database_.reset(); |
| 1212 | 1243 |
| 1213 // We expect all calls to ContainsCsdWhitelistedUrl in particular to be made | 1244 // We expect all calls to ContainsCsdWhitelistedUrl in particular to be made |
| 1214 // from the IO thread. In general the whitelist lookups are thread-safe. | 1245 // from the IO thread. In general the whitelist lookups are thread-safe. |
| 1215 content::TestBrowserThreadBundle thread_bundle_; | 1246 content::TestBrowserThreadBundle thread_bundle_; |
| 1216 | 1247 |
| 1217 // If the whitelist is disabled everything should match the whitelist. | 1248 // If the whitelist is disabled everything should match the whitelist. |
| 1218 database_.reset(new SafeBrowsingDatabaseNew(new SafeBrowsingStoreFile(), | 1249 database_.reset(new SafeBrowsingDatabaseNew(new SafeBrowsingStoreFile(), |
| 1219 NULL, NULL, NULL, NULL, NULL, | 1250 NULL, NULL, NULL, NULL, NULL, |
| 1220 NULL)); | 1251 NULL, NULL)); |
| 1221 database_->Init(database_filename_); | 1252 database_->Init(database_filename_); |
| 1222 EXPECT_TRUE(database_->ContainsDownloadWhitelistedUrl( | 1253 EXPECT_TRUE(database_->ContainsDownloadWhitelistedUrl( |
| 1223 GURL(std::string("http://www.phishing.com/")))); | 1254 GURL(std::string("http://www.phishing.com/")))); |
| 1224 EXPECT_TRUE(database_->ContainsDownloadWhitelistedUrl( | 1255 EXPECT_TRUE(database_->ContainsDownloadWhitelistedUrl( |
| 1225 GURL(std::string("http://www.phishing.com/")))); | 1256 GURL(std::string("http://www.phishing.com/")))); |
| 1226 EXPECT_TRUE(database_->ContainsDownloadWhitelistedString("asdf")); | 1257 EXPECT_TRUE(database_->ContainsDownloadWhitelistedString("asdf")); |
| 1227 | 1258 |
| 1228 SafeBrowsingStoreFile* browse_store = new SafeBrowsingStoreFile(); | 1259 ResetAndReloadFullDatabase(); |
| 1229 SafeBrowsingStoreFile* csd_whitelist_store = new SafeBrowsingStoreFile(); | |
| 1230 SafeBrowsingStoreFile* download_whitelist_store = new SafeBrowsingStoreFile(); | |
| 1231 SafeBrowsingStoreFile* extension_blacklist_store = | |
| 1232 new SafeBrowsingStoreFile(); | |
| 1233 database_.reset(new SafeBrowsingDatabaseNew(browse_store, NULL, | |
| 1234 csd_whitelist_store, | |
| 1235 download_whitelist_store, | |
| 1236 extension_blacklist_store, | |
| 1237 NULL, NULL)); | |
| 1238 database_->Init(database_filename_); | |
| 1239 | 1260 |
| 1240 const char kGood1Host[] = "www.good1.com/"; | 1261 const char kGood1Host[] = "www.good1.com/"; |
| 1241 const char kGood1Url1[] = "www.good1.com/a/b.html"; | 1262 const char kGood1Url1[] = "www.good1.com/a/b.html"; |
| 1242 const char kGood1Url2[] = "www.good1.com/b/"; | 1263 const char kGood1Url2[] = "www.good1.com/b/"; |
| 1243 | 1264 |
| 1244 const char kGood2Url1[] = "www.good2.com/c"; // Should match '/c/bla'. | 1265 const char kGood2Url1[] = "www.good2.com/c"; // Should match '/c/bla'. |
| 1245 | 1266 |
| 1246 // good3.com/a/b/c/d/e/f/g/ should match because it's a whitelist. | 1267 // good3.com/a/b/c/d/e/f/g/ should match because it's a whitelist. |
| 1247 const char kGood3Url1[] = "good3.com/"; | 1268 const char kGood3Url1[] = "good3.com/"; |
| 1248 | 1269 |
| (...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1428 chunks.clear(); | 1449 chunks.clear(); |
| 1429 chunks.push_back(AddChunkPrefix2Value(47, | 1450 chunks.push_back(AddChunkPrefix2Value(47, |
| 1430 "www.evil.com/phishing1.html", | 1451 "www.evil.com/phishing1.html", |
| 1431 "www.evil.com/phishing2.html")); | 1452 "www.evil.com/phishing2.html")); |
| 1432 | 1453 |
| 1433 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1454 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1434 database_->InsertChunks(safe_browsing_util::kPhishingList, chunks.get()); | 1455 database_->InsertChunks(safe_browsing_util::kPhishingList, chunks.get()); |
| 1435 database_->UpdateFinished(true); | 1456 database_->UpdateFinished(true); |
| 1436 | 1457 |
| 1437 GetListsInfo(&lists); | 1458 GetListsInfo(&lists); |
| 1438 ASSERT_EQ(2U, lists.size()); | 1459 ASSERT_LE(2U, lists.size()); |
| 1439 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); | 1460 EXPECT_EQ(safe_browsing_util::kMalwareList, lists[0].name); |
| 1440 EXPECT_EQ("1", lists[0].adds); | 1461 EXPECT_EQ("1", lists[0].adds); |
| 1441 EXPECT_TRUE(lists[0].subs.empty()); | 1462 EXPECT_TRUE(lists[0].subs.empty()); |
| 1442 EXPECT_EQ(safe_browsing_util::kPhishingList, lists[1].name); | 1463 EXPECT_EQ(safe_browsing_util::kPhishingList, lists[1].name); |
| 1443 EXPECT_EQ("47", lists[1].adds); | 1464 EXPECT_EQ("47", lists[1].adds); |
| 1444 EXPECT_TRUE(lists[1].subs.empty()); | 1465 EXPECT_TRUE(lists[1].subs.empty()); |
| 1445 | 1466 |
| 1446 std::vector<SBPrefix> prefix_hits; | 1467 std::vector<SBPrefix> prefix_hits; |
| 1447 std::vector<SBFullHashResult> cache_hits; | 1468 std::vector<SBFullHashResult> cache_hits; |
| 1448 | 1469 |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1556 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); | 1577 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); |
| 1557 EXPECT_FALSE(database_->ContainsBrowseUrl( | 1578 EXPECT_FALSE(database_->ContainsBrowseUrl( |
| 1558 GURL("http://www.good.com/goodware.html"), &prefix_hits, &cache_hits)); | 1579 GURL("http://www.good.com/goodware.html"), &prefix_hits, &cache_hits)); |
| 1559 | 1580 |
| 1560 base::FilePath filter_file = database_->PrefixSetForFilename( | 1581 base::FilePath filter_file = database_->PrefixSetForFilename( |
| 1561 database_->BrowseDBFilename(database_filename_)); | 1582 database_->BrowseDBFilename(database_filename_)); |
| 1562 | 1583 |
| 1563 // After re-creating the database, it should have a filter read from | 1584 // After re-creating the database, it should have a filter read from |
| 1564 // a file, so it should find the same results. | 1585 // a file, so it should find the same results. |
| 1565 ASSERT_TRUE(base::PathExists(filter_file)); | 1586 ASSERT_TRUE(base::PathExists(filter_file)); |
| 1566 database_.reset(new SafeBrowsingDatabaseNew); | 1587 ResetAndReloadFullDatabase(); |
| 1567 database_->Init(database_filename_); | |
| 1568 EXPECT_TRUE(database_->ContainsBrowseUrl( | 1588 EXPECT_TRUE(database_->ContainsBrowseUrl( |
| 1569 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); | 1589 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); |
| 1570 EXPECT_FALSE(database_->ContainsBrowseUrl( | 1590 EXPECT_FALSE(database_->ContainsBrowseUrl( |
| 1571 GURL("http://www.good.com/goodware.html"), &prefix_hits, &cache_hits)); | 1591 GURL("http://www.good.com/goodware.html"), &prefix_hits, &cache_hits)); |
| 1572 | 1592 |
| 1573 // If there is no filter file, the database cannot find malware urls. | 1593 // If there is no filter file, the database cannot find malware urls. |
| 1574 base::DeleteFile(filter_file, false); | 1594 base::DeleteFile(filter_file, false); |
| 1575 ASSERT_FALSE(base::PathExists(filter_file)); | 1595 ASSERT_FALSE(base::PathExists(filter_file)); |
| 1576 database_.reset(new SafeBrowsingDatabaseNew); | 1596 ResetAndReloadFullDatabase(); |
| 1577 database_->Init(database_filename_); | |
| 1578 EXPECT_FALSE(database_->ContainsBrowseUrl( | 1597 EXPECT_FALSE(database_->ContainsBrowseUrl( |
| 1579 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); | 1598 GURL("http://www.evil.com/malware.html"), &prefix_hits, &cache_hits)); |
| 1580 EXPECT_FALSE(database_->ContainsBrowseUrl( | 1599 EXPECT_FALSE(database_->ContainsBrowseUrl( |
| 1581 GURL("http://www.good.com/goodware.html"), &prefix_hits, &cache_hits)); | 1600 GURL("http://www.good.com/goodware.html"), &prefix_hits, &cache_hits)); |
| 1582 } | 1601 } |
| 1583 | 1602 |
| 1584 TEST_F(SafeBrowsingDatabaseTest, CachedFullMiss) { | 1603 TEST_F(SafeBrowsingDatabaseTest, CachedFullMiss) { |
| 1585 const SBPrefix kPrefix1 = 1001U; | 1604 const SBPrefix kPrefix1 = 1001U; |
| 1586 const SBFullHash kFullHash1_1 = | 1605 const SBFullHash kFullHash1_1 = |
| 1587 SBFullHashForPrefixAndSuffix(kPrefix1, "\x01"); | 1606 SBFullHashForPrefixAndSuffix(kPrefix1, "\x01"); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1606 std::vector<SBFullHashResult> cache_results; | 1625 std::vector<SBFullHashResult> cache_results; |
| 1607 database_->CacheHashResults(prefixes, cache_results, kCacheLifetime); | 1626 database_->CacheHashResults(prefixes, cache_results, kCacheLifetime); |
| 1608 } | 1627 } |
| 1609 | 1628 |
| 1610 { | 1629 { |
| 1611 // kFullHash1_1 gets no prefix hit because of the cached item, and also does | 1630 // kFullHash1_1 gets no prefix hit because of the cached item, and also does |
| 1612 // not have a cache hit. | 1631 // not have a cache hit. |
| 1613 std::vector<SBFullHash> full_hashes(1, kFullHash1_1); | 1632 std::vector<SBFullHash> full_hashes(1, kFullHash1_1); |
| 1614 std::vector<SBPrefix> prefix_hits; | 1633 std::vector<SBPrefix> prefix_hits; |
| 1615 std::vector<SBFullHashResult> cache_hits; | 1634 std::vector<SBFullHashResult> cache_hits; |
| 1616 EXPECT_FALSE(database_->ContainsBrowseUrlHashes( | 1635 EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting( |
| 1617 full_hashes, &prefix_hits, &cache_hits)); | 1636 full_hashes, &prefix_hits, &cache_hits)); |
| 1618 | 1637 |
| 1619 // kFullHash2_1 gets a hit from the prefix in the database. | 1638 // kFullHash2_1 gets a hit from the prefix in the database. |
| 1620 full_hashes.push_back(kFullHash2_1); | 1639 full_hashes.push_back(kFullHash2_1); |
| 1621 prefix_hits.clear(); | 1640 prefix_hits.clear(); |
| 1622 cache_hits.clear(); | 1641 cache_hits.clear(); |
| 1623 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1642 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1624 full_hashes, &prefix_hits, &cache_hits)); | 1643 full_hashes, &prefix_hits, &cache_hits)); |
| 1625 ASSERT_EQ(1U, prefix_hits.size()); | 1644 ASSERT_EQ(1U, prefix_hits.size()); |
| 1626 EXPECT_EQ(kPrefix2, prefix_hits[0]); | 1645 EXPECT_EQ(kPrefix2, prefix_hits[0]); |
| 1627 EXPECT_TRUE(cache_hits.empty()); | 1646 EXPECT_TRUE(cache_hits.empty()); |
| 1628 } | 1647 } |
| 1629 } | 1648 } |
| 1630 | 1649 |
| 1631 TEST_F(SafeBrowsingDatabaseTest, CachedPrefixHitFullMiss) { | 1650 TEST_F(SafeBrowsingDatabaseTest, CachedPrefixHitFullMiss) { |
| 1632 const SBPrefix kPrefix1 = 1001U; | 1651 const SBPrefix kPrefix1 = 1001U; |
| 1633 const SBFullHash kFullHash1_1 = | 1652 const SBFullHash kFullHash1_1 = |
| (...skipping 20 matching lines...) Expand all Loading... |
| 1654 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1673 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1655 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 1674 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); |
| 1656 database_->UpdateFinished(true); | 1675 database_->UpdateFinished(true); |
| 1657 | 1676 |
| 1658 { | 1677 { |
| 1659 // kFullHash1_1 has a prefix hit of kPrefix1. | 1678 // kFullHash1_1 has a prefix hit of kPrefix1. |
| 1660 std::vector<SBFullHash> full_hashes; | 1679 std::vector<SBFullHash> full_hashes; |
| 1661 full_hashes.push_back(kFullHash1_1); | 1680 full_hashes.push_back(kFullHash1_1); |
| 1662 std::vector<SBPrefix> prefix_hits; | 1681 std::vector<SBPrefix> prefix_hits; |
| 1663 std::vector<SBFullHashResult> cache_hits; | 1682 std::vector<SBFullHashResult> cache_hits; |
| 1664 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1683 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1665 full_hashes, &prefix_hits, &cache_hits)); | 1684 full_hashes, &prefix_hits, &cache_hits)); |
| 1666 ASSERT_EQ(1U, prefix_hits.size()); | 1685 ASSERT_EQ(1U, prefix_hits.size()); |
| 1667 EXPECT_EQ(kPrefix1, prefix_hits[0]); | 1686 EXPECT_EQ(kPrefix1, prefix_hits[0]); |
| 1668 EXPECT_TRUE(cache_hits.empty()); | 1687 EXPECT_TRUE(cache_hits.empty()); |
| 1669 | 1688 |
| 1670 // kFullHash2_1 has a prefix hit of kPrefix2. | 1689 // kFullHash2_1 has a prefix hit of kPrefix2. |
| 1671 full_hashes.push_back(kFullHash2_1); | 1690 full_hashes.push_back(kFullHash2_1); |
| 1672 prefix_hits.clear(); | 1691 prefix_hits.clear(); |
| 1673 cache_hits.clear(); | 1692 cache_hits.clear(); |
| 1674 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1693 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1675 full_hashes, &prefix_hits, &cache_hits)); | 1694 full_hashes, &prefix_hits, &cache_hits)); |
| 1676 ASSERT_EQ(2U, prefix_hits.size()); | 1695 ASSERT_EQ(2U, prefix_hits.size()); |
| 1677 EXPECT_EQ(kPrefix1, prefix_hits[0]); | 1696 EXPECT_EQ(kPrefix1, prefix_hits[0]); |
| 1678 EXPECT_EQ(kPrefix2, prefix_hits[1]); | 1697 EXPECT_EQ(kPrefix2, prefix_hits[1]); |
| 1679 EXPECT_TRUE(cache_hits.empty()); | 1698 EXPECT_TRUE(cache_hits.empty()); |
| 1680 | 1699 |
| 1681 // kFullHash3_1 has no hits. | 1700 // kFullHash3_1 has no hits. |
| 1682 full_hashes.push_back(kFullHash3_1); | 1701 full_hashes.push_back(kFullHash3_1); |
| 1683 prefix_hits.clear(); | 1702 prefix_hits.clear(); |
| 1684 cache_hits.clear(); | 1703 cache_hits.clear(); |
| 1685 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1704 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1686 full_hashes, &prefix_hits, &cache_hits)); | 1705 full_hashes, &prefix_hits, &cache_hits)); |
| 1687 ASSERT_EQ(2U, prefix_hits.size()); | 1706 ASSERT_EQ(2U, prefix_hits.size()); |
| 1688 EXPECT_EQ(kPrefix1, prefix_hits[0]); | 1707 EXPECT_EQ(kPrefix1, prefix_hits[0]); |
| 1689 EXPECT_EQ(kPrefix2, prefix_hits[1]); | 1708 EXPECT_EQ(kPrefix2, prefix_hits[1]); |
| 1690 EXPECT_TRUE(cache_hits.empty()); | 1709 EXPECT_TRUE(cache_hits.empty()); |
| 1691 } | 1710 } |
| 1692 | 1711 |
| 1693 { | 1712 { |
| 1694 // Cache a fullhash result for two kPrefix1 full hashes. | 1713 // Cache a fullhash result for two kPrefix1 full hashes. |
| 1695 std::vector<SBPrefix> prefixes(1, kPrefix1); | 1714 std::vector<SBPrefix> prefixes(1, kPrefix1); |
| 1696 std::vector<SBFullHashResult> cache_results; | 1715 std::vector<SBFullHashResult> cache_results; |
| 1697 | 1716 |
| 1698 SBFullHashResult full_hash_result; | 1717 SBFullHashResult full_hash_result; |
| 1699 full_hash_result.list_id = safe_browsing_util::MALWARE; | 1718 full_hash_result.list_id = safe_browsing_util::MALWARE; |
| 1700 | 1719 |
| 1701 full_hash_result.hash = kFullHash1_1; | 1720 full_hash_result.hash = kFullHash1_1; |
| 1702 cache_results.push_back(full_hash_result); | 1721 cache_results.push_back(full_hash_result); |
| 1703 | 1722 |
| 1704 full_hash_result.hash = kFullHash1_3; | 1723 full_hash_result.hash = kFullHash1_3; |
| 1705 cache_results.push_back(full_hash_result); | 1724 cache_results.push_back(full_hash_result); |
| 1706 | 1725 |
| 1707 database_->CacheHashResults(prefixes, cache_results, kCacheLifetime); | 1726 database_->CacheHashResults(prefixes, cache_results, kCacheLifetime); |
| 1708 } | 1727 } |
| 1709 | 1728 |
| 1710 { | 1729 { |
| 1711 // kFullHash1_1 should now see a cache hit. | 1730 // kFullHash1_1 should now see a cache hit. |
| 1712 std::vector<SBFullHash> full_hashes(1, kFullHash1_1); | 1731 std::vector<SBFullHash> full_hashes(1, kFullHash1_1); |
| 1713 std::vector<SBPrefix> prefix_hits; | 1732 std::vector<SBPrefix> prefix_hits; |
| 1714 std::vector<SBFullHashResult> cache_hits; | 1733 std::vector<SBFullHashResult> cache_hits; |
| 1715 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1734 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1716 full_hashes, &prefix_hits, &cache_hits)); | 1735 full_hashes, &prefix_hits, &cache_hits)); |
| 1717 EXPECT_TRUE(prefix_hits.empty()); | 1736 EXPECT_TRUE(prefix_hits.empty()); |
| 1718 ASSERT_EQ(1U, cache_hits.size()); | 1737 ASSERT_EQ(1U, cache_hits.size()); |
| 1719 EXPECT_TRUE(SBFullHashEqual(kFullHash1_1, cache_hits[0].hash)); | 1738 EXPECT_TRUE(SBFullHashEqual(kFullHash1_1, cache_hits[0].hash)); |
| 1720 | 1739 |
| 1721 // Adding kFullHash2_1 will see the existing cache hit plus the prefix hit | 1740 // Adding kFullHash2_1 will see the existing cache hit plus the prefix hit |
| 1722 // for kPrefix2. | 1741 // for kPrefix2. |
| 1723 full_hashes.push_back(kFullHash2_1); | 1742 full_hashes.push_back(kFullHash2_1); |
| 1724 prefix_hits.clear(); | 1743 prefix_hits.clear(); |
| 1725 cache_hits.clear(); | 1744 cache_hits.clear(); |
| 1726 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1745 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1727 full_hashes, &prefix_hits, &cache_hits)); | 1746 full_hashes, &prefix_hits, &cache_hits)); |
| 1728 ASSERT_EQ(1U, prefix_hits.size()); | 1747 ASSERT_EQ(1U, prefix_hits.size()); |
| 1729 EXPECT_EQ(kPrefix2, prefix_hits[0]); | 1748 EXPECT_EQ(kPrefix2, prefix_hits[0]); |
| 1730 ASSERT_EQ(1U, cache_hits.size()); | 1749 ASSERT_EQ(1U, cache_hits.size()); |
| 1731 EXPECT_TRUE(SBFullHashEqual(kFullHash1_1, cache_hits[0].hash)); | 1750 EXPECT_TRUE(SBFullHashEqual(kFullHash1_1, cache_hits[0].hash)); |
| 1732 | 1751 |
| 1733 // kFullHash1_3 also gets a cache hit. | 1752 // kFullHash1_3 also gets a cache hit. |
| 1734 full_hashes.push_back(kFullHash1_3); | 1753 full_hashes.push_back(kFullHash1_3); |
| 1735 prefix_hits.clear(); | 1754 prefix_hits.clear(); |
| 1736 cache_hits.clear(); | 1755 cache_hits.clear(); |
| 1737 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1756 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1738 full_hashes, &prefix_hits, &cache_hits)); | 1757 full_hashes, &prefix_hits, &cache_hits)); |
| 1739 ASSERT_EQ(1U, prefix_hits.size()); | 1758 ASSERT_EQ(1U, prefix_hits.size()); |
| 1740 EXPECT_EQ(kPrefix2, prefix_hits[0]); | 1759 EXPECT_EQ(kPrefix2, prefix_hits[0]); |
| 1741 ASSERT_EQ(2U, cache_hits.size()); | 1760 ASSERT_EQ(2U, cache_hits.size()); |
| 1742 EXPECT_TRUE(SBFullHashEqual(kFullHash1_1, cache_hits[0].hash)); | 1761 EXPECT_TRUE(SBFullHashEqual(kFullHash1_1, cache_hits[0].hash)); |
| 1743 EXPECT_TRUE(SBFullHashEqual(kFullHash1_3, cache_hits[1].hash)); | 1762 EXPECT_TRUE(SBFullHashEqual(kFullHash1_3, cache_hits[1].hash)); |
| 1744 } | 1763 } |
| 1745 | 1764 |
| 1746 { | 1765 { |
| 1747 // Check if DB contains only kFullHash1_3. Should return a cache hit. | 1766 // Check if DB contains only kFullHash1_3. Should return a cache hit. |
| 1748 std::vector<SBFullHash> full_hashes(1, kFullHash1_3); | 1767 std::vector<SBFullHash> full_hashes(1, kFullHash1_3); |
| 1749 std::vector<SBPrefix> prefix_hits; | 1768 std::vector<SBPrefix> prefix_hits; |
| 1750 std::vector<SBFullHashResult> cache_hits; | 1769 std::vector<SBFullHashResult> cache_hits; |
| 1751 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1770 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1752 full_hashes, &prefix_hits, &cache_hits)); | 1771 full_hashes, &prefix_hits, &cache_hits)); |
| 1753 EXPECT_TRUE(prefix_hits.empty()); | 1772 EXPECT_TRUE(prefix_hits.empty()); |
| 1754 ASSERT_EQ(1U, cache_hits.size()); | 1773 ASSERT_EQ(1U, cache_hits.size()); |
| 1755 EXPECT_TRUE(SBFullHashEqual(kFullHash1_3, cache_hits[0].hash)); | 1774 EXPECT_TRUE(SBFullHashEqual(kFullHash1_3, cache_hits[0].hash)); |
| 1756 } | 1775 } |
| 1757 | 1776 |
| 1758 { | 1777 { |
| 1759 // kFullHash1_2 has no cache hit, and no prefix hit because of the cache for | 1778 // kFullHash1_2 has no cache hit, and no prefix hit because of the cache for |
| 1760 // kPrefix1. | 1779 // kPrefix1. |
| 1761 std::vector<SBFullHash> full_hashes(1, kFullHash1_2); | 1780 std::vector<SBFullHash> full_hashes(1, kFullHash1_2); |
| 1762 std::vector<SBPrefix> prefix_hits; | 1781 std::vector<SBPrefix> prefix_hits; |
| 1763 std::vector<SBFullHashResult> cache_hits; | 1782 std::vector<SBFullHashResult> cache_hits; |
| 1764 EXPECT_FALSE(database_->ContainsBrowseUrlHashes( | 1783 EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting( |
| 1765 full_hashes, &prefix_hits, &cache_hits)); | 1784 full_hashes, &prefix_hits, &cache_hits)); |
| 1766 | 1785 |
| 1767 // Other prefix hits possible when kFullHash1_2 hits nothing. | 1786 // Other prefix hits possible when kFullHash1_2 hits nothing. |
| 1768 full_hashes.push_back(kFullHash2_1); | 1787 full_hashes.push_back(kFullHash2_1); |
| 1769 prefix_hits.clear(); | 1788 prefix_hits.clear(); |
| 1770 cache_hits.clear(); | 1789 cache_hits.clear(); |
| 1771 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1790 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1772 full_hashes, &prefix_hits, &cache_hits)); | 1791 full_hashes, &prefix_hits, &cache_hits)); |
| 1773 ASSERT_EQ(1U, prefix_hits.size()); | 1792 ASSERT_EQ(1U, prefix_hits.size()); |
| 1774 EXPECT_EQ(kPrefix2, prefix_hits[0]); | 1793 EXPECT_EQ(kPrefix2, prefix_hits[0]); |
| 1775 EXPECT_TRUE(cache_hits.empty()); | 1794 EXPECT_TRUE(cache_hits.empty()); |
| 1776 } | 1795 } |
| 1777 } | 1796 } |
| 1778 | 1797 |
| 1779 TEST_F(SafeBrowsingDatabaseTest, BrowseFullHashMatching) { | 1798 TEST_F(SafeBrowsingDatabaseTest, BrowseFullHashMatching) { |
| 1780 const SBPrefix kPrefix1 = 1001U; | 1799 const SBPrefix kPrefix1 = 1001U; |
| 1781 const SBFullHash kFullHash1_1 = | 1800 const SBFullHash kFullHash1_1 = |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1793 std::vector<SBListChunkRanges> lists; | 1812 std::vector<SBListChunkRanges> lists; |
| 1794 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1813 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1795 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 1814 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); |
| 1796 database_->UpdateFinished(true); | 1815 database_->UpdateFinished(true); |
| 1797 | 1816 |
| 1798 { | 1817 { |
| 1799 // Check a full hash which isn't present. | 1818 // Check a full hash which isn't present. |
| 1800 std::vector<SBFullHash> full_hashes(1, kFullHash1_3); | 1819 std::vector<SBFullHash> full_hashes(1, kFullHash1_3); |
| 1801 std::vector<SBPrefix> prefix_hits; | 1820 std::vector<SBPrefix> prefix_hits; |
| 1802 std::vector<SBFullHashResult> cache_hits; | 1821 std::vector<SBFullHashResult> cache_hits; |
| 1803 EXPECT_FALSE(database_->ContainsBrowseUrlHashes( | 1822 EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting( |
| 1804 full_hashes, &prefix_hits, &cache_hits)); | 1823 full_hashes, &prefix_hits, &cache_hits)); |
| 1805 | 1824 |
| 1806 // Also one which is present, should have a prefix hit. | 1825 // Also one which is present, should have a prefix hit. |
| 1807 full_hashes.push_back(kFullHash1_1); | 1826 full_hashes.push_back(kFullHash1_1); |
| 1808 prefix_hits.clear(); | 1827 prefix_hits.clear(); |
| 1809 cache_hits.clear(); | 1828 cache_hits.clear(); |
| 1810 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1829 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1811 full_hashes, &prefix_hits, &cache_hits)); | 1830 full_hashes, &prefix_hits, &cache_hits)); |
| 1812 ASSERT_EQ(1U, prefix_hits.size()); | 1831 ASSERT_EQ(1U, prefix_hits.size()); |
| 1813 EXPECT_EQ(kPrefix1, prefix_hits[0]); | 1832 EXPECT_EQ(kPrefix1, prefix_hits[0]); |
| 1814 EXPECT_TRUE(cache_hits.empty()); | 1833 EXPECT_TRUE(cache_hits.empty()); |
| 1815 | 1834 |
| 1816 // Two full hash matches with the same prefix should return one prefix hit. | 1835 // Two full hash matches with the same prefix should return one prefix hit. |
| 1817 full_hashes.push_back(kFullHash1_2); | 1836 full_hashes.push_back(kFullHash1_2); |
| 1818 prefix_hits.clear(); | 1837 prefix_hits.clear(); |
| 1819 cache_hits.clear(); | 1838 cache_hits.clear(); |
| 1820 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1839 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1821 full_hashes, &prefix_hits, &cache_hits)); | 1840 full_hashes, &prefix_hits, &cache_hits)); |
| 1822 ASSERT_EQ(1U, prefix_hits.size()); | 1841 ASSERT_EQ(1U, prefix_hits.size()); |
| 1823 EXPECT_EQ(kPrefix1, prefix_hits[0]); | 1842 EXPECT_EQ(kPrefix1, prefix_hits[0]); |
| 1824 EXPECT_TRUE(cache_hits.empty()); | 1843 EXPECT_TRUE(cache_hits.empty()); |
| 1825 } | 1844 } |
| 1826 | 1845 |
| 1827 { | 1846 { |
| 1828 // Cache a gethash result for kFullHash1_2. | 1847 // Cache a gethash result for kFullHash1_2. |
| 1829 SBFullHashResult full_hash_result; | 1848 SBFullHashResult full_hash_result; |
| 1830 full_hash_result.list_id = safe_browsing_util::MALWARE; | 1849 full_hash_result.list_id = safe_browsing_util::MALWARE; |
| 1831 full_hash_result.hash = kFullHash1_2; | 1850 full_hash_result.hash = kFullHash1_2; |
| 1832 | 1851 |
| 1833 std::vector<SBPrefix> prefixes(1, kPrefix1); | 1852 std::vector<SBPrefix> prefixes(1, kPrefix1); |
| 1834 std::vector<SBFullHashResult> cache_results(1, full_hash_result); | 1853 std::vector<SBFullHashResult> cache_results(1, full_hash_result); |
| 1835 | 1854 |
| 1836 database_->CacheHashResults(prefixes, cache_results, kCacheLifetime); | 1855 database_->CacheHashResults(prefixes, cache_results, kCacheLifetime); |
| 1837 } | 1856 } |
| 1838 | 1857 |
| 1839 { | 1858 { |
| 1840 // kFullHash1_3 should still return false, because the cached | 1859 // kFullHash1_3 should still return false, because the cached |
| 1841 // result for kPrefix1 doesn't contain kFullHash1_3. | 1860 // result for kPrefix1 doesn't contain kFullHash1_3. |
| 1842 std::vector<SBFullHash> full_hashes(1, kFullHash1_3); | 1861 std::vector<SBFullHash> full_hashes(1, kFullHash1_3); |
| 1843 std::vector<SBPrefix> prefix_hits; | 1862 std::vector<SBPrefix> prefix_hits; |
| 1844 std::vector<SBFullHashResult> cache_hits; | 1863 std::vector<SBFullHashResult> cache_hits; |
| 1845 EXPECT_FALSE(database_->ContainsBrowseUrlHashes( | 1864 EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting( |
| 1846 full_hashes, &prefix_hits, &cache_hits)); | 1865 full_hashes, &prefix_hits, &cache_hits)); |
| 1847 | 1866 |
| 1848 // kFullHash1_1 is also not in the cached result, which takes | 1867 // kFullHash1_1 is also not in the cached result, which takes |
| 1849 // priority over the database. | 1868 // priority over the database. |
| 1850 prefix_hits.clear(); | 1869 prefix_hits.clear(); |
| 1851 full_hashes.push_back(kFullHash1_1); | 1870 full_hashes.push_back(kFullHash1_1); |
| 1852 cache_hits.clear(); | 1871 cache_hits.clear(); |
| 1853 EXPECT_FALSE(database_->ContainsBrowseUrlHashes( | 1872 EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting( |
| 1854 full_hashes, &prefix_hits, &cache_hits)); | 1873 full_hashes, &prefix_hits, &cache_hits)); |
| 1855 | 1874 |
| 1856 // kFullHash1_2 is in the cached result. | 1875 // kFullHash1_2 is in the cached result. |
| 1857 full_hashes.push_back(kFullHash1_2); | 1876 full_hashes.push_back(kFullHash1_2); |
| 1858 prefix_hits.clear(); | 1877 prefix_hits.clear(); |
| 1859 cache_hits.clear(); | 1878 cache_hits.clear(); |
| 1860 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1879 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1861 full_hashes, &prefix_hits, &cache_hits)); | 1880 full_hashes, &prefix_hits, &cache_hits)); |
| 1862 EXPECT_TRUE(prefix_hits.empty()); | 1881 EXPECT_TRUE(prefix_hits.empty()); |
| 1863 ASSERT_EQ(1U, cache_hits.size()); | 1882 ASSERT_EQ(1U, cache_hits.size()); |
| 1864 EXPECT_TRUE(SBFullHashEqual(kFullHash1_2, cache_hits[0].hash)); | 1883 EXPECT_TRUE(SBFullHashEqual(kFullHash1_2, cache_hits[0].hash)); |
| 1865 } | 1884 } |
| 1866 | 1885 |
| 1867 // Remove kFullHash1_1 from the database. | 1886 // Remove kFullHash1_1 from the database. |
| 1868 chunks.clear(); | 1887 chunks.clear(); |
| 1869 chunks.push_back(SubChunkFullHash(11, kFullHash1_1, 1)); | 1888 chunks.push_back(SubChunkFullHash(11, kFullHash1_1, 1)); |
| 1870 | 1889 |
| 1871 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1890 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1872 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 1891 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); |
| 1873 database_->UpdateFinished(true); | 1892 database_->UpdateFinished(true); |
| 1874 | 1893 |
| 1875 // Cache should be cleared after updating. | 1894 // Cache should be cleared after updating. |
| 1876 EXPECT_TRUE(database_->browse_gethash_cache_.empty()); | 1895 EXPECT_TRUE(database_->prefix_gethash_cache_.empty()); |
| 1877 | 1896 |
| 1878 { | 1897 { |
| 1879 // Now the database doesn't contain kFullHash1_1. | 1898 // Now the database doesn't contain kFullHash1_1. |
| 1880 std::vector<SBFullHash> full_hashes(1, kFullHash1_1); | 1899 std::vector<SBFullHash> full_hashes(1, kFullHash1_1); |
| 1881 std::vector<SBPrefix> prefix_hits; | 1900 std::vector<SBPrefix> prefix_hits; |
| 1882 std::vector<SBFullHashResult> cache_hits; | 1901 std::vector<SBFullHashResult> cache_hits; |
| 1883 EXPECT_FALSE(database_->ContainsBrowseUrlHashes( | 1902 EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting( |
| 1884 full_hashes, &prefix_hits, &cache_hits)); | 1903 full_hashes, &prefix_hits, &cache_hits)); |
| 1885 | 1904 |
| 1886 // Nor kFullHash1_3. | 1905 // Nor kFullHash1_3. |
| 1887 full_hashes.push_back(kFullHash1_3); | 1906 full_hashes.push_back(kFullHash1_3); |
| 1888 prefix_hits.clear(); | 1907 prefix_hits.clear(); |
| 1889 cache_hits.clear(); | 1908 cache_hits.clear(); |
| 1890 EXPECT_FALSE(database_->ContainsBrowseUrlHashes( | 1909 EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting( |
| 1891 full_hashes, &prefix_hits, &cache_hits)); | 1910 full_hashes, &prefix_hits, &cache_hits)); |
| 1892 | 1911 |
| 1893 // Still has kFullHash1_2. | 1912 // Still has kFullHash1_2. |
| 1894 full_hashes.push_back(kFullHash1_2); | 1913 full_hashes.push_back(kFullHash1_2); |
| 1895 prefix_hits.clear(); | 1914 prefix_hits.clear(); |
| 1896 cache_hits.clear(); | 1915 cache_hits.clear(); |
| 1897 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1916 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1898 full_hashes, &prefix_hits, &cache_hits)); | 1917 full_hashes, &prefix_hits, &cache_hits)); |
| 1899 ASSERT_EQ(1U, prefix_hits.size()); | 1918 ASSERT_EQ(1U, prefix_hits.size()); |
| 1900 EXPECT_EQ(kPrefix1, prefix_hits[0]); | 1919 EXPECT_EQ(kPrefix1, prefix_hits[0]); |
| 1901 EXPECT_TRUE(cache_hits.empty()); | 1920 EXPECT_TRUE(cache_hits.empty()); |
| 1902 } | 1921 } |
| 1903 | 1922 |
| 1904 // Remove kFullHash1_2 from the database. | 1923 // Remove kFullHash1_2 from the database. |
| 1905 chunks.clear(); | 1924 chunks.clear(); |
| 1906 chunks.push_back(SubChunkFullHash(12, kFullHash1_2, 2)); | 1925 chunks.push_back(SubChunkFullHash(12, kFullHash1_2, 2)); |
| 1907 | 1926 |
| 1908 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1927 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1909 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 1928 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); |
| 1910 database_->UpdateFinished(true); | 1929 database_->UpdateFinished(true); |
| 1911 | 1930 |
| 1912 // Cache should be cleared after updating. | 1931 // Cache should be cleared after updating. |
| 1913 EXPECT_TRUE(database_->browse_gethash_cache_.empty()); | 1932 EXPECT_TRUE(database_->prefix_gethash_cache_.empty()); |
| 1914 | 1933 |
| 1915 { | 1934 { |
| 1916 // None are present. | 1935 // None are present. |
| 1917 std::vector<SBFullHash> full_hashes; | 1936 std::vector<SBFullHash> full_hashes; |
| 1918 std::vector<SBPrefix> prefix_hits; | 1937 std::vector<SBPrefix> prefix_hits; |
| 1919 std::vector<SBFullHashResult> cache_hits; | 1938 std::vector<SBFullHashResult> cache_hits; |
| 1920 full_hashes.push_back(kFullHash1_1); | 1939 full_hashes.push_back(kFullHash1_1); |
| 1921 full_hashes.push_back(kFullHash1_2); | 1940 full_hashes.push_back(kFullHash1_2); |
| 1922 full_hashes.push_back(kFullHash1_3); | 1941 full_hashes.push_back(kFullHash1_3); |
| 1923 EXPECT_FALSE(database_->ContainsBrowseUrlHashes( | 1942 EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting( |
| 1924 full_hashes, &prefix_hits, &cache_hits)); | 1943 full_hashes, &prefix_hits, &cache_hits)); |
| 1925 } | 1944 } |
| 1926 } | 1945 } |
| 1927 | 1946 |
| 1928 TEST_F(SafeBrowsingDatabaseTest, BrowseFullHashAndPrefixMatching) { | 1947 TEST_F(SafeBrowsingDatabaseTest, BrowseFullHashAndPrefixMatching) { |
| 1929 const SBPrefix kPrefix1 = 1001U; | 1948 const SBPrefix kPrefix1 = 1001U; |
| 1930 const SBFullHash kFullHash1_1 = | 1949 const SBFullHash kFullHash1_1 = |
| 1931 SBFullHashForPrefixAndSuffix(kPrefix1, "\x01"); | 1950 SBFullHashForPrefixAndSuffix(kPrefix1, "\x01"); |
| 1932 const SBFullHash kFullHash1_2 = | 1951 const SBFullHash kFullHash1_2 = |
| 1933 SBFullHashForPrefixAndSuffix(kPrefix1, "\x02"); | 1952 SBFullHashForPrefixAndSuffix(kPrefix1, "\x02"); |
| 1934 | 1953 |
| 1935 ScopedVector<SBChunkData> chunks; | 1954 ScopedVector<SBChunkData> chunks; |
| 1936 chunks.push_back(AddChunkFullHash(1, kFullHash1_1)); | 1955 chunks.push_back(AddChunkFullHash(1, kFullHash1_1)); |
| 1937 | 1956 |
| 1938 std::vector<SBListChunkRanges> lists; | 1957 std::vector<SBListChunkRanges> lists; |
| 1939 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1958 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1940 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 1959 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); |
| 1941 database_->UpdateFinished(true); | 1960 database_->UpdateFinished(true); |
| 1942 | 1961 |
| 1943 { | 1962 { |
| 1944 // kFullHash1_2 does not match kFullHash1_1. | 1963 // kFullHash1_2 does not match kFullHash1_1. |
| 1945 std::vector<SBFullHash> full_hashes(1, kFullHash1_2); | 1964 std::vector<SBFullHash> full_hashes(1, kFullHash1_2); |
| 1946 std::vector<SBPrefix> prefix_hits; | 1965 std::vector<SBPrefix> prefix_hits; |
| 1947 std::vector<SBFullHashResult> cache_hits; | 1966 std::vector<SBFullHashResult> cache_hits; |
| 1948 EXPECT_FALSE(database_->ContainsBrowseUrlHashes( | 1967 EXPECT_FALSE(database_->ContainsBrowseUrlHashesForTesting( |
| 1949 full_hashes, &prefix_hits, &cache_hits)); | 1968 full_hashes, &prefix_hits, &cache_hits)); |
| 1950 } | 1969 } |
| 1951 | 1970 |
| 1952 // Add a prefix match. | 1971 // Add a prefix match. |
| 1953 chunks.clear(); | 1972 chunks.clear(); |
| 1954 chunks.push_back(AddChunkPrefix(2, kPrefix1)); | 1973 chunks.push_back(AddChunkPrefix(2, kPrefix1)); |
| 1955 | 1974 |
| 1956 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1975 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1957 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 1976 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); |
| 1958 database_->UpdateFinished(true); | 1977 database_->UpdateFinished(true); |
| 1959 | 1978 |
| 1960 { | 1979 { |
| 1961 // kFullHash1_2 does match kPrefix1. | 1980 // kFullHash1_2 does match kPrefix1. |
| 1962 std::vector<SBFullHash> full_hashes(1, kFullHash1_2); | 1981 std::vector<SBFullHash> full_hashes(1, kFullHash1_2); |
| 1963 std::vector<SBPrefix> prefix_hits; | 1982 std::vector<SBPrefix> prefix_hits; |
| 1964 std::vector<SBFullHashResult> cache_hits; | 1983 std::vector<SBFullHashResult> cache_hits; |
| 1965 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 1984 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1966 full_hashes, &prefix_hits, &cache_hits)); | 1985 full_hashes, &prefix_hits, &cache_hits)); |
| 1967 ASSERT_EQ(1U, prefix_hits.size()); | 1986 ASSERT_EQ(1U, prefix_hits.size()); |
| 1968 EXPECT_EQ(kPrefix1, prefix_hits[0]); | 1987 EXPECT_EQ(kPrefix1, prefix_hits[0]); |
| 1969 EXPECT_TRUE(cache_hits.empty()); | 1988 EXPECT_TRUE(cache_hits.empty()); |
| 1970 } | 1989 } |
| 1971 | 1990 |
| 1972 // Remove the full hash. | 1991 // Remove the full hash. |
| 1973 chunks.clear(); | 1992 chunks.clear(); |
| 1974 chunks.push_back(SubChunkFullHash(11, kFullHash1_1, 1)); | 1993 chunks.push_back(SubChunkFullHash(11, kFullHash1_1, 1)); |
| 1975 | 1994 |
| 1976 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 1995 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 1977 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); | 1996 database_->InsertChunks(safe_browsing_util::kMalwareList, chunks.get()); |
| 1978 database_->UpdateFinished(true); | 1997 database_->UpdateFinished(true); |
| 1979 | 1998 |
| 1980 { | 1999 { |
| 1981 // kFullHash1_2 still returns true due to the prefix hit. | 2000 // kFullHash1_2 still returns true due to the prefix hit. |
| 1982 std::vector<SBFullHash> full_hashes(1, kFullHash1_2); | 2001 std::vector<SBFullHash> full_hashes(1, kFullHash1_2); |
| 1983 std::vector<SBPrefix> prefix_hits; | 2002 std::vector<SBPrefix> prefix_hits; |
| 1984 std::vector<SBFullHashResult> cache_hits; | 2003 std::vector<SBFullHashResult> cache_hits; |
| 1985 EXPECT_TRUE(database_->ContainsBrowseUrlHashes( | 2004 EXPECT_TRUE(database_->ContainsBrowseUrlHashesForTesting( |
| 1986 full_hashes, &prefix_hits, &cache_hits)); | 2005 full_hashes, &prefix_hits, &cache_hits)); |
| 1987 ASSERT_EQ(1U, prefix_hits.size()); | 2006 ASSERT_EQ(1U, prefix_hits.size()); |
| 1988 EXPECT_EQ(kPrefix1, prefix_hits[0]); | 2007 EXPECT_EQ(kPrefix1, prefix_hits[0]); |
| 1989 EXPECT_TRUE(cache_hits.empty()); | 2008 EXPECT_TRUE(cache_hits.empty()); |
| 1990 } | 2009 } |
| 1991 } | 2010 } |
| 1992 | 2011 |
| 1993 TEST_F(SafeBrowsingDatabaseTest, MalwareIpBlacklist) { | 2012 TEST_F(SafeBrowsingDatabaseTest, MalwareIpBlacklist) { |
| 1994 database_.reset(); | |
| 1995 SafeBrowsingStoreFile* browse_store = new SafeBrowsingStoreFile(); | |
| 1996 SafeBrowsingStoreFile* ip_blacklist_store = new SafeBrowsingStoreFile(); | |
| 1997 database_.reset(new SafeBrowsingDatabaseNew(browse_store, | |
| 1998 NULL, | |
| 1999 NULL, | |
| 2000 NULL, | |
| 2001 NULL, | |
| 2002 NULL, | |
| 2003 ip_blacklist_store)); | |
| 2004 database_->Init(database_filename_); | |
| 2005 std::vector<SBListChunkRanges> lists; | 2013 std::vector<SBListChunkRanges> lists; |
| 2006 ASSERT_TRUE(database_->UpdateStarted(&lists)); | 2014 ASSERT_TRUE(database_->UpdateStarted(&lists)); |
| 2007 | 2015 |
| 2008 ScopedVector<SBChunkData> chunks; | 2016 ScopedVector<SBChunkData> chunks; |
| 2009 | 2017 |
| 2010 // IPv4 prefix match for ::ffff:192.168.1.0/120. | 2018 // IPv4 prefix match for ::ffff:192.168.1.0/120. |
| 2011 chunks.push_back(AddChunkHashedIpValue(1, "::ffff:192.168.1.0", 120)); | 2019 chunks.push_back(AddChunkHashedIpValue(1, "::ffff:192.168.1.0", 120)); |
| 2012 | 2020 |
| 2013 // IPv4 exact match for ::ffff:192.1.1.1. | 2021 // IPv4 exact match for ::ffff:192.1.1.1. |
| 2014 chunks.push_back(AddChunkHashedIpValue(2, "::ffff:192.1.1.1", 128)); | 2022 chunks.push_back(AddChunkHashedIpValue(2, "::ffff:192.1.1.1", 128)); |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2129 GURL(std::string("http://") + kExampleCollision), | 2137 GURL(std::string("http://") + kExampleCollision), |
| 2130 &prefix_hits, &cache_hits)); | 2138 &prefix_hits, &cache_hits)); |
| 2131 ASSERT_EQ(1U, prefix_hits.size()); | 2139 ASSERT_EQ(1U, prefix_hits.size()); |
| 2132 EXPECT_EQ(SBPrefixForString(kExampleCollision), prefix_hits[0]); | 2140 EXPECT_EQ(SBPrefixForString(kExampleCollision), prefix_hits[0]); |
| 2133 EXPECT_TRUE(cache_hits.empty()); | 2141 EXPECT_TRUE(cache_hits.empty()); |
| 2134 | 2142 |
| 2135 // This prefix collides, but no full hash match. | 2143 // This prefix collides, but no full hash match. |
| 2136 EXPECT_FALSE(database_->ContainsBrowseUrl( | 2144 EXPECT_FALSE(database_->ContainsBrowseUrl( |
| 2137 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); | 2145 GURL(std::string("http://") + kExampleFine), &prefix_hits, &cache_hits)); |
| 2138 } | 2146 } |
| OLD | NEW |