| Index: chrome/browser/safe_browsing/safe_browsing_store_unittest.cc
|
| diff --git a/chrome/browser/safe_browsing/safe_browsing_store_unittest.cc b/chrome/browser/safe_browsing/safe_browsing_store_unittest.cc
|
| index c1214e766b025985e3b21ddd14b57c06d1577add..3e2494ddf62c94cebc98debaf148535335890185 100644
|
| --- a/chrome/browser/safe_browsing/safe_browsing_store_unittest.cc
|
| +++ b/chrome/browser/safe_browsing/safe_browsing_store_unittest.cc
|
| @@ -307,4 +307,69 @@ TEST(SafeBrowsingStoreTest, Y2K38) {
|
| << " (int32)time_t is running out.";
|
| }
|
|
|
| +// Test that prefixes which were injected from full hashes are being removed.
|
| +// This was a mistake in earlier versions of the code.
|
| +TEST(SafeBrowsingStoreTest, KnockoutPrefixVolunteers) {
|
| + const base::Time kNow = base::Time::Now();
|
| +
|
| + // Construct some full hashes which share prefix with another.
|
| + const SBFullHash kHash1mod1 = ModifyHashAfterPrefix(kHash1, 1);
|
| + const SBFullHash kHash2mod1 = ModifyHashAfterPrefix(kHash2, 1);
|
| +
|
| + SBAddPrefixes add_prefixes;
|
| + std::vector<SBAddFullHash> add_hashes;
|
| + SBSubPrefixes sub_prefixes;
|
| + std::vector<SBSubFullHash> sub_hashes;
|
| +
|
| + // Full hashes for an add chunk will have had the prefix injected.
|
| + add_hashes.push_back(SBAddFullHash(kAddChunk1, kNow, kHash1));
|
| + add_hashes.push_back(SBAddFullHash(kAddChunk1, kNow, kHash1mod1));
|
| + add_prefixes.push_back(SBAddPrefix(kAddChunk1, kHash1.prefix));
|
| +
|
| + // Other full hashes or prefixes are not affected.
|
| + add_hashes.push_back(SBAddFullHash(kAddChunk1, kNow, kHash3));
|
| + add_prefixes.push_back(SBAddPrefix(kAddChunk2, kHash4.prefix));
|
| +
|
| + // Full hashes for a sub chunk will have had the prefix injected.
|
| + sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash2));
|
| + sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash2mod1));
|
| + sub_prefixes.push_back(SBSubPrefix(kSubChunk1, kAddChunk1, kHash2.prefix));
|
| +
|
| + // Other full hashes or prefixes are not affected.
|
| + sub_hashes.push_back(SBSubFullHash(kSubChunk1, kAddChunk1, kHash5));
|
| + sub_prefixes.push_back(SBSubPrefix(kSubChunk2, kAddChunk2, kHash6.prefix));
|
| +
|
| + const base::hash_set<int32> no_deletions;
|
| + ProcessHelper(&add_prefixes, &sub_prefixes, &add_hashes, &sub_hashes,
|
| + no_deletions, no_deletions);
|
| +
|
| + ASSERT_EQ(1U, add_prefixes.size());
|
| + EXPECT_EQ(kAddChunk2, add_prefixes[0].chunk_id);
|
| + EXPECT_EQ(kHash4.prefix, add_prefixes[0].prefix);
|
| +
|
| + ASSERT_EQ(3U, add_hashes.size());
|
| + EXPECT_EQ(kAddChunk1, add_hashes[0].chunk_id);
|
| + EXPECT_TRUE(SBFullHashEqual(kHash1mod1, add_hashes[0].full_hash));
|
| + EXPECT_EQ(kAddChunk1, add_hashes[1].chunk_id);
|
| + EXPECT_TRUE(SBFullHashEqual(kHash1, add_hashes[1].full_hash));
|
| + EXPECT_EQ(kAddChunk1, add_hashes[2].chunk_id);
|
| + EXPECT_TRUE(SBFullHashEqual(kHash3, add_hashes[2].full_hash));
|
| +
|
| + ASSERT_EQ(1U, sub_prefixes.size());
|
| + EXPECT_EQ(kSubChunk2, sub_prefixes[0].chunk_id);
|
| + EXPECT_EQ(kAddChunk2, sub_prefixes[0].add_chunk_id);
|
| + EXPECT_EQ(kHash6.prefix, sub_prefixes[0].add_prefix);
|
| +
|
| + ASSERT_EQ(3U, sub_hashes.size());
|
| + EXPECT_EQ(kSubChunk1, sub_hashes[0].chunk_id);
|
| + EXPECT_EQ(kAddChunk1, sub_hashes[0].add_chunk_id);
|
| + EXPECT_TRUE(SBFullHashEqual(kHash5, sub_hashes[0].full_hash));
|
| + EXPECT_EQ(kSubChunk1, sub_hashes[1].chunk_id);
|
| + EXPECT_EQ(kAddChunk1, sub_hashes[1].add_chunk_id);
|
| + EXPECT_TRUE(SBFullHashEqual(kHash2mod1, sub_hashes[1].full_hash));
|
| + EXPECT_EQ(kSubChunk1, sub_hashes[2].chunk_id);
|
| + EXPECT_EQ(kAddChunk1, sub_hashes[2].add_chunk_id);
|
| + EXPECT_TRUE(SBFullHashEqual(kHash2, sub_hashes[2].full_hash));
|
| +}
|
| +
|
| } // namespace
|
|
|