Chromium Code Reviews| 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 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h" | 5 #include "chrome/browser/safe_browsing/safe_browsing_store_file.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
| 9 #include "base/files/scoped_file.h" | 9 #include "base/files/scoped_file.h" |
| 10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
| 11 #include "base/md5.h" | 11 #include "base/md5.h" |
| 12 #include "base/path_service.h" | 12 #include "base/path_service.h" |
| 13 #include "base/test/test_simple_task_runner.h" | 13 #include "base/test/test_simple_task_runner.h" |
| 14 #include "chrome/common/chrome_paths.h" | 14 #include "chrome/common/chrome_paths.h" |
| 15 #include "components/safe_browsing_db/prefix_set.h" | 15 #include "components/safe_browsing_db/prefix_set.h" |
| 16 #include "components/safe_browsing_db/util.h" | 16 #include "components/safe_browsing_db/util.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
| 18 #include "testing/platform_test.h" | 18 #include "testing/platform_test.h" |
| 19 | 19 |
| 20 namespace { | 20 namespace safe_browsing { |
| 21 | 21 |
| 22 const int kAddChunk1 = 1; | 22 const int kAddChunk1 = 1; |
| 23 const int kAddChunk2 = 3; | 23 const int kAddChunk2 = 3; |
| 24 const int kAddChunk3 = 5; | 24 const int kAddChunk3 = 5; |
| 25 const int kAddChunk4 = 7; | 25 const int kAddChunk4 = 7; |
| 26 // Disjoint chunk numbers for subs to flush out typos. | 26 // Disjoint chunk numbers for subs to flush out typos. |
| 27 const int kSubChunk1 = 2; | 27 const int kSubChunk1 = 2; |
| 28 const int kSubChunk2 = 4; | 28 const int kSubChunk2 = 4; |
| 29 | 29 |
| 30 const SBFullHash kHash1 = safe_browsing::SBFullHashForString("one"); | 30 const SBFullHash kHash1 = SBFullHashForString("one"); |
| 31 const SBFullHash kHash2 = safe_browsing::SBFullHashForString("two"); | 31 const SBFullHash kHash2 = SBFullHashForString("two"); |
| 32 const SBFullHash kHash3 = safe_browsing::SBFullHashForString("three"); | 32 const SBFullHash kHash3 = SBFullHashForString("three"); |
| 33 const SBFullHash kHash4 = safe_browsing::SBFullHashForString("four"); | 33 const SBFullHash kHash4 = SBFullHashForString("four"); |
| 34 const SBFullHash kHash5 = safe_browsing::SBFullHashForString("five"); | 34 const SBFullHash kHash5 = SBFullHashForString("five"); |
| 35 const SBFullHash kHash6 = safe_browsing::SBFullHashForString("six"); | 35 const SBFullHash kHash6 = SBFullHashForString("six"); |
| 36 | 36 |
| 37 const SBPrefix kMinSBPrefix = 0u; | 37 const SBPrefix kMinSBPrefix = 0u; |
| 38 const SBPrefix kMaxSBPrefix = ~kMinSBPrefix; | 38 const SBPrefix kMaxSBPrefix = ~kMinSBPrefix; |
| 39 | 39 |
| 40 } // namespace | |
|
mattm
2015/11/11 01:10:16
Keep the anon namespace inside the new namespace.
vakh (old account. dont use)
2015/11/11 18:59:53
Done.
| |
| 41 | |
| 42 namespace safe_browsing { | |
| 43 | |
| 44 class SafeBrowsingStoreFileTest : public PlatformTest { | 40 class SafeBrowsingStoreFileTest : public PlatformTest { |
| 45 public: | 41 public: |
| 46 SafeBrowsingStoreFileTest() | 42 SafeBrowsingStoreFileTest() |
| 47 : task_runner_(new base::TestSimpleTaskRunner), | 43 : task_runner_(new base::TestSimpleTaskRunner), |
| 48 corruption_detected_(false) {} | 44 corruption_detected_(false) {} |
| 49 | 45 |
| 50 void SetUp() override { | 46 void SetUp() override { |
| 51 PlatformTest::SetUp(); | 47 PlatformTest::SetUp(); |
| 52 | 48 |
| 53 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 49 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 95 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk2)); | 91 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk2)); |
| 96 EXPECT_TRUE(store_->WriteAddHash(kAddChunk2, kHash4)); | 92 EXPECT_TRUE(store_->WriteAddHash(kAddChunk2, kHash4)); |
| 97 EXPECT_TRUE(store_->FinishChunk()); | 93 EXPECT_TRUE(store_->FinishChunk()); |
| 98 | 94 |
| 99 // Chunk numbers shouldn't leak over. | 95 // Chunk numbers shouldn't leak over. |
| 100 EXPECT_FALSE(store_->CheckAddChunk(kSubChunk1)); | 96 EXPECT_FALSE(store_->CheckAddChunk(kSubChunk1)); |
| 101 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk3)); | 97 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk3)); |
| 102 EXPECT_FALSE(store_->CheckSubChunk(kAddChunk1)); | 98 EXPECT_FALSE(store_->CheckSubChunk(kAddChunk1)); |
| 103 EXPECT_FALSE(store_->CheckSubChunk(kAddChunk2)); | 99 EXPECT_FALSE(store_->CheckSubChunk(kAddChunk2)); |
| 104 | 100 |
| 105 safe_browsing::PrefixSetBuilder builder; | 101 PrefixSetBuilder builder; |
| 106 std::vector<SBAddFullHash> add_full_hashes_result; | 102 std::vector<SBAddFullHash> add_full_hashes_result; |
| 107 | 103 |
| 108 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 104 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 109 } | 105 } |
| 110 | 106 |
| 111 // Manually read the shard stride info from the file. | 107 // Manually read the shard stride info from the file. |
| 112 uint32 ReadStride() { | 108 uint32 ReadStride() { |
| 113 base::ScopedFILE file(base::OpenFile(filename_, "rb")); | 109 base::ScopedFILE file(base::OpenFile(filename_, "rb")); |
| 114 const long kOffset = 4 * sizeof(uint32); | 110 const long kOffset = 4 * sizeof(uint32); |
| 115 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0); | 111 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0); |
| (...skipping 21 matching lines...) Expand all Loading... | |
| 137 | 133 |
| 138 // Shouldn't see anything, but anything is a big set to test. | 134 // Shouldn't see anything, but anything is a big set to test. |
| 139 EXPECT_FALSE(store_->CheckAddChunk(0)); | 135 EXPECT_FALSE(store_->CheckAddChunk(0)); |
| 140 EXPECT_FALSE(store_->CheckAddChunk(1)); | 136 EXPECT_FALSE(store_->CheckAddChunk(1)); |
| 141 EXPECT_FALSE(store_->CheckAddChunk(-1)); | 137 EXPECT_FALSE(store_->CheckAddChunk(-1)); |
| 142 | 138 |
| 143 EXPECT_FALSE(store_->CheckSubChunk(0)); | 139 EXPECT_FALSE(store_->CheckSubChunk(0)); |
| 144 EXPECT_FALSE(store_->CheckSubChunk(1)); | 140 EXPECT_FALSE(store_->CheckSubChunk(1)); |
| 145 EXPECT_FALSE(store_->CheckSubChunk(-1)); | 141 EXPECT_FALSE(store_->CheckSubChunk(-1)); |
| 146 | 142 |
| 147 safe_browsing::PrefixSetBuilder builder; | 143 PrefixSetBuilder builder; |
| 148 std::vector<SBAddFullHash> add_full_hashes_result; | 144 std::vector<SBAddFullHash> add_full_hashes_result; |
| 149 | 145 |
| 150 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 146 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 151 EXPECT_TRUE(add_full_hashes_result.empty()); | 147 EXPECT_TRUE(add_full_hashes_result.empty()); |
| 152 | 148 |
| 153 std::vector<SBPrefix> prefixes_result; | 149 std::vector<SBPrefix> prefixes_result; |
| 154 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); | 150 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); |
| 155 EXPECT_TRUE(prefixes_result.empty()); | 151 EXPECT_TRUE(prefixes_result.empty()); |
| 156 } | 152 } |
| 157 | 153 |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 175 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1)); | 171 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1)); |
| 176 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); | 172 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); |
| 177 | 173 |
| 178 EXPECT_TRUE(store_->BeginChunk()); | 174 EXPECT_TRUE(store_->BeginChunk()); |
| 179 store_->SetAddChunk(kAddChunk3); | 175 store_->SetAddChunk(kAddChunk3); |
| 180 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kHash5.prefix)); | 176 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kHash5.prefix)); |
| 181 EXPECT_TRUE(store_->FinishChunk()); | 177 EXPECT_TRUE(store_->FinishChunk()); |
| 182 | 178 |
| 183 // Still has the chunks expected in the next update. | 179 // Still has the chunks expected in the next update. |
| 184 { | 180 { |
| 185 safe_browsing::PrefixSetBuilder builder; | 181 PrefixSetBuilder builder; |
| 186 std::vector<SBAddFullHash> add_full_hashes_result; | 182 std::vector<SBAddFullHash> add_full_hashes_result; |
| 187 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 183 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 188 | 184 |
| 189 std::vector<SBPrefix> prefixes_result; | 185 std::vector<SBPrefix> prefixes_result; |
| 190 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); | 186 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); |
| 191 ASSERT_EQ(3U, prefixes_result.size()); | 187 ASSERT_EQ(3U, prefixes_result.size()); |
| 192 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); | 188 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); |
| 193 EXPECT_EQ(kHash5.prefix, prefixes_result[1]); | 189 EXPECT_EQ(kHash5.prefix, prefixes_result[1]); |
| 194 EXPECT_EQ(kHash2.prefix, prefixes_result[2]); | 190 EXPECT_EQ(kHash2.prefix, prefixes_result[2]); |
| 195 | 191 |
| 196 ASSERT_EQ(1U, add_full_hashes_result.size()); | 192 ASSERT_EQ(1U, add_full_hashes_result.size()); |
| 197 EXPECT_EQ(kAddChunk2, add_full_hashes_result[0].chunk_id); | 193 EXPECT_EQ(kAddChunk2, add_full_hashes_result[0].chunk_id); |
| 198 EXPECT_TRUE(safe_browsing::SBFullHashEqual( | 194 EXPECT_TRUE(SBFullHashEqual( |
| 199 kHash4, add_full_hashes_result[0].full_hash)); | 195 kHash4, add_full_hashes_result[0].full_hash)); |
| 200 } | 196 } |
| 201 } | 197 } |
| 202 | 198 |
| 203 // Verify that the min and max prefixes are stored and operated on. | 199 // Verify that the min and max prefixes are stored and operated on. |
| 204 TEST_F(SafeBrowsingStoreFileTest, PrefixMinMax) { | 200 TEST_F(SafeBrowsingStoreFileTest, PrefixMinMax) { |
| 205 PopulateStore(); | 201 PopulateStore(); |
| 206 | 202 |
| 207 ASSERT_TRUE(store_->BeginUpdate()); | 203 ASSERT_TRUE(store_->BeginUpdate()); |
| 208 | 204 |
| 209 EXPECT_TRUE(store_->BeginChunk()); | 205 EXPECT_TRUE(store_->BeginChunk()); |
| 210 store_->SetAddChunk(kAddChunk3); | 206 store_->SetAddChunk(kAddChunk3); |
| 211 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kMinSBPrefix)); | 207 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kMinSBPrefix)); |
| 212 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kMaxSBPrefix)); | 208 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kMaxSBPrefix)); |
| 213 EXPECT_TRUE(store_->FinishChunk()); | 209 EXPECT_TRUE(store_->FinishChunk()); |
| 214 | 210 |
| 215 { | 211 { |
| 216 safe_browsing::PrefixSetBuilder builder; | 212 PrefixSetBuilder builder; |
| 217 std::vector<SBAddFullHash> add_full_hashes_result; | 213 std::vector<SBAddFullHash> add_full_hashes_result; |
| 218 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 214 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 219 | 215 |
| 220 std::vector<SBPrefix> prefixes_result; | 216 std::vector<SBPrefix> prefixes_result; |
| 221 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); | 217 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); |
| 222 ASSERT_EQ(4U, prefixes_result.size()); | 218 ASSERT_EQ(4U, prefixes_result.size()); |
| 223 EXPECT_EQ(kMinSBPrefix, prefixes_result[0]); | 219 EXPECT_EQ(kMinSBPrefix, prefixes_result[0]); |
| 224 EXPECT_EQ(kHash1.prefix, prefixes_result[1]); | 220 EXPECT_EQ(kHash1.prefix, prefixes_result[1]); |
| 225 EXPECT_EQ(kHash2.prefix, prefixes_result[2]); | 221 EXPECT_EQ(kHash2.prefix, prefixes_result[2]); |
| 226 EXPECT_EQ(kMaxSBPrefix, prefixes_result[3]); | 222 EXPECT_EQ(kMaxSBPrefix, prefixes_result[3]); |
| 227 } | 223 } |
| 228 | 224 |
| 229 ASSERT_TRUE(store_->BeginUpdate()); | 225 ASSERT_TRUE(store_->BeginUpdate()); |
| 230 | 226 |
| 231 EXPECT_TRUE(store_->BeginChunk()); | 227 EXPECT_TRUE(store_->BeginChunk()); |
| 232 store_->SetAddChunk(kSubChunk2); | 228 store_->SetAddChunk(kSubChunk2); |
| 233 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk2, kAddChunk3, kMinSBPrefix)); | 229 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk2, kAddChunk3, kMinSBPrefix)); |
| 234 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk2, kAddChunk3, kMaxSBPrefix)); | 230 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk2, kAddChunk3, kMaxSBPrefix)); |
| 235 EXPECT_TRUE(store_->FinishChunk()); | 231 EXPECT_TRUE(store_->FinishChunk()); |
| 236 | 232 |
| 237 { | 233 { |
| 238 safe_browsing::PrefixSetBuilder builder; | 234 PrefixSetBuilder builder; |
| 239 std::vector<SBAddFullHash> add_full_hashes_result; | 235 std::vector<SBAddFullHash> add_full_hashes_result; |
| 240 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 236 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 241 | 237 |
| 242 std::vector<SBPrefix> prefixes_result; | 238 std::vector<SBPrefix> prefixes_result; |
| 243 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); | 239 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); |
| 244 ASSERT_EQ(2U, prefixes_result.size()); | 240 ASSERT_EQ(2U, prefixes_result.size()); |
| 245 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); | 241 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); |
| 246 EXPECT_EQ(kHash2.prefix, prefixes_result[1]); | 242 EXPECT_EQ(kHash2.prefix, prefixes_result[1]); |
| 247 } | 243 } |
| 248 } | 244 } |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 262 EXPECT_TRUE(store_->WriteAddHash(kAddChunk2, kHash4)); | 258 EXPECT_TRUE(store_->WriteAddHash(kAddChunk2, kHash4)); |
| 263 EXPECT_TRUE(store_->FinishChunk()); | 259 EXPECT_TRUE(store_->FinishChunk()); |
| 264 | 260 |
| 265 EXPECT_TRUE(store_->BeginChunk()); | 261 EXPECT_TRUE(store_->BeginChunk()); |
| 266 store_->SetSubChunk(kSubChunk1); | 262 store_->SetSubChunk(kSubChunk1); |
| 267 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk3, kHash3.prefix)); | 263 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk3, kHash3.prefix)); |
| 268 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk1, kHash2.prefix)); | 264 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk1, kHash2.prefix)); |
| 269 EXPECT_TRUE(store_->FinishChunk()); | 265 EXPECT_TRUE(store_->FinishChunk()); |
| 270 | 266 |
| 271 { | 267 { |
| 272 safe_browsing::PrefixSetBuilder builder; | 268 PrefixSetBuilder builder; |
| 273 std::vector<SBAddFullHash> add_full_hashes_result; | 269 std::vector<SBAddFullHash> add_full_hashes_result; |
| 274 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 270 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 275 | 271 |
| 276 // Knocked out the chunk expected. | 272 // Knocked out the chunk expected. |
| 277 std::vector<SBPrefix> prefixes_result; | 273 std::vector<SBPrefix> prefixes_result; |
| 278 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); | 274 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); |
| 279 ASSERT_EQ(1U, prefixes_result.size()); | 275 ASSERT_EQ(1U, prefixes_result.size()); |
| 280 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); | 276 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); |
| 281 | 277 |
| 282 ASSERT_EQ(1U, add_full_hashes_result.size()); | 278 ASSERT_EQ(1U, add_full_hashes_result.size()); |
| 283 EXPECT_EQ(kAddChunk2, add_full_hashes_result[0].chunk_id); | 279 EXPECT_EQ(kAddChunk2, add_full_hashes_result[0].chunk_id); |
| 284 EXPECT_TRUE(safe_browsing::SBFullHashEqual( | 280 EXPECT_TRUE(SBFullHashEqual( |
| 285 kHash4, add_full_hashes_result[0].full_hash)); | 281 kHash4, add_full_hashes_result[0].full_hash)); |
| 286 } | 282 } |
| 287 | 283 |
| 288 ASSERT_TRUE(store_->BeginUpdate()); | 284 ASSERT_TRUE(store_->BeginUpdate()); |
| 289 | 285 |
| 290 // This add should be knocked out by an existing sub. | 286 // This add should be knocked out by an existing sub. |
| 291 EXPECT_TRUE(store_->BeginChunk()); | 287 EXPECT_TRUE(store_->BeginChunk()); |
| 292 store_->SetAddChunk(kAddChunk3); | 288 store_->SetAddChunk(kAddChunk3); |
| 293 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kHash3.prefix)); | 289 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kHash3.prefix)); |
| 294 EXPECT_TRUE(store_->FinishChunk()); | 290 EXPECT_TRUE(store_->FinishChunk()); |
| 295 | 291 |
| 296 { | 292 { |
| 297 safe_browsing::PrefixSetBuilder builder; | 293 PrefixSetBuilder builder; |
| 298 std::vector<SBAddFullHash> add_full_hashes_result; | 294 std::vector<SBAddFullHash> add_full_hashes_result; |
| 299 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 295 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 300 | 296 |
| 301 std::vector<SBPrefix> prefixes_result; | 297 std::vector<SBPrefix> prefixes_result; |
| 302 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); | 298 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); |
| 303 ASSERT_EQ(1U, prefixes_result.size()); | 299 ASSERT_EQ(1U, prefixes_result.size()); |
| 304 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); | 300 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); |
| 305 | 301 |
| 306 ASSERT_EQ(1U, add_full_hashes_result.size()); | 302 ASSERT_EQ(1U, add_full_hashes_result.size()); |
| 307 EXPECT_EQ(kAddChunk2, add_full_hashes_result[0].chunk_id); | 303 EXPECT_EQ(kAddChunk2, add_full_hashes_result[0].chunk_id); |
| 308 EXPECT_TRUE(safe_browsing::SBFullHashEqual( | 304 EXPECT_TRUE(SBFullHashEqual( |
| 309 kHash4, add_full_hashes_result[0].full_hash)); | 305 kHash4, add_full_hashes_result[0].full_hash)); |
| 310 } | 306 } |
| 311 | 307 |
| 312 ASSERT_TRUE(store_->BeginUpdate()); | 308 ASSERT_TRUE(store_->BeginUpdate()); |
| 313 | 309 |
| 314 // But by here the sub should be gone, so it should stick this time. | 310 // But by here the sub should be gone, so it should stick this time. |
| 315 EXPECT_TRUE(store_->BeginChunk()); | 311 EXPECT_TRUE(store_->BeginChunk()); |
| 316 store_->SetAddChunk(kAddChunk3); | 312 store_->SetAddChunk(kAddChunk3); |
| 317 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kHash3.prefix)); | 313 EXPECT_TRUE(store_->WriteAddPrefix(kAddChunk3, kHash3.prefix)); |
| 318 EXPECT_TRUE(store_->FinishChunk()); | 314 EXPECT_TRUE(store_->FinishChunk()); |
| 319 | 315 |
| 320 { | 316 { |
| 321 safe_browsing::PrefixSetBuilder builder; | 317 PrefixSetBuilder builder; |
| 322 std::vector<SBAddFullHash> add_full_hashes_result; | 318 std::vector<SBAddFullHash> add_full_hashes_result; |
| 323 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 319 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 324 | 320 |
| 325 std::vector<SBPrefix> prefixes_result; | 321 std::vector<SBPrefix> prefixes_result; |
| 326 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); | 322 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); |
| 327 ASSERT_EQ(2U, prefixes_result.size()); | 323 ASSERT_EQ(2U, prefixes_result.size()); |
| 328 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); | 324 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); |
| 329 EXPECT_EQ(kHash3.prefix, prefixes_result[1]); | 325 EXPECT_EQ(kHash3.prefix, prefixes_result[1]); |
| 330 | 326 |
| 331 ASSERT_EQ(1U, add_full_hashes_result.size()); | 327 ASSERT_EQ(1U, add_full_hashes_result.size()); |
| 332 EXPECT_EQ(kAddChunk2, add_full_hashes_result[0].chunk_id); | 328 EXPECT_EQ(kAddChunk2, add_full_hashes_result[0].chunk_id); |
| 333 EXPECT_TRUE(safe_browsing::SBFullHashEqual( | 329 EXPECT_TRUE(SBFullHashEqual( |
| 334 kHash4, add_full_hashes_result[0].full_hash)); | 330 kHash4, add_full_hashes_result[0].full_hash)); |
| 335 } | 331 } |
| 336 } | 332 } |
| 337 | 333 |
| 338 // Test that deletes delete the chunk's data. | 334 // Test that deletes delete the chunk's data. |
| 339 TEST_F(SafeBrowsingStoreFileTest, DeleteChunks) { | 335 TEST_F(SafeBrowsingStoreFileTest, DeleteChunks) { |
| 340 ASSERT_TRUE(store_->BeginUpdate()); | 336 ASSERT_TRUE(store_->BeginUpdate()); |
| 341 | 337 |
| 342 // A prefix chunk which will be deleted. | 338 // A prefix chunk which will be deleted. |
| 343 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1)); | 339 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1)); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 379 store_->DeleteSubChunk(kSubChunk1); | 375 store_->DeleteSubChunk(kSubChunk1); |
| 380 | 376 |
| 381 // Not actually deleted until finish. | 377 // Not actually deleted until finish. |
| 382 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1)); | 378 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1)); |
| 383 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk2)); | 379 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk2)); |
| 384 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk3)); | 380 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk3)); |
| 385 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); | 381 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); |
| 386 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk2)); | 382 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk2)); |
| 387 | 383 |
| 388 { | 384 { |
| 389 safe_browsing::PrefixSetBuilder builder; | 385 PrefixSetBuilder builder; |
| 390 std::vector<SBAddFullHash> add_full_hashes_result; | 386 std::vector<SBAddFullHash> add_full_hashes_result; |
| 391 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 387 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 392 | 388 |
| 393 std::vector<SBPrefix> prefixes_result; | 389 std::vector<SBPrefix> prefixes_result; |
| 394 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); | 390 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); |
| 395 ASSERT_EQ(1U, prefixes_result.size()); | 391 ASSERT_EQ(1U, prefixes_result.size()); |
| 396 EXPECT_EQ(kHash3.prefix, prefixes_result[0]); | 392 EXPECT_EQ(kHash3.prefix, prefixes_result[0]); |
| 397 | 393 |
| 398 ASSERT_EQ(1U, add_full_hashes_result.size()); | 394 ASSERT_EQ(1U, add_full_hashes_result.size()); |
| 399 EXPECT_EQ(kAddChunk3, add_full_hashes_result[0].chunk_id); | 395 EXPECT_EQ(kAddChunk3, add_full_hashes_result[0].chunk_id); |
| 400 EXPECT_TRUE(safe_browsing::SBFullHashEqual( | 396 EXPECT_TRUE(SBFullHashEqual( |
| 401 kHash6, add_full_hashes_result[0].full_hash)); | 397 kHash6, add_full_hashes_result[0].full_hash)); |
| 402 } | 398 } |
| 403 | 399 |
| 404 // Expected chunks are there in another update. | 400 // Expected chunks are there in another update. |
| 405 ASSERT_TRUE(store_->BeginUpdate()); | 401 ASSERT_TRUE(store_->BeginUpdate()); |
| 406 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1)); | 402 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1)); |
| 407 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk2)); | 403 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk2)); |
| 408 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk3)); | 404 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk3)); |
| 409 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk1)); | 405 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk1)); |
| 410 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk2)); | 406 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk2)); |
| 411 | 407 |
| 412 // Delete them, too. | 408 // Delete them, too. |
| 413 store_->DeleteAddChunk(kAddChunk2); | 409 store_->DeleteAddChunk(kAddChunk2); |
| 414 store_->DeleteAddChunk(kAddChunk3); | 410 store_->DeleteAddChunk(kAddChunk3); |
| 415 store_->DeleteSubChunk(kSubChunk2); | 411 store_->DeleteSubChunk(kSubChunk2); |
| 416 | 412 |
| 417 { | 413 { |
| 418 safe_browsing::PrefixSetBuilder builder; | 414 PrefixSetBuilder builder; |
| 419 std::vector<SBAddFullHash> add_full_hashes_result; | 415 std::vector<SBAddFullHash> add_full_hashes_result; |
| 420 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 416 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 421 | 417 |
| 422 std::vector<SBPrefix> prefixes_result; | 418 std::vector<SBPrefix> prefixes_result; |
| 423 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); | 419 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); |
| 424 EXPECT_TRUE(prefixes_result.empty()); | 420 EXPECT_TRUE(prefixes_result.empty()); |
| 425 EXPECT_TRUE(add_full_hashes_result.empty()); | 421 EXPECT_TRUE(add_full_hashes_result.empty()); |
| 426 } | 422 } |
| 427 | 423 |
| 428 // Expect no more chunks. | 424 // Expect no more chunks. |
| 429 ASSERT_TRUE(store_->BeginUpdate()); | 425 ASSERT_TRUE(store_->BeginUpdate()); |
| 430 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1)); | 426 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk1)); |
| 431 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk2)); | 427 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk2)); |
| 432 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk3)); | 428 EXPECT_FALSE(store_->CheckAddChunk(kAddChunk3)); |
| 433 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk1)); | 429 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk1)); |
| 434 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk2)); | 430 EXPECT_FALSE(store_->CheckSubChunk(kSubChunk2)); |
| 435 | 431 |
| 436 { | 432 { |
| 437 safe_browsing::PrefixSetBuilder builder; | 433 PrefixSetBuilder builder; |
| 438 std::vector<SBAddFullHash> add_full_hashes_result; | 434 std::vector<SBAddFullHash> add_full_hashes_result; |
| 439 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 435 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 440 | 436 |
| 441 std::vector<SBPrefix> prefixes_result; | 437 std::vector<SBPrefix> prefixes_result; |
| 442 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); | 438 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); |
| 443 EXPECT_TRUE(prefixes_result.empty()); | 439 EXPECT_TRUE(prefixes_result.empty()); |
| 444 EXPECT_TRUE(add_full_hashes_result.empty()); | 440 EXPECT_TRUE(add_full_hashes_result.empty()); |
| 445 } | 441 } |
| 446 } | 442 } |
| 447 | 443 |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 486 | 482 |
| 487 // Test basic corruption-handling. | 483 // Test basic corruption-handling. |
| 488 TEST_F(SafeBrowsingStoreFileTest, DetectsCorruption) { | 484 TEST_F(SafeBrowsingStoreFileTest, DetectsCorruption) { |
| 489 // Load a store with some data. | 485 // Load a store with some data. |
| 490 PopulateStore(); | 486 PopulateStore(); |
| 491 | 487 |
| 492 // Can successfully open and read the store. | 488 // Can successfully open and read the store. |
| 493 { | 489 { |
| 494 std::vector<SBPrefix> orig_prefixes; | 490 std::vector<SBPrefix> orig_prefixes; |
| 495 std::vector<SBAddFullHash> orig_hashes; | 491 std::vector<SBAddFullHash> orig_hashes; |
| 496 safe_browsing::PrefixSetBuilder builder; | 492 PrefixSetBuilder builder; |
| 497 ASSERT_TRUE(store_->BeginUpdate()); | 493 ASSERT_TRUE(store_->BeginUpdate()); |
| 498 EXPECT_TRUE(store_->FinishUpdate(&builder, &orig_hashes)); | 494 EXPECT_TRUE(store_->FinishUpdate(&builder, &orig_hashes)); |
| 499 builder.GetPrefixSetNoHashes()->GetPrefixes(&orig_prefixes); | 495 builder.GetPrefixSetNoHashes()->GetPrefixes(&orig_prefixes); |
| 500 EXPECT_GT(orig_prefixes.size(), 0U); | 496 EXPECT_GT(orig_prefixes.size(), 0U); |
| 501 EXPECT_GT(orig_hashes.size(), 0U); | 497 EXPECT_GT(orig_hashes.size(), 0U); |
| 502 EXPECT_FALSE(corruption_detected_); | 498 EXPECT_FALSE(corruption_detected_); |
| 503 } | 499 } |
| 504 | 500 |
| 505 // Corrupt the store. | 501 // Corrupt the store. |
| 506 base::ScopedFILE file(base::OpenFile(filename_, "rb+")); | 502 base::ScopedFILE file(base::OpenFile(filename_, "rb+")); |
| 507 const long kOffset = 60; | 503 const long kOffset = 60; |
| 508 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0); | 504 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0); |
| 509 const uint32 kZero = 0; | 505 const uint32 kZero = 0; |
| 510 uint32 previous = kZero; | 506 uint32 previous = kZero; |
| 511 EXPECT_EQ(fread(&previous, sizeof(previous), 1, file.get()), 1U); | 507 EXPECT_EQ(fread(&previous, sizeof(previous), 1, file.get()), 1U); |
| 512 EXPECT_NE(previous, kZero); | 508 EXPECT_NE(previous, kZero); |
| 513 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0); | 509 EXPECT_EQ(fseek(file.get(), kOffset, SEEK_SET), 0); |
| 514 EXPECT_EQ(fwrite(&kZero, sizeof(kZero), 1, file.get()), 1U); | 510 EXPECT_EQ(fwrite(&kZero, sizeof(kZero), 1, file.get()), 1U); |
| 515 file.reset(); | 511 file.reset(); |
| 516 | 512 |
| 517 // Update fails and corruption callback is called. | 513 // Update fails and corruption callback is called. |
| 518 std::vector<SBAddFullHash> add_hashes; | 514 std::vector<SBAddFullHash> add_hashes; |
| 519 corruption_detected_ = false; | 515 corruption_detected_ = false; |
| 520 { | 516 { |
| 521 safe_browsing::PrefixSetBuilder builder; | 517 PrefixSetBuilder builder; |
| 522 ASSERT_TRUE(store_->BeginUpdate()); | 518 ASSERT_TRUE(store_->BeginUpdate()); |
| 523 EXPECT_FALSE(store_->FinishUpdate(&builder, &add_hashes)); | 519 EXPECT_FALSE(store_->FinishUpdate(&builder, &add_hashes)); |
| 524 EXPECT_TRUE(corruption_detected_); | 520 EXPECT_TRUE(corruption_detected_); |
| 525 } | 521 } |
| 526 | 522 |
| 527 // Make it look like there is a lot of add-chunks-seen data. | 523 // Make it look like there is a lot of add-chunks-seen data. |
| 528 const long kAddChunkCountOffset = 2 * sizeof(int32); | 524 const long kAddChunkCountOffset = 2 * sizeof(int32); |
| 529 const int32 kLargeCount = 1000 * 1000 * 1000; | 525 const int32 kLargeCount = 1000 * 1000 * 1000; |
| 530 file.reset(base::OpenFile(filename_, "rb+")); | 526 file.reset(base::OpenFile(filename_, "rb+")); |
| 531 EXPECT_EQ(fseek(file.get(), kAddChunkCountOffset, SEEK_SET), 0); | 527 EXPECT_EQ(fseek(file.get(), kAddChunkCountOffset, SEEK_SET), 0); |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 648 std::vector<int> chunks; | 644 std::vector<int> chunks; |
| 649 store_->GetAddChunks(&chunks); | 645 store_->GetAddChunks(&chunks); |
| 650 ASSERT_EQ(2U, chunks.size()); | 646 ASSERT_EQ(2U, chunks.size()); |
| 651 EXPECT_EQ(kAddChunk1, chunks[0]); | 647 EXPECT_EQ(kAddChunk1, chunks[0]); |
| 652 EXPECT_EQ(kAddChunk2, chunks[1]); | 648 EXPECT_EQ(kAddChunk2, chunks[1]); |
| 653 | 649 |
| 654 store_->GetSubChunks(&chunks); | 650 store_->GetSubChunks(&chunks); |
| 655 ASSERT_EQ(1U, chunks.size()); | 651 ASSERT_EQ(1U, chunks.size()); |
| 656 EXPECT_EQ(kSubChunk1, chunks[0]); | 652 EXPECT_EQ(kSubChunk1, chunks[0]); |
| 657 | 653 |
| 658 safe_browsing::PrefixSetBuilder builder; | 654 PrefixSetBuilder builder; |
| 659 std::vector<SBAddFullHash> add_full_hashes_result; | 655 std::vector<SBAddFullHash> add_full_hashes_result; |
| 660 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 656 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 661 | 657 |
| 662 SBAddPrefixes add_prefixes; | 658 SBAddPrefixes add_prefixes; |
| 663 EXPECT_TRUE(store_->GetAddPrefixes(&add_prefixes)); | 659 EXPECT_TRUE(store_->GetAddPrefixes(&add_prefixes)); |
| 664 ASSERT_EQ(2U, add_prefixes.size()); | 660 ASSERT_EQ(2U, add_prefixes.size()); |
| 665 EXPECT_EQ(kAddChunk1, add_prefixes[0].chunk_id); | 661 EXPECT_EQ(kAddChunk1, add_prefixes[0].chunk_id); |
| 666 EXPECT_EQ(kHash1.prefix, add_prefixes[0].prefix); | 662 EXPECT_EQ(kHash1.prefix, add_prefixes[0].prefix); |
| 667 EXPECT_EQ(kAddChunk1, add_prefixes[1].chunk_id); | 663 EXPECT_EQ(kAddChunk1, add_prefixes[1].chunk_id); |
| 668 EXPECT_EQ(kHash2.prefix, add_prefixes[1].prefix); | 664 EXPECT_EQ(kHash2.prefix, add_prefixes[1].prefix); |
| 669 | 665 |
| 670 std::vector<SBAddFullHash> add_hashes; | 666 std::vector<SBAddFullHash> add_hashes; |
| 671 EXPECT_TRUE(store_->GetAddFullHashes(&add_hashes)); | 667 EXPECT_TRUE(store_->GetAddFullHashes(&add_hashes)); |
| 672 ASSERT_EQ(1U, add_hashes.size()); | 668 ASSERT_EQ(1U, add_hashes.size()); |
| 673 EXPECT_EQ(kAddChunk2, add_hashes[0].chunk_id); | 669 EXPECT_EQ(kAddChunk2, add_hashes[0].chunk_id); |
| 674 EXPECT_TRUE(safe_browsing::SBFullHashEqual(kHash4, add_hashes[0].full_hash)); | 670 EXPECT_TRUE(SBFullHashEqual(kHash4, add_hashes[0].full_hash)); |
| 675 } | 671 } |
| 676 | 672 |
| 677 // Test that the database handles resharding correctly, both when growing and | 673 // Test that the database handles resharding correctly, both when growing and |
| 678 // which shrinking. | 674 // which shrinking. |
| 679 TEST_F(SafeBrowsingStoreFileTest, Resharding) { | 675 TEST_F(SafeBrowsingStoreFileTest, Resharding) { |
| 680 // Loop through multiple stride boundaries (1<<32, 1<<31, 1<<30, 1<<29). | 676 // Loop through multiple stride boundaries (1<<32, 1<<31, 1<<30, 1<<29). |
| 681 const uint32 kTargetStride = 1 << 29; | 677 const uint32 kTargetStride = 1 << 29; |
| 682 | 678 |
| 683 // Each chunk will require 8 bytes per prefix, plus 4 bytes for chunk | 679 // Each chunk will require 8 bytes per prefix, plus 4 bytes for chunk |
| 684 // information. It should be less than |kTargetFootprint| in the | 680 // information. It should be less than |kTargetFootprint| in the |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 695 ASSERT_TRUE(store_->BeginUpdate()); | 691 ASSERT_TRUE(store_->BeginUpdate()); |
| 696 | 692 |
| 697 EXPECT_TRUE(store_->BeginChunk()); | 693 EXPECT_TRUE(store_->BeginChunk()); |
| 698 store_->SetAddChunk(chunk_id); | 694 store_->SetAddChunk(chunk_id); |
| 699 EXPECT_TRUE(store_->CheckAddChunk(chunk_id)); | 695 EXPECT_TRUE(store_->CheckAddChunk(chunk_id)); |
| 700 for (size_t i = 0; i < kPrefixesPerChunk; ++i) { | 696 for (size_t i = 0; i < kPrefixesPerChunk; ++i) { |
| 701 EXPECT_TRUE(store_->WriteAddPrefix(chunk_id, static_cast<SBPrefix>(i))); | 697 EXPECT_TRUE(store_->WriteAddPrefix(chunk_id, static_cast<SBPrefix>(i))); |
| 702 } | 698 } |
| 703 EXPECT_TRUE(store_->FinishChunk()); | 699 EXPECT_TRUE(store_->FinishChunk()); |
| 704 | 700 |
| 705 safe_browsing::PrefixSetBuilder builder; | 701 PrefixSetBuilder builder; |
| 706 std::vector<SBAddFullHash> add_full_hashes_result; | 702 std::vector<SBAddFullHash> add_full_hashes_result; |
| 707 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 703 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 708 | 704 |
| 709 SBAddPrefixes add_prefixes; | 705 SBAddPrefixes add_prefixes; |
| 710 EXPECT_TRUE(store_->GetAddPrefixes(&add_prefixes)); | 706 EXPECT_TRUE(store_->GetAddPrefixes(&add_prefixes)); |
| 711 ASSERT_EQ(chunk_id * kPrefixesPerChunk, add_prefixes.size()); | 707 ASSERT_EQ(chunk_id * kPrefixesPerChunk, add_prefixes.size()); |
| 712 | 708 |
| 713 // New stride should be the same, or shifted one right. | 709 // New stride should be the same, or shifted one right. |
| 714 const uint32 new_shard_stride = ReadStride(); | 710 const uint32 new_shard_stride = ReadStride(); |
| 715 EXPECT_TRUE((new_shard_stride == shard_stride) || | 711 EXPECT_TRUE((new_shard_stride == shard_stride) || |
| 716 ((new_shard_stride << 1) == shard_stride)); | 712 ((new_shard_stride << 1) == shard_stride)); |
| 717 shard_stride = new_shard_stride; | 713 shard_stride = new_shard_stride; |
| 718 ++chunk_id; | 714 ++chunk_id; |
| 719 } while (!shard_stride || shard_stride > kTargetStride); | 715 } while (!shard_stride || shard_stride > kTargetStride); |
| 720 | 716 |
| 721 // Guard against writing too many chunks. If this gets too big, adjust | 717 // Guard against writing too many chunks. If this gets too big, adjust |
| 722 // |kPrefixesPerChunk|. | 718 // |kPrefixesPerChunk|. |
| 723 EXPECT_LT(chunk_id, 20); | 719 EXPECT_LT(chunk_id, 20); |
| 724 | 720 |
| 725 // Remove each chunk and check that the stride goes back to 0. | 721 // Remove each chunk and check that the stride goes back to 0. |
| 726 while (--chunk_id) { | 722 while (--chunk_id) { |
| 727 ASSERT_TRUE(store_->BeginUpdate()); | 723 ASSERT_TRUE(store_->BeginUpdate()); |
| 728 EXPECT_TRUE(store_->CheckAddChunk(chunk_id)); | 724 EXPECT_TRUE(store_->CheckAddChunk(chunk_id)); |
| 729 EXPECT_FALSE(store_->CheckAddChunk(chunk_id + 1)); | 725 EXPECT_FALSE(store_->CheckAddChunk(chunk_id + 1)); |
| 730 store_->DeleteAddChunk(chunk_id); | 726 store_->DeleteAddChunk(chunk_id); |
| 731 | 727 |
| 732 safe_browsing::PrefixSetBuilder builder; | 728 PrefixSetBuilder builder; |
| 733 std::vector<SBAddFullHash> add_full_hashes_result; | 729 std::vector<SBAddFullHash> add_full_hashes_result; |
| 734 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 730 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 735 | 731 |
| 736 // New stride should be the same, or shifted one left. | 732 // New stride should be the same, or shifted one left. |
| 737 const uint32 new_shard_stride = ReadStride(); | 733 const uint32 new_shard_stride = ReadStride(); |
| 738 EXPECT_TRUE((new_shard_stride == shard_stride) || | 734 EXPECT_TRUE((new_shard_stride == shard_stride) || |
| 739 (new_shard_stride == (shard_stride << 1))); | 735 (new_shard_stride == (shard_stride << 1))); |
| 740 shard_stride = new_shard_stride; | 736 shard_stride = new_shard_stride; |
| 741 } | 737 } |
| 742 EXPECT_EQ(0u, shard_stride); | 738 EXPECT_EQ(0u, shard_stride); |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 806 ASSERT_EQ(2U, add_prefixes.size()); | 802 ASSERT_EQ(2U, add_prefixes.size()); |
| 807 EXPECT_EQ(kAddChunk1, add_prefixes[0].chunk_id); | 803 EXPECT_EQ(kAddChunk1, add_prefixes[0].chunk_id); |
| 808 EXPECT_EQ(kHash1.prefix, add_prefixes[0].prefix); | 804 EXPECT_EQ(kHash1.prefix, add_prefixes[0].prefix); |
| 809 EXPECT_EQ(kAddChunk1, add_prefixes[1].chunk_id); | 805 EXPECT_EQ(kAddChunk1, add_prefixes[1].chunk_id); |
| 810 EXPECT_EQ(kHash2.prefix, add_prefixes[1].prefix); | 806 EXPECT_EQ(kHash2.prefix, add_prefixes[1].prefix); |
| 811 | 807 |
| 812 std::vector<SBAddFullHash> add_hashes; | 808 std::vector<SBAddFullHash> add_hashes; |
| 813 EXPECT_TRUE(store_->GetAddFullHashes(&add_hashes)); | 809 EXPECT_TRUE(store_->GetAddFullHashes(&add_hashes)); |
| 814 ASSERT_EQ(1U, add_hashes.size()); | 810 ASSERT_EQ(1U, add_hashes.size()); |
| 815 EXPECT_EQ(kAddChunk1, add_hashes[0].chunk_id); | 811 EXPECT_EQ(kAddChunk1, add_hashes[0].chunk_id); |
| 816 EXPECT_TRUE(safe_browsing::SBFullHashEqual(kHash2, add_hashes[0].full_hash)); | 812 EXPECT_TRUE(SBFullHashEqual(kHash2, add_hashes[0].full_hash)); |
| 817 | 813 |
| 818 // Attempt an update to make sure things work end-to-end. | 814 // Attempt an update to make sure things work end-to-end. |
| 819 EXPECT_TRUE(store_->BeginUpdate()); | 815 EXPECT_TRUE(store_->BeginUpdate()); |
| 820 | 816 |
| 821 // Still has the chunks expected in the next update. | 817 // Still has the chunks expected in the next update. |
| 822 std::vector<int> chunks; | 818 std::vector<int> chunks; |
| 823 store_->GetAddChunks(&chunks); | 819 store_->GetAddChunks(&chunks); |
| 824 ASSERT_EQ(1U, chunks.size()); | 820 ASSERT_EQ(1U, chunks.size()); |
| 825 EXPECT_EQ(kAddChunk1, chunks[0]); | 821 EXPECT_EQ(kAddChunk1, chunks[0]); |
| 826 | 822 |
| 827 store_->GetSubChunks(&chunks); | 823 store_->GetSubChunks(&chunks); |
| 828 ASSERT_EQ(1U, chunks.size()); | 824 ASSERT_EQ(1U, chunks.size()); |
| 829 EXPECT_EQ(kSubChunk1, chunks[0]); | 825 EXPECT_EQ(kSubChunk1, chunks[0]); |
| 830 | 826 |
| 831 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1)); | 827 EXPECT_TRUE(store_->CheckAddChunk(kAddChunk1)); |
| 832 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); | 828 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); |
| 833 | 829 |
| 834 // Sub chunk kAddChunk1 hash kHash2. | 830 // Sub chunk kAddChunk1 hash kHash2. |
| 835 // NOTE(shess): Having full hashes and prefixes in the same chunk is no longer | 831 // NOTE(shess): Having full hashes and prefixes in the same chunk is no longer |
| 836 // supported, though it was when this code was written. | 832 // supported, though it was when this code was written. |
| 837 store_->SetSubChunk(kSubChunk2); | 833 store_->SetSubChunk(kSubChunk2); |
| 838 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); | 834 EXPECT_TRUE(store_->CheckSubChunk(kSubChunk1)); |
| 839 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk1, kHash2.prefix)); | 835 EXPECT_TRUE(store_->WriteSubPrefix(kSubChunk1, kAddChunk1, kHash2.prefix)); |
| 840 EXPECT_TRUE(store_->WriteSubHash(kSubChunk1, kAddChunk1, kHash2)); | 836 EXPECT_TRUE(store_->WriteSubHash(kSubChunk1, kAddChunk1, kHash2)); |
| 841 EXPECT_TRUE(store_->FinishChunk()); | 837 EXPECT_TRUE(store_->FinishChunk()); |
| 842 | 838 |
| 843 { | 839 { |
| 844 safe_browsing::PrefixSetBuilder builder; | 840 PrefixSetBuilder builder; |
| 845 std::vector<SBAddFullHash> add_full_hashes_result; | 841 std::vector<SBAddFullHash> add_full_hashes_result; |
| 846 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); | 842 EXPECT_TRUE(store_->FinishUpdate(&builder, &add_full_hashes_result)); |
| 847 | 843 |
| 848 // The sub'ed prefix and hash are gone. | 844 // The sub'ed prefix and hash are gone. |
| 849 std::vector<SBPrefix> prefixes_result; | 845 std::vector<SBPrefix> prefixes_result; |
| 850 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); | 846 builder.GetPrefixSetNoHashes()->GetPrefixes(&prefixes_result); |
| 851 ASSERT_EQ(1U, prefixes_result.size()); | 847 ASSERT_EQ(1U, prefixes_result.size()); |
| 852 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); | 848 EXPECT_EQ(kHash1.prefix, prefixes_result[0]); |
| 853 EXPECT_TRUE(add_full_hashes_result.empty()); | 849 EXPECT_TRUE(add_full_hashes_result.empty()); |
| 854 } | 850 } |
| 855 } | 851 } |
| 856 #endif | 852 #endif |
| 857 | 853 |
| 858 } // namespace safe_browsing | 854 } // namespace safe_browsing |
| OLD | NEW |