| Index: chrome/browser/safe_browsing/prefix_set_unittest.cc
|
| diff --git a/chrome/browser/safe_browsing/prefix_set_unittest.cc b/chrome/browser/safe_browsing/prefix_set_unittest.cc
|
| index 252028290fd536d6da76dc2b2b754270a5683b7d..e537ad918257ecf88826c9d867463db60fc5cfe7 100644
|
| --- a/chrome/browser/safe_browsing/prefix_set_unittest.cc
|
| +++ b/chrome/browser/safe_browsing/prefix_set_unittest.cc
|
| @@ -37,7 +37,8 @@ class PrefixSetTest : public PlatformTest {
|
| static const size_t kVersionOffset = 1 * sizeof(uint32);
|
| static const size_t kIndexSizeOffset = 2 * sizeof(uint32);
|
| static const size_t kDeltasSizeOffset = 3 * sizeof(uint32);
|
| - static const size_t kPayloadOffset = 4 * sizeof(uint32);
|
| + static const size_t kFullHashesSizeOffset = 4 * sizeof(uint32);
|
| + static const size_t kPayloadOffset = 5 * sizeof(uint32);
|
|
|
| // Generate a set of random prefixes to share between tests. For
|
| // most tests this generation was a large fraction of the test time.
|
| @@ -398,6 +399,38 @@ TEST_F(PrefixSetTest, ReadWrite) {
|
| ASSERT_TRUE(prefix_set.get());
|
| CheckPrefixes(*prefix_set, prefixes);
|
| }
|
| +
|
| + // Test that full hashes are persisted.
|
| + {
|
| + std::vector<SBFullHash> hashes;
|
| + hashes.push_back(SBFullHashForString("one"));
|
| + hashes.push_back(SBFullHashForString("two"));
|
| + hashes.push_back(SBFullHashForString("three"));
|
| +
|
| + std::vector<SBPrefix> prefixes(shared_prefixes_);
|
| +
|
| + // Remove any collisions from the prefixes.
|
| + for (size_t i = 0; i < hashes.size(); ++i) {
|
| + std::vector<SBPrefix>::iterator iter =
|
| + std::lower_bound(prefixes.begin(), prefixes.end(), hashes[i].prefix);
|
| + if (iter != prefixes.end() && *iter == hashes[i].prefix)
|
| + prefixes.erase(iter);
|
| + }
|
| +
|
| + PrefixSetBuilder builder(prefixes);
|
| + ASSERT_TRUE(builder.GetPrefixSet(hashes)->WriteFile(filename));
|
| +
|
| + scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
|
| + ASSERT_TRUE(prefix_set.get());
|
| + CheckPrefixes(*prefix_set, prefixes);
|
| +
|
| + EXPECT_TRUE(prefix_set->Exists(hashes[0]));
|
| + EXPECT_TRUE(prefix_set->Exists(hashes[1]));
|
| + EXPECT_TRUE(prefix_set->Exists(hashes[2]));
|
| + EXPECT_FALSE(prefix_set->PrefixExists(hashes[0].prefix));
|
| + EXPECT_FALSE(prefix_set->PrefixExists(hashes[1].prefix));
|
| + EXPECT_FALSE(prefix_set->PrefixExists(hashes[2].prefix));
|
| + }
|
| }
|
|
|
| // Check that |CleanChecksum()| makes an acceptable checksum.
|
| @@ -465,6 +498,17 @@ TEST_F(PrefixSetTest, CorruptionDeltasSize) {
|
| ASSERT_FALSE(prefix_set.get());
|
| }
|
|
|
| +// Bad |full_hashes_| size is caught by the sanity check.
|
| +TEST_F(PrefixSetTest, CorruptionFullHashesSize) {
|
| + base::FilePath filename;
|
| + ASSERT_TRUE(GetPrefixSetFile(&filename));
|
| +
|
| + ASSERT_NO_FATAL_FAILURE(
|
| + ModifyAndCleanChecksum(filename, kFullHashesSizeOffset, 1));
|
| + scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
|
| + ASSERT_FALSE(prefix_set.get());
|
| +}
|
| +
|
| // Test that the digest catches corruption in the middle of the file
|
| // (in the payload between the header and the digest).
|
| TEST_F(PrefixSetTest, CorruptionPayload) {
|
| @@ -667,4 +711,32 @@ TEST_F(PrefixSetTest, Version2) {
|
| }
|
| #endif
|
|
|
| +// Test that a golden v3 file can be read by the current code. All platforms
|
| +// generating v3 files are little-endian, so there is no point to testing this
|
| +// transition if/when a big-endian port is added.
|
| +#if defined(ARCH_CPU_LITTLE_ENDIAN)
|
| +TEST_F(PrefixSetTest, Version3) {
|
| + std::vector<SBPrefix> ref_prefixes;
|
| + ASSERT_TRUE(ReadReferencePrefixes(&ref_prefixes));
|
| +
|
| + const char kBasename[] = "PrefixSetVersion3";
|
| + base::FilePath golden_path;
|
| + ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &golden_path));
|
| + golden_path = golden_path.AppendASCII("SafeBrowsing");
|
| + golden_path = golden_path.AppendASCII(kBasename);
|
| +
|
| + scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(golden_path);
|
| + ASSERT_TRUE(prefix_set.get());
|
| + CheckPrefixes(*prefix_set, ref_prefixes);
|
| +
|
| + const SBFullHash kHash1 = SBFullHashForString("www.evil.com/malware.html");
|
| + const SBFullHash kHash2 = SBFullHashForString("www.evil.com/phishing.html");
|
| +
|
| + EXPECT_TRUE(prefix_set->Exists(kHash1));
|
| + EXPECT_TRUE(prefix_set->Exists(kHash2));
|
| + EXPECT_FALSE(prefix_set->PrefixExists(kHash1.prefix));
|
| + EXPECT_FALSE(prefix_set->PrefixExists(kHash2.prefix));
|
| +}
|
| +#endif
|
| +
|
| } // namespace safe_browsing
|
|
|