| Index: chrome/browser/safe_browsing/safe_browsing_database_unittest.cc
|
| diff --git a/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc
|
| index 5c4a7e685ff785f875cb0831f2473c21ac17375d..2938ebd497430edde1befa3269963af1d25af397 100644
|
| --- a/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc
|
| +++ b/chrome/browser/safe_browsing/safe_browsing_database_unittest.cc
|
| @@ -9,6 +9,7 @@
|
| #include "base/message_loop.h"
|
| #include "base/scoped_temp_dir.h"
|
| #include "base/time.h"
|
| +#include "chrome/browser/safe_browsing/bloom_filter.h"
|
| #include "chrome/browser/safe_browsing/safe_browsing_database.h"
|
| #include "chrome/browser/safe_browsing/safe_browsing_store_file.h"
|
| #include "chrome/browser/safe_browsing/safe_browsing_store_unittest_helper.h"
|
| @@ -1585,3 +1586,118 @@ TEST_F(SafeBrowsingDatabaseTest, EmptyUpdate) {
|
| ASSERT_TRUE(file_util::GetFileInfo(filename, &after_info));
|
| EXPECT_EQ(before_info.last_modified, after_info.last_modified);
|
| }
|
| +
|
| +// Test that a filter file is written out during update and read back
|
| +// in during setup.
|
| +TEST_F(SafeBrowsingDatabaseTest, FilterFile) {
|
| + // Create a database with trivial example data and write it out.
|
| + {
|
| + SBChunkList chunks;
|
| + SBChunk chunk;
|
| +
|
| + // Prime the database.
|
| + std::vector<SBListChunkRanges> lists;
|
| + EXPECT_TRUE(database_->UpdateStarted(&lists));
|
| +
|
| + InsertAddChunkHostPrefixUrl(&chunk, 1, "www.evil.com/",
|
| + "www.evil.com/malware.html");
|
| + chunks.clear();
|
| + chunks.push_back(chunk);
|
| + database_->InsertChunks(safe_browsing_util::kMalwareList, chunks);
|
| + database_->UpdateFinished(true);
|
| + }
|
| +
|
| + // Find the malware url in the database, don't find a good url.
|
| + const Time now = Time::Now();
|
| + std::vector<SBFullHashResult> full_hashes;
|
| + std::vector<SBPrefix> prefix_hits;
|
| + std::string matching_list;
|
| + EXPECT_TRUE(database_->ContainsBrowseUrl(
|
| + GURL("http://www.evil.com/malware.html"),
|
| + &matching_list, &prefix_hits, &full_hashes, now));
|
| + EXPECT_FALSE(database_->ContainsBrowseUrl(
|
| + GURL("http://www.good.com/goodware.html"),
|
| + &matching_list, &prefix_hits, &full_hashes, now));
|
| +
|
| + FilePath filter_file = database_->PrefixSetForFilename(
|
| + database_->BrowseDBFilename(database_filename_));
|
| +
|
| + // After re-creating the database, it should have a filter read from
|
| + // a file, so it should find the same results.
|
| + ASSERT_TRUE(file_util::PathExists(filter_file));
|
| + database_.reset(new SafeBrowsingDatabaseNew);
|
| + database_->Init(database_filename_);
|
| + EXPECT_TRUE(database_->ContainsBrowseUrl(
|
| + GURL("http://www.evil.com/malware.html"),
|
| + &matching_list, &prefix_hits, &full_hashes, now));
|
| + EXPECT_FALSE(database_->ContainsBrowseUrl(
|
| + GURL("http://www.good.com/goodware.html"),
|
| + &matching_list, &prefix_hits, &full_hashes, now));
|
| +
|
| + // If there is no filter file, the database cannot find malware urls.
|
| + file_util::Delete(filter_file, false);
|
| + ASSERT_FALSE(file_util::PathExists(filter_file));
|
| + database_.reset(new SafeBrowsingDatabaseNew);
|
| + database_->Init(database_filename_);
|
| + EXPECT_FALSE(database_->ContainsBrowseUrl(
|
| + GURL("http://www.evil.com/malware.html"),
|
| + &matching_list, &prefix_hits, &full_hashes, now));
|
| + EXPECT_FALSE(database_->ContainsBrowseUrl(
|
| + GURL("http://www.good.com/goodware.html"),
|
| + &matching_list, &prefix_hits, &full_hashes, now));
|
| +}
|
| +
|
| +TEST_F(SafeBrowsingDatabaseTest, PrefixSetTransition) {
|
| + // Create a database with trivial example data and write it out.
|
| + {
|
| + SBChunkList chunks;
|
| + SBChunk chunk;
|
| +
|
| + // Prime the database.
|
| + std::vector<SBListChunkRanges> lists;
|
| + EXPECT_TRUE(database_->UpdateStarted(&lists));
|
| +
|
| + InsertAddChunkHostPrefixUrl(&chunk, 1, "www.evil.com/",
|
| + "www.evil.com/malware.html");
|
| + chunks.clear();
|
| + chunks.push_back(chunk);
|
| + database_->InsertChunks(safe_browsing_util::kMalwareList, chunks);
|
| + database_->UpdateFinished(true);
|
| + }
|
| +
|
| + // Some helpful paths.
|
| + FilePath prefix_set_file = database_->PrefixSetForFilename(
|
| + database_->BrowseDBFilename(database_filename_));
|
| + FilePath bloom_filter_file = database_->BloomFilterForFilename(
|
| + database_->BrowseDBFilename(database_filename_));
|
| +
|
| + // Manually create a bloom filter for the prefixes and write it out.
|
| + {
|
| + scoped_refptr<BloomFilter> filter(
|
| + new BloomFilter(BloomFilter::kBloomFilterSizeRatio *
|
| + BloomFilter::kBloomFilterMinSize));
|
| + filter->Insert(Sha256Prefix("www.evil.com/"));
|
| + filter->Insert(Sha256Prefix("www.evil.com/malware.html"));
|
| + ASSERT_TRUE(filter->WriteFile(bloom_filter_file));
|
| + }
|
| +
|
| + file_util::Delete(prefix_set_file, false);
|
| + ASSERT_FALSE(file_util::PathExists(prefix_set_file));
|
| + ASSERT_TRUE(file_util::PathExists(bloom_filter_file));
|
| +
|
| + // Reload the database.
|
| + database_.reset(new SafeBrowsingDatabaseNew);
|
| + database_->Init(database_filename_);
|
| +
|
| + // Should find the malware.
|
| + const Time now = Time::Now();
|
| + std::vector<SBFullHashResult> full_hashes;
|
| + std::vector<SBPrefix> prefix_hits;
|
| + std::string matching_list;
|
| + EXPECT_TRUE(database_->ContainsBrowseUrl(
|
| + GURL("http://www.evil.com/malware.html"),
|
| + &matching_list, &prefix_hits, &full_hashes, now));
|
| + EXPECT_FALSE(database_->ContainsBrowseUrl(
|
| + GURL("http://www.good.com/goodware.html"),
|
| + &matching_list, &prefix_hits, &full_hashes, now));
|
| +}
|
|
|