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