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 |