Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(9)

Side by Side Diff: chrome/browser/safe_browsing/prefix_set_unittest.cc

Issue 781613002: Make SafeBrowsingDatabase's PrefixSets only updatable by swapping a new one in. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@a2_threadchecks
Patch Set: rebase off of CL 744183002 Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/prefix_set.h" 5 #include "chrome/browser/safe_browsing/prefix_set.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <iterator> 8 #include <iterator>
9 #include <set> 9 #include <set>
10 #include <string> 10 #include <string>
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 // Test that a small sparse random input works. 214 // Test that a small sparse random input works.
215 TEST_F(PrefixSetTest, Baseline) { 215 TEST_F(PrefixSetTest, Baseline) {
216 PrefixSetBuilder builder(shared_prefixes_); 216 PrefixSetBuilder builder(shared_prefixes_);
217 CheckPrefixes(*builder.GetPrefixSetNoHashes(), shared_prefixes_); 217 CheckPrefixes(*builder.GetPrefixSetNoHashes(), shared_prefixes_);
218 } 218 }
219 219
220 // Test that the empty set doesn't appear to have anything in it. 220 // Test that the empty set doesn't appear to have anything in it.
221 TEST_F(PrefixSetTest, Empty) { 221 TEST_F(PrefixSetTest, Empty) {
222 const std::vector<SBPrefix> empty; 222 const std::vector<SBPrefix> empty;
223 PrefixSetBuilder builder(empty); 223 PrefixSetBuilder builder(empty);
224 scoped_ptr<PrefixSet> prefix_set = builder.GetPrefixSetNoHashes(); 224 scoped_ptr<const PrefixSet> prefix_set = builder.GetPrefixSetNoHashes();
225 for (size_t i = 0; i < shared_prefixes_.size(); ++i) { 225 for (size_t i = 0; i < shared_prefixes_.size(); ++i) {
226 EXPECT_FALSE(prefix_set->PrefixExists(shared_prefixes_[i])); 226 EXPECT_FALSE(prefix_set->PrefixExists(shared_prefixes_[i]));
227 } 227 }
228 } 228 }
229 229
230 // Single-element set should work fine. 230 // Single-element set should work fine.
231 TEST_F(PrefixSetTest, OneElement) { 231 TEST_F(PrefixSetTest, OneElement) {
232 const std::vector<SBPrefix> prefixes(100, 0u); 232 const std::vector<SBPrefix> prefixes(100, 0u);
233 PrefixSetBuilder builder(prefixes); 233 PrefixSetBuilder builder(prefixes);
234 scoped_ptr<PrefixSet> prefix_set = builder.GetPrefixSetNoHashes(); 234 scoped_ptr<const PrefixSet> prefix_set = builder.GetPrefixSetNoHashes();
235 EXPECT_FALSE(prefix_set->PrefixExists(static_cast<SBPrefix>(-1))); 235 EXPECT_FALSE(prefix_set->PrefixExists(static_cast<SBPrefix>(-1)));
236 EXPECT_TRUE(prefix_set->PrefixExists(prefixes[0])); 236 EXPECT_TRUE(prefix_set->PrefixExists(prefixes[0]));
237 EXPECT_FALSE(prefix_set->PrefixExists(1u)); 237 EXPECT_FALSE(prefix_set->PrefixExists(1u));
238 238
239 // Check that |GetPrefixes()| returns the same set of prefixes as 239 // Check that |GetPrefixes()| returns the same set of prefixes as
240 // was passed in. 240 // was passed in.
241 std::vector<SBPrefix> prefixes_copy; 241 std::vector<SBPrefix> prefixes_copy;
242 prefix_set->GetPrefixes(&prefixes_copy); 242 prefix_set->GetPrefixes(&prefixes_copy);
243 EXPECT_EQ(1U, prefixes_copy.size()); 243 EXPECT_EQ(1U, prefixes_copy.size());
244 EXPECT_EQ(prefixes[0], prefixes_copy[0]); 244 EXPECT_EQ(prefixes[0], prefixes_copy[0]);
245 } 245 }
246 246
247 // Edges of the 32-bit integer range. 247 // Edges of the 32-bit integer range.
248 TEST_F(PrefixSetTest, IntMinMax) { 248 TEST_F(PrefixSetTest, IntMinMax) {
249 std::vector<SBPrefix> prefixes; 249 std::vector<SBPrefix> prefixes;
250 250
251 // Using bit patterns rather than portable constants because this 251 // Using bit patterns rather than portable constants because this
252 // really is testing how the entire 32-bit integer range is handled. 252 // really is testing how the entire 32-bit integer range is handled.
253 prefixes.push_back(0x00000000); 253 prefixes.push_back(0x00000000);
254 prefixes.push_back(0x0000FFFF); 254 prefixes.push_back(0x0000FFFF);
255 prefixes.push_back(0x7FFF0000); 255 prefixes.push_back(0x7FFF0000);
256 prefixes.push_back(0x7FFFFFFF); 256 prefixes.push_back(0x7FFFFFFF);
257 prefixes.push_back(0x80000000); 257 prefixes.push_back(0x80000000);
258 prefixes.push_back(0x8000FFFF); 258 prefixes.push_back(0x8000FFFF);
259 prefixes.push_back(0xFFFF0000); 259 prefixes.push_back(0xFFFF0000);
260 prefixes.push_back(0xFFFFFFFF); 260 prefixes.push_back(0xFFFFFFFF);
261 261
262 std::sort(prefixes.begin(), prefixes.end()); 262 std::sort(prefixes.begin(), prefixes.end());
263 PrefixSetBuilder builder(prefixes); 263 PrefixSetBuilder builder(prefixes);
264 scoped_ptr<PrefixSet> prefix_set = builder.GetPrefixSetNoHashes(); 264 scoped_ptr<const PrefixSet> prefix_set = builder.GetPrefixSetNoHashes();
265 265
266 // Check that |GetPrefixes()| returns the same set of prefixes as 266 // Check that |GetPrefixes()| returns the same set of prefixes as
267 // was passed in. 267 // was passed in.
268 std::vector<SBPrefix> prefixes_copy; 268 std::vector<SBPrefix> prefixes_copy;
269 prefix_set->GetPrefixes(&prefixes_copy); 269 prefix_set->GetPrefixes(&prefixes_copy);
270 ASSERT_EQ(prefixes_copy.size(), prefixes.size()); 270 ASSERT_EQ(prefixes_copy.size(), prefixes.size());
271 EXPECT_TRUE(std::equal(prefixes.begin(), prefixes.end(), 271 EXPECT_TRUE(std::equal(prefixes.begin(), prefixes.end(),
272 prefixes_copy.begin())); 272 prefixes_copy.begin()));
273 } 273 }
274 274
275 // A range with only large deltas. 275 // A range with only large deltas.
276 TEST_F(PrefixSetTest, AllBig) { 276 TEST_F(PrefixSetTest, AllBig) {
277 std::vector<SBPrefix> prefixes; 277 std::vector<SBPrefix> prefixes;
278 278
279 const unsigned kDelta = 10 * 1000 * 1000; 279 const unsigned kDelta = 10 * 1000 * 1000;
280 for (SBPrefix prefix = kHighBitSet; 280 for (SBPrefix prefix = kHighBitSet;
281 prefix < kHighBitClear; prefix += kDelta) { 281 prefix < kHighBitClear; prefix += kDelta) {
282 prefixes.push_back(prefix); 282 prefixes.push_back(prefix);
283 } 283 }
284 284
285 std::sort(prefixes.begin(), prefixes.end()); 285 std::sort(prefixes.begin(), prefixes.end());
286 PrefixSetBuilder builder(prefixes); 286 PrefixSetBuilder builder(prefixes);
287 scoped_ptr<PrefixSet> prefix_set = builder.GetPrefixSetNoHashes(); 287 scoped_ptr<const PrefixSet> prefix_set = builder.GetPrefixSetNoHashes();
288 288
289 // Check that |GetPrefixes()| returns the same set of prefixes as 289 // Check that |GetPrefixes()| returns the same set of prefixes as
290 // was passed in. 290 // was passed in.
291 std::vector<SBPrefix> prefixes_copy; 291 std::vector<SBPrefix> prefixes_copy;
292 prefix_set->GetPrefixes(&prefixes_copy); 292 prefix_set->GetPrefixes(&prefixes_copy);
293 prefixes.erase(std::unique(prefixes.begin(), prefixes.end()), prefixes.end()); 293 prefixes.erase(std::unique(prefixes.begin(), prefixes.end()), prefixes.end());
294 EXPECT_EQ(prefixes_copy.size(), prefixes.size()); 294 EXPECT_EQ(prefixes_copy.size(), prefixes.size());
295 EXPECT_TRUE(std::equal(prefixes.begin(), prefixes.end(), 295 EXPECT_TRUE(std::equal(prefixes.begin(), prefixes.end(),
296 prefixes_copy.begin())); 296 prefixes_copy.begin()));
297 } 297 }
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 prefix = kHighBitClear - delta * 1000; 331 prefix = kHighBitClear - delta * 1000;
332 prefixes.push_back(prefix); 332 prefixes.push_back(prefix);
333 for (int i = 0; i < 1000; ++i) { 333 for (int i = 0; i < 1000; ++i) {
334 prefix += delta; 334 prefix += delta;
335 prefixes.push_back(prefix); 335 prefixes.push_back(prefix);
336 delta--; 336 delta--;
337 } 337 }
338 338
339 std::sort(prefixes.begin(), prefixes.end()); 339 std::sort(prefixes.begin(), prefixes.end());
340 PrefixSetBuilder builder(prefixes); 340 PrefixSetBuilder builder(prefixes);
341 scoped_ptr<PrefixSet> prefix_set = builder.GetPrefixSetNoHashes(); 341 scoped_ptr<const PrefixSet> prefix_set = builder.GetPrefixSetNoHashes();
342 342
343 // Check that |GetPrefixes()| returns the same set of prefixes as 343 // Check that |GetPrefixes()| returns the same set of prefixes as
344 // was passed in. 344 // was passed in.
345 std::vector<SBPrefix> prefixes_copy; 345 std::vector<SBPrefix> prefixes_copy;
346 prefix_set->GetPrefixes(&prefixes_copy); 346 prefix_set->GetPrefixes(&prefixes_copy);
347 prefixes.erase(std::unique(prefixes.begin(), prefixes.end()), prefixes.end()); 347 prefixes.erase(std::unique(prefixes.begin(), prefixes.end()), prefixes.end());
348 EXPECT_EQ(prefixes_copy.size(), prefixes.size()); 348 EXPECT_EQ(prefixes_copy.size(), prefixes.size());
349 EXPECT_TRUE(std::equal(prefixes.begin(), prefixes.end(), 349 EXPECT_TRUE(std::equal(prefixes.begin(), prefixes.end(),
350 prefixes_copy.begin())); 350 prefixes_copy.begin()));
351 351
(...skipping 13 matching lines...) Expand all
365 } 365 }
366 366
367 // Test writing a prefix set to disk and reading it back in. 367 // Test writing a prefix set to disk and reading it back in.
368 TEST_F(PrefixSetTest, ReadWrite) { 368 TEST_F(PrefixSetTest, ReadWrite) {
369 base::FilePath filename; 369 base::FilePath filename;
370 370
371 // Write the sample prefix set out, read it back in, and check all 371 // Write the sample prefix set out, read it back in, and check all
372 // the prefixes. Leaves the path in |filename|. 372 // the prefixes. Leaves the path in |filename|.
373 { 373 {
374 ASSERT_TRUE(GetPrefixSetFile(&filename)); 374 ASSERT_TRUE(GetPrefixSetFile(&filename));
375 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 375 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
376 ASSERT_TRUE(prefix_set.get()); 376 ASSERT_TRUE(prefix_set.get());
377 CheckPrefixes(*prefix_set, shared_prefixes_); 377 CheckPrefixes(*prefix_set, shared_prefixes_);
378 } 378 }
379 379
380 // Test writing and reading a very sparse set containing no deltas. 380 // Test writing and reading a very sparse set containing no deltas.
381 { 381 {
382 std::vector<SBPrefix> prefixes; 382 std::vector<SBPrefix> prefixes;
383 prefixes.push_back(kHighBitClear); 383 prefixes.push_back(kHighBitClear);
384 prefixes.push_back(kHighBitSet); 384 prefixes.push_back(kHighBitSet);
385 385
386 PrefixSetBuilder builder(prefixes); 386 PrefixSetBuilder builder(prefixes);
387 ASSERT_TRUE(builder.GetPrefixSetNoHashes()->WriteFile(filename)); 387 ASSERT_TRUE(builder.GetPrefixSetNoHashes()->WriteFile(filename));
388 388
389 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 389 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
390 ASSERT_TRUE(prefix_set.get()); 390 ASSERT_TRUE(prefix_set.get());
391 CheckPrefixes(*prefix_set, prefixes); 391 CheckPrefixes(*prefix_set, prefixes);
392 } 392 }
393 393
394 // Test writing and reading an empty set. 394 // Test writing and reading an empty set.
395 { 395 {
396 std::vector<SBPrefix> prefixes; 396 std::vector<SBPrefix> prefixes;
397 PrefixSetBuilder builder(prefixes); 397 PrefixSetBuilder builder(prefixes);
398 ASSERT_TRUE(builder.GetPrefixSetNoHashes()->WriteFile(filename)); 398 ASSERT_TRUE(builder.GetPrefixSetNoHashes()->WriteFile(filename));
399 399
400 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 400 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
401 ASSERT_TRUE(prefix_set.get()); 401 ASSERT_TRUE(prefix_set.get());
402 CheckPrefixes(*prefix_set, prefixes); 402 CheckPrefixes(*prefix_set, prefixes);
403 } 403 }
404 404
405 // Test that full hashes are persisted. 405 // Test that full hashes are persisted.
406 { 406 {
407 std::vector<SBFullHash> hashes; 407 std::vector<SBFullHash> hashes;
408 hashes.push_back(SBFullHashForString("one")); 408 hashes.push_back(SBFullHashForString("one"));
409 hashes.push_back(SBFullHashForString("two")); 409 hashes.push_back(SBFullHashForString("two"));
410 hashes.push_back(SBFullHashForString("three")); 410 hashes.push_back(SBFullHashForString("three"));
411 411
412 std::vector<SBPrefix> prefixes(shared_prefixes_); 412 std::vector<SBPrefix> prefixes(shared_prefixes_);
413 413
414 // Remove any collisions from the prefixes. 414 // Remove any collisions from the prefixes.
415 for (size_t i = 0; i < hashes.size(); ++i) { 415 for (size_t i = 0; i < hashes.size(); ++i) {
416 std::vector<SBPrefix>::iterator iter = 416 std::vector<SBPrefix>::iterator iter =
417 std::lower_bound(prefixes.begin(), prefixes.end(), hashes[i].prefix); 417 std::lower_bound(prefixes.begin(), prefixes.end(), hashes[i].prefix);
418 if (iter != prefixes.end() && *iter == hashes[i].prefix) 418 if (iter != prefixes.end() && *iter == hashes[i].prefix)
419 prefixes.erase(iter); 419 prefixes.erase(iter);
420 } 420 }
421 421
422 PrefixSetBuilder builder(prefixes); 422 PrefixSetBuilder builder(prefixes);
423 ASSERT_TRUE(builder.GetPrefixSet(hashes)->WriteFile(filename)); 423 ASSERT_TRUE(builder.GetPrefixSet(hashes)->WriteFile(filename));
424 424
425 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 425 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
426 ASSERT_TRUE(prefix_set.get()); 426 ASSERT_TRUE(prefix_set.get());
427 CheckPrefixes(*prefix_set, prefixes); 427 CheckPrefixes(*prefix_set, prefixes);
428 428
429 EXPECT_TRUE(prefix_set->Exists(hashes[0])); 429 EXPECT_TRUE(prefix_set->Exists(hashes[0]));
430 EXPECT_TRUE(prefix_set->Exists(hashes[1])); 430 EXPECT_TRUE(prefix_set->Exists(hashes[1]));
431 EXPECT_TRUE(prefix_set->Exists(hashes[2])); 431 EXPECT_TRUE(prefix_set->Exists(hashes[2]));
432 EXPECT_FALSE(prefix_set->PrefixExists(hashes[0].prefix)); 432 EXPECT_FALSE(prefix_set->PrefixExists(hashes[0].prefix));
433 EXPECT_FALSE(prefix_set->PrefixExists(hashes[1].prefix)); 433 EXPECT_FALSE(prefix_set->PrefixExists(hashes[1].prefix));
434 EXPECT_FALSE(prefix_set->PrefixExists(hashes[2].prefix)); 434 EXPECT_FALSE(prefix_set->PrefixExists(hashes[2].prefix));
435 } 435 }
436 } 436 }
437 437
438 // Check that |CleanChecksum()| makes an acceptable checksum. 438 // Check that |CleanChecksum()| makes an acceptable checksum.
439 TEST_F(PrefixSetTest, CorruptionHelpers) { 439 TEST_F(PrefixSetTest, CorruptionHelpers) {
440 base::FilePath filename; 440 base::FilePath filename;
441 ASSERT_TRUE(GetPrefixSetFile(&filename)); 441 ASSERT_TRUE(GetPrefixSetFile(&filename));
442 442
443 // This will modify data in |index_|, which will fail the digest check. 443 // This will modify data in |index_|, which will fail the digest check.
444 base::ScopedFILE file(base::OpenFile(filename, "r+b")); 444 base::ScopedFILE file(base::OpenFile(filename, "r+b"));
445 IncrementIntAt(file.get(), kPayloadOffset, 1); 445 IncrementIntAt(file.get(), kPayloadOffset, 1);
446 file.reset(); 446 file.reset();
447 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 447 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
448 ASSERT_FALSE(prefix_set.get()); 448 ASSERT_FALSE(prefix_set.get());
449 449
450 // Fix up the checksum and it will read successfully (though the 450 // Fix up the checksum and it will read successfully (though the
451 // data will be wrong). 451 // data will be wrong).
452 file.reset(base::OpenFile(filename, "r+b")); 452 file.reset(base::OpenFile(filename, "r+b"));
453 CleanChecksum(file.get()); 453 CleanChecksum(file.get());
454 file.reset(); 454 file.reset();
455 prefix_set = PrefixSet::LoadFile(filename); 455 prefix_set = PrefixSet::LoadFile(filename);
456 ASSERT_TRUE(prefix_set.get()); 456 ASSERT_TRUE(prefix_set.get());
457 } 457 }
458 458
459 // Bad magic is caught by the sanity check. 459 // Bad magic is caught by the sanity check.
460 TEST_F(PrefixSetTest, CorruptionMagic) { 460 TEST_F(PrefixSetTest, CorruptionMagic) {
461 base::FilePath filename; 461 base::FilePath filename;
462 ASSERT_TRUE(GetPrefixSetFile(&filename)); 462 ASSERT_TRUE(GetPrefixSetFile(&filename));
463 463
464 ASSERT_NO_FATAL_FAILURE( 464 ASSERT_NO_FATAL_FAILURE(
465 ModifyAndCleanChecksum(filename, kMagicOffset, 1)); 465 ModifyAndCleanChecksum(filename, kMagicOffset, 1));
466 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 466 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
467 ASSERT_FALSE(prefix_set.get()); 467 ASSERT_FALSE(prefix_set.get());
468 } 468 }
469 469
470 // Bad version is caught by the sanity check. 470 // Bad version is caught by the sanity check.
471 TEST_F(PrefixSetTest, CorruptionVersion) { 471 TEST_F(PrefixSetTest, CorruptionVersion) {
472 base::FilePath filename; 472 base::FilePath filename;
473 ASSERT_TRUE(GetPrefixSetFile(&filename)); 473 ASSERT_TRUE(GetPrefixSetFile(&filename));
474 474
475 ASSERT_NO_FATAL_FAILURE( 475 ASSERT_NO_FATAL_FAILURE(
476 ModifyAndCleanChecksum(filename, kVersionOffset, 10)); 476 ModifyAndCleanChecksum(filename, kVersionOffset, 10));
477 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 477 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
478 ASSERT_FALSE(prefix_set.get()); 478 ASSERT_FALSE(prefix_set.get());
479 } 479 }
480 480
481 // Bad |index_| size is caught by the sanity check. 481 // Bad |index_| size is caught by the sanity check.
482 TEST_F(PrefixSetTest, CorruptionIndexSize) { 482 TEST_F(PrefixSetTest, CorruptionIndexSize) {
483 base::FilePath filename; 483 base::FilePath filename;
484 ASSERT_TRUE(GetPrefixSetFile(&filename)); 484 ASSERT_TRUE(GetPrefixSetFile(&filename));
485 485
486 ASSERT_NO_FATAL_FAILURE( 486 ASSERT_NO_FATAL_FAILURE(
487 ModifyAndCleanChecksum(filename, kIndexSizeOffset, 1)); 487 ModifyAndCleanChecksum(filename, kIndexSizeOffset, 1));
488 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 488 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
489 ASSERT_FALSE(prefix_set.get()); 489 ASSERT_FALSE(prefix_set.get());
490 } 490 }
491 491
492 // Bad |deltas_| size is caught by the sanity check. 492 // Bad |deltas_| size is caught by the sanity check.
493 TEST_F(PrefixSetTest, CorruptionDeltasSize) { 493 TEST_F(PrefixSetTest, CorruptionDeltasSize) {
494 base::FilePath filename; 494 base::FilePath filename;
495 ASSERT_TRUE(GetPrefixSetFile(&filename)); 495 ASSERT_TRUE(GetPrefixSetFile(&filename));
496 496
497 ASSERT_NO_FATAL_FAILURE( 497 ASSERT_NO_FATAL_FAILURE(
498 ModifyAndCleanChecksum(filename, kDeltasSizeOffset, 1)); 498 ModifyAndCleanChecksum(filename, kDeltasSizeOffset, 1));
499 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 499 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
500 ASSERT_FALSE(prefix_set.get()); 500 ASSERT_FALSE(prefix_set.get());
501 } 501 }
502 502
503 // Bad |full_hashes_| size is caught by the sanity check. 503 // Bad |full_hashes_| size is caught by the sanity check.
504 TEST_F(PrefixSetTest, CorruptionFullHashesSize) { 504 TEST_F(PrefixSetTest, CorruptionFullHashesSize) {
505 base::FilePath filename; 505 base::FilePath filename;
506 ASSERT_TRUE(GetPrefixSetFile(&filename)); 506 ASSERT_TRUE(GetPrefixSetFile(&filename));
507 507
508 ASSERT_NO_FATAL_FAILURE( 508 ASSERT_NO_FATAL_FAILURE(
509 ModifyAndCleanChecksum(filename, kFullHashesSizeOffset, 1)); 509 ModifyAndCleanChecksum(filename, kFullHashesSizeOffset, 1));
510 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 510 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
511 ASSERT_FALSE(prefix_set.get()); 511 ASSERT_FALSE(prefix_set.get());
512 } 512 }
513 513
514 // Test that the digest catches corruption in the middle of the file 514 // Test that the digest catches corruption in the middle of the file
515 // (in the payload between the header and the digest). 515 // (in the payload between the header and the digest).
516 TEST_F(PrefixSetTest, CorruptionPayload) { 516 TEST_F(PrefixSetTest, CorruptionPayload) {
517 base::FilePath filename; 517 base::FilePath filename;
518 ASSERT_TRUE(GetPrefixSetFile(&filename)); 518 ASSERT_TRUE(GetPrefixSetFile(&filename));
519 519
520 base::ScopedFILE file(base::OpenFile(filename, "r+b")); 520 base::ScopedFILE file(base::OpenFile(filename, "r+b"));
521 ASSERT_NO_FATAL_FAILURE(IncrementIntAt(file.get(), 666, 1)); 521 ASSERT_NO_FATAL_FAILURE(IncrementIntAt(file.get(), 666, 1));
522 file.reset(); 522 file.reset();
523 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 523 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
524 ASSERT_FALSE(prefix_set.get()); 524 ASSERT_FALSE(prefix_set.get());
525 } 525 }
526 526
527 // Test corruption in the digest itself. 527 // Test corruption in the digest itself.
528 TEST_F(PrefixSetTest, CorruptionDigest) { 528 TEST_F(PrefixSetTest, CorruptionDigest) {
529 base::FilePath filename; 529 base::FilePath filename;
530 ASSERT_TRUE(GetPrefixSetFile(&filename)); 530 ASSERT_TRUE(GetPrefixSetFile(&filename));
531 531
532 int64 size_64; 532 int64 size_64;
533 ASSERT_TRUE(base::GetFileSize(filename, &size_64)); 533 ASSERT_TRUE(base::GetFileSize(filename, &size_64));
534 base::ScopedFILE file(base::OpenFile(filename, "r+b")); 534 base::ScopedFILE file(base::OpenFile(filename, "r+b"));
535 long digest_offset = static_cast<long>(size_64 - sizeof(base::MD5Digest)); 535 long digest_offset = static_cast<long>(size_64 - sizeof(base::MD5Digest));
536 ASSERT_NO_FATAL_FAILURE(IncrementIntAt(file.get(), digest_offset, 1)); 536 ASSERT_NO_FATAL_FAILURE(IncrementIntAt(file.get(), digest_offset, 1));
537 file.reset(); 537 file.reset();
538 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 538 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
539 ASSERT_FALSE(prefix_set.get()); 539 ASSERT_FALSE(prefix_set.get());
540 } 540 }
541 541
542 // Test excess data after the digest (fails the size test). 542 // Test excess data after the digest (fails the size test).
543 TEST_F(PrefixSetTest, CorruptionExcess) { 543 TEST_F(PrefixSetTest, CorruptionExcess) {
544 base::FilePath filename; 544 base::FilePath filename;
545 ASSERT_TRUE(GetPrefixSetFile(&filename)); 545 ASSERT_TRUE(GetPrefixSetFile(&filename));
546 546
547 // Add some junk to the trunk. 547 // Add some junk to the trunk.
548 base::ScopedFILE file(base::OpenFile(filename, "ab")); 548 base::ScopedFILE file(base::OpenFile(filename, "ab"));
549 const char buf[] = "im in ur base, killing ur d00dz."; 549 const char buf[] = "im in ur base, killing ur d00dz.";
550 ASSERT_EQ(strlen(buf), fwrite(buf, 1, strlen(buf), file.get())); 550 ASSERT_EQ(strlen(buf), fwrite(buf, 1, strlen(buf), file.get()));
551 file.reset(); 551 file.reset();
552 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 552 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
553 ASSERT_FALSE(prefix_set.get()); 553 ASSERT_FALSE(prefix_set.get());
554 } 554 }
555 555
556 // Test that files which had 64-bit size_t are discarded. 556 // Test that files which had 64-bit size_t are discarded.
557 TEST_F(PrefixSetTest, SizeTRecovery) { 557 TEST_F(PrefixSetTest, SizeTRecovery) {
558 base::FilePath filename; 558 base::FilePath filename;
559 ASSERT_TRUE(GetPrefixSetFile(&filename)); 559 ASSERT_TRUE(GetPrefixSetFile(&filename));
560 560
561 // Open the file for rewrite. 561 // Open the file for rewrite.
562 base::ScopedFILE file(base::OpenFile(filename, "r+b")); 562 base::ScopedFILE file(base::OpenFile(filename, "r+b"));
(...skipping 21 matching lines...) Expand all
584 ASSERT_EQ(sizeof(delta), fwrite(&delta, 1, sizeof(delta), file.get())); 584 ASSERT_EQ(sizeof(delta), fwrite(&delta, 1, sizeof(delta), file.get()));
585 ASSERT_EQ(sizeof(delta), fwrite(&delta, 1, sizeof(delta), file.get())); 585 ASSERT_EQ(sizeof(delta), fwrite(&delta, 1, sizeof(delta), file.get()));
586 586
587 // Leave space for the digest at the end, and regenerate it. 587 // Leave space for the digest at the end, and regenerate it.
588 base::MD5Digest dummy = { { 0 } }; 588 base::MD5Digest dummy = { { 0 } };
589 ASSERT_EQ(sizeof(dummy), fwrite(&dummy, 1, sizeof(dummy), file.get())); 589 ASSERT_EQ(sizeof(dummy), fwrite(&dummy, 1, sizeof(dummy), file.get()));
590 ASSERT_TRUE(base::TruncateFile(file.get())); 590 ASSERT_TRUE(base::TruncateFile(file.get()));
591 CleanChecksum(file.get()); 591 CleanChecksum(file.get());
592 file.reset(); // Flush updates. 592 file.reset(); // Flush updates.
593 593
594 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(filename); 594 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
595 ASSERT_FALSE(prefix_set.get()); 595 ASSERT_FALSE(prefix_set.get());
596 } 596 }
597 597
598 // Test Exists() against full hashes passed to builder. 598 // Test Exists() against full hashes passed to builder.
599 TEST_F(PrefixSetTest, FullHashBuild) { 599 TEST_F(PrefixSetTest, FullHashBuild) {
600 const SBFullHash kHash1 = SBFullHashForString("one"); 600 const SBFullHash kHash1 = SBFullHashForString("one");
601 const SBFullHash kHash2 = SBFullHashForString("two"); 601 const SBFullHash kHash2 = SBFullHashForString("two");
602 const SBFullHash kHash3 = SBFullHashForString("three"); 602 const SBFullHash kHash3 = SBFullHashForString("three");
603 const SBFullHash kHash4 = SBFullHashForString("four"); 603 const SBFullHash kHash4 = SBFullHashForString("four");
604 const SBFullHash kHash5 = SBFullHashForString("five"); 604 const SBFullHash kHash5 = SBFullHashForString("five");
605 const SBFullHash kHash6 = SBFullHashForString("six"); 605 const SBFullHash kHash6 = SBFullHashForString("six");
606 606
607 std::vector<SBPrefix> prefixes; 607 std::vector<SBPrefix> prefixes;
608 prefixes.push_back(kHash1.prefix); 608 prefixes.push_back(kHash1.prefix);
609 prefixes.push_back(kHash2.prefix); 609 prefixes.push_back(kHash2.prefix);
610 std::sort(prefixes.begin(), prefixes.end()); 610 std::sort(prefixes.begin(), prefixes.end());
611 611
612 std::vector<SBFullHash> hashes; 612 std::vector<SBFullHash> hashes;
613 hashes.push_back(kHash4); 613 hashes.push_back(kHash4);
614 hashes.push_back(kHash5); 614 hashes.push_back(kHash5);
615 615
616 PrefixSetBuilder builder(prefixes); 616 PrefixSetBuilder builder(prefixes);
617 scoped_ptr<PrefixSet> prefix_set = builder.GetPrefixSet(hashes); 617 scoped_ptr<const PrefixSet> prefix_set = builder.GetPrefixSet(hashes);
618 618
619 EXPECT_TRUE(prefix_set->Exists(kHash1)); 619 EXPECT_TRUE(prefix_set->Exists(kHash1));
620 EXPECT_TRUE(prefix_set->Exists(kHash2)); 620 EXPECT_TRUE(prefix_set->Exists(kHash2));
621 EXPECT_FALSE(prefix_set->Exists(kHash3)); 621 EXPECT_FALSE(prefix_set->Exists(kHash3));
622 EXPECT_TRUE(prefix_set->Exists(kHash4)); 622 EXPECT_TRUE(prefix_set->Exists(kHash4));
623 EXPECT_TRUE(prefix_set->Exists(kHash5)); 623 EXPECT_TRUE(prefix_set->Exists(kHash5));
624 EXPECT_FALSE(prefix_set->Exists(kHash6)); 624 EXPECT_FALSE(prefix_set->Exists(kHash6));
625 625
626 EXPECT_TRUE(prefix_set->PrefixExists(kHash1.prefix)); 626 EXPECT_TRUE(prefix_set->PrefixExists(kHash1.prefix));
627 EXPECT_TRUE(prefix_set->PrefixExists(kHash2.prefix)); 627 EXPECT_TRUE(prefix_set->PrefixExists(kHash2.prefix));
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
665 ASSERT_EQ(sizeof(delta), fwrite(&delta, 1, sizeof(delta), file.get())); 665 ASSERT_EQ(sizeof(delta), fwrite(&delta, 1, sizeof(delta), file.get()));
666 ASSERT_EQ(sizeof(delta), fwrite(&delta, 1, sizeof(delta), file.get())); 666 ASSERT_EQ(sizeof(delta), fwrite(&delta, 1, sizeof(delta), file.get()));
667 667
668 // Leave space for the digest at the end, and regenerate it. 668 // Leave space for the digest at the end, and regenerate it.
669 base::MD5Digest dummy = { { 0 } }; 669 base::MD5Digest dummy = { { 0 } };
670 ASSERT_EQ(sizeof(dummy), fwrite(&dummy, 1, sizeof(dummy), file.get())); 670 ASSERT_EQ(sizeof(dummy), fwrite(&dummy, 1, sizeof(dummy), file.get()));
671 ASSERT_TRUE(base::TruncateFile(file.get())); 671 ASSERT_TRUE(base::TruncateFile(file.get()));
672 CleanChecksum(file.get()); 672 CleanChecksum(file.get());
673 file.reset(); // Flush updates. 673 file.reset(); // Flush updates.
674 674
675 scoped_ptr<safe_browsing::PrefixSet> 675 scoped_ptr<const PrefixSet> prefix_set = PrefixSet::LoadFile(filename);
676 prefix_set(safe_browsing::PrefixSet::LoadFile(filename));
677 ASSERT_FALSE(prefix_set.get()); 676 ASSERT_FALSE(prefix_set.get());
678 } 677 }
679 678
680 // Test that a golden v2 file is discarded on read. All platforms generating v2 679 // Test that a golden v2 file is discarded on read. All platforms generating v2
681 // files are little-endian, so there is no point to testing this transition 680 // files are little-endian, so there is no point to testing this transition
682 // if/when a big-endian port is added. 681 // if/when a big-endian port is added.
683 #if defined(ARCH_CPU_LITTLE_ENDIAN) 682 #if defined(ARCH_CPU_LITTLE_ENDIAN)
684 TEST_F(PrefixSetTest, Version2) { 683 TEST_F(PrefixSetTest, Version2) {
685 std::vector<SBPrefix> ref_prefixes; 684 std::vector<SBPrefix> ref_prefixes;
686 ASSERT_TRUE(ReadReferencePrefixes(&ref_prefixes)); 685 ASSERT_TRUE(ReadReferencePrefixes(&ref_prefixes));
687 686
688 const char kBasename[] = "PrefixSetVersion2"; 687 const char kBasename[] = "PrefixSetVersion2";
689 base::FilePath golden_path; 688 base::FilePath golden_path;
690 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &golden_path)); 689 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &golden_path));
691 golden_path = golden_path.AppendASCII("SafeBrowsing"); 690 golden_path = golden_path.AppendASCII("SafeBrowsing");
692 golden_path = golden_path.AppendASCII(kBasename); 691 golden_path = golden_path.AppendASCII(kBasename);
693 692
694 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(golden_path); 693 scoped_ptr<const PrefixSet> prefix_set(PrefixSet::LoadFile(golden_path));
695 ASSERT_FALSE(prefix_set.get()); 694 ASSERT_FALSE(prefix_set.get());
696 } 695 }
697 #endif 696 #endif
698 697
699 // Test that a golden v3 file can be read by the current code. All platforms 698 // Test that a golden v3 file can be read by the current code. All platforms
700 // generating v3 files are little-endian, so there is no point to testing this 699 // generating v3 files are little-endian, so there is no point to testing this
701 // transition if/when a big-endian port is added. 700 // transition if/when a big-endian port is added.
702 #if defined(ARCH_CPU_LITTLE_ENDIAN) 701 #if defined(ARCH_CPU_LITTLE_ENDIAN)
703 TEST_F(PrefixSetTest, Version3) { 702 TEST_F(PrefixSetTest, Version3) {
704 std::vector<SBPrefix> ref_prefixes; 703 std::vector<SBPrefix> ref_prefixes;
705 ASSERT_TRUE(ReadReferencePrefixes(&ref_prefixes)); 704 ASSERT_TRUE(ReadReferencePrefixes(&ref_prefixes));
706 705
707 const char kBasename[] = "PrefixSetVersion3"; 706 const char kBasename[] = "PrefixSetVersion3";
708 base::FilePath golden_path; 707 base::FilePath golden_path;
709 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &golden_path)); 708 ASSERT_TRUE(PathService::Get(chrome::DIR_TEST_DATA, &golden_path));
710 golden_path = golden_path.AppendASCII("SafeBrowsing"); 709 golden_path = golden_path.AppendASCII("SafeBrowsing");
711 golden_path = golden_path.AppendASCII(kBasename); 710 golden_path = golden_path.AppendASCII(kBasename);
712 711
713 scoped_ptr<PrefixSet> prefix_set = PrefixSet::LoadFile(golden_path); 712 scoped_ptr<const PrefixSet> prefix_set(PrefixSet::LoadFile(golden_path));
714 ASSERT_TRUE(prefix_set.get()); 713 ASSERT_TRUE(prefix_set.get());
715 CheckPrefixes(*prefix_set, ref_prefixes); 714 CheckPrefixes(*prefix_set, ref_prefixes);
716 715
717 const SBFullHash kHash1 = SBFullHashForString("www.evil.com/malware.html"); 716 const SBFullHash kHash1 = SBFullHashForString("www.evil.com/malware.html");
718 const SBFullHash kHash2 = SBFullHashForString("www.evil.com/phishing.html"); 717 const SBFullHash kHash2 = SBFullHashForString("www.evil.com/phishing.html");
719 718
720 EXPECT_TRUE(prefix_set->Exists(kHash1)); 719 EXPECT_TRUE(prefix_set->Exists(kHash1));
721 EXPECT_TRUE(prefix_set->Exists(kHash2)); 720 EXPECT_TRUE(prefix_set->Exists(kHash2));
722 EXPECT_FALSE(prefix_set->PrefixExists(kHash1.prefix)); 721 EXPECT_FALSE(prefix_set->PrefixExists(kHash1.prefix));
723 EXPECT_FALSE(prefix_set->PrefixExists(kHash2.prefix)); 722 EXPECT_FALSE(prefix_set->PrefixExists(kHash2.prefix));
724 } 723 }
725 #endif 724 #endif
726 725
727 } // namespace safe_browsing 726 } // namespace safe_browsing
OLDNEW
« no previous file with comments | « chrome/browser/safe_browsing/prefix_set.cc ('k') | chrome/browser/safe_browsing/safe_browsing_database.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698