OLD | NEW |
---|---|
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "base/metrics/persistent_memory_allocator.h" | 5 #include "base/metrics/persistent_memory_allocator.h" |
6 | 6 |
7 #include "base/files/file.h" | 7 #include "base/files/file.h" |
8 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
9 #include "base/files/memory_mapped_file.h" | 9 #include "base/files/memory_mapped_file.h" |
10 #include "base/files/scoped_temp_dir.h" | 10 #include "base/files/scoped_temp_dir.h" |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
438 EXPECT_EQ(789U, file.GetType(r789)); | 438 EXPECT_EQ(789U, file.GetType(r789)); |
439 | 439 |
440 PersistentMemoryAllocator::MemoryInfo meminfo2; | 440 PersistentMemoryAllocator::MemoryInfo meminfo2; |
441 file.GetMemoryInfo(&meminfo2); | 441 file.GetMemoryInfo(&meminfo2); |
442 EXPECT_GE(meminfo1.total, meminfo2.total); | 442 EXPECT_GE(meminfo1.total, meminfo2.total); |
443 EXPECT_GE(meminfo1.free, meminfo2.free); | 443 EXPECT_GE(meminfo1.free, meminfo2.free); |
444 EXPECT_EQ(mmlength, meminfo2.total); | 444 EXPECT_EQ(mmlength, meminfo2.total); |
445 EXPECT_EQ(0U, meminfo2.free); | 445 EXPECT_EQ(0U, meminfo2.free); |
446 } | 446 } |
447 | 447 |
448 #if !DCHECK_IS_ON() // DCHECK builds die at a various debug checks. | |
Alexei Svitkine (slow)
2016/02/08 21:43:26
Aren't most of our tests run with DCHECKs? So this
bcwhite
2016/02/10 16:28:58
I think all the bot-tests run off a release build.
Alexei Svitkine (slow)
2016/02/10 16:35:34
I believe the bots run Release with DCHECK on.
I
bcwhite
2016/02/10 16:54:09
Complicated. Result to the caller is always "good
| |
448 TEST(FilePersistentMemoryAllocatorTest, AcceptableTest) { | 449 TEST(FilePersistentMemoryAllocatorTest, AcceptableTest) { |
449 ScopedTempDir temp_dir; | 450 ScopedTempDir temp_dir; |
450 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 451 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
451 FilePath file_path_base = temp_dir.path().AppendASCII("persistent_memory_"); | 452 FilePath file_path_base = temp_dir.path().AppendASCII("persistent_memory_"); |
452 | 453 |
453 LocalPersistentMemoryAllocator local(TEST_MEMORY_SIZE, TEST_ID, ""); | 454 LocalPersistentMemoryAllocator local(TEST_MEMORY_SIZE, TEST_ID, ""); |
455 local.Allocate(1, 1); | |
456 local.Allocate(11, 11); | |
454 const size_t minsize = local.used(); | 457 const size_t minsize = local.used(); |
455 scoped_ptr<char[]> garbage(new char[minsize]); | 458 scoped_ptr<char[]> garbage(new char[minsize]); |
456 RandBytes(garbage.get(), minsize); | 459 RandBytes(garbage.get(), minsize); |
457 | 460 |
458 scoped_ptr<MemoryMappedFile> mmfile; | 461 scoped_ptr<MemoryMappedFile> mmfile; |
459 char filename[100]; | 462 char filename[100]; |
460 for (size_t filesize = minsize; filesize > 0; --filesize) { | 463 for (size_t filesize = minsize; filesize > 0; --filesize) { |
461 strings::SafeSPrintf(filename, "memory_%d_A", filesize); | 464 strings::SafeSPrintf(filename, "memory_%d_A", filesize); |
462 FilePath file_path = temp_dir.path().AppendASCII(filename); | 465 FilePath file_path = temp_dir.path().AppendASCII(filename); |
463 ASSERT_FALSE(PathExists(file_path)); | 466 ASSERT_FALSE(PathExists(file_path)); |
464 { | 467 { |
465 File writer(file_path, File::FLAG_CREATE | File::FLAG_WRITE); | 468 File writer(file_path, File::FLAG_CREATE | File::FLAG_WRITE); |
466 ASSERT_TRUE(writer.IsValid()); | 469 ASSERT_TRUE(writer.IsValid()); |
467 writer.Write(0, (const char*)local.data(), filesize); | 470 writer.Write(0, (const char*)local.data(), filesize); |
468 } | 471 } |
469 ASSERT_TRUE(PathExists(file_path)); | 472 ASSERT_TRUE(PathExists(file_path)); |
470 | 473 |
471 mmfile.reset(new MemoryMappedFile()); | 474 mmfile.reset(new MemoryMappedFile()); |
472 mmfile->Initialize(file_path); | 475 mmfile->Initialize(file_path); |
473 EXPECT_EQ(filesize, mmfile->length()); | 476 EXPECT_EQ(filesize, mmfile->length()); |
474 if (FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile)) { | 477 if (FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile)) { |
475 // Just need to make sure it doesn't crash. | 478 // Make sure construction doesn't crash. |
476 FilePersistentMemoryAllocator allocator(mmfile.release(), 0, ""); | 479 FilePersistentMemoryAllocator allocator(mmfile.release(), 0, ""); |
477 (void)allocator; // Ensure compiler can't optimize-out above variable. | 480 // Also make sure that iteration doesn't crash. |
481 PersistentMemoryAllocator::Iterator iter; | |
482 allocator.CreateIterator(&iter); | |
483 for (;;) { | |
484 Reference ref = allocator.GetNextIterable(&iter, 0); | |
485 if (!ref) | |
486 break; | |
487 const char* data = allocator.GetAsObject<char>(ref, 0); | |
488 uint32_t type = allocator.GetType(ref); | |
489 size_t size = allocator.GetAllocSize(ref); | |
490 // Ensure compiler can't optimize-out above variables. | |
491 (void)data; | |
492 (void)type; | |
493 (void)size; | |
494 // Ensure that corruption-detected flag gets properly set. | |
495 EXPECT_EQ(filesize != minsize, allocator.IsCorrupt()); | |
496 } | |
478 } else { | 497 } else { |
479 // For filesize >= minsize, the file must be acceptable. This | 498 // For filesize >= minsize, the file must be acceptable. This |
480 // else clause (file-not-acceptable) should be reached only if | 499 // else clause (file-not-acceptable) should be reached only if |
481 // filesize < minsize. | 500 // filesize < minsize. |
482 EXPECT_LT(filesize, minsize); | 501 EXPECT_LT(filesize, minsize); |
483 } | 502 } |
484 | 503 |
485 #if !DCHECK_IS_ON() // DCHECK builds will die at a NOTREACHED(). | |
486 strings::SafeSPrintf(filename, "memory_%d_B", filesize); | 504 strings::SafeSPrintf(filename, "memory_%d_B", filesize); |
487 file_path = temp_dir.path().AppendASCII(filename); | 505 file_path = temp_dir.path().AppendASCII(filename); |
488 ASSERT_FALSE(PathExists(file_path)); | 506 ASSERT_FALSE(PathExists(file_path)); |
489 { | 507 { |
490 File writer(file_path, File::FLAG_CREATE | File::FLAG_WRITE); | 508 File writer(file_path, File::FLAG_CREATE | File::FLAG_WRITE); |
491 ASSERT_TRUE(writer.IsValid()); | 509 ASSERT_TRUE(writer.IsValid()); |
492 writer.Write(0, (const char*)garbage.get(), filesize); | 510 writer.Write(0, (const char*)garbage.get(), filesize); |
493 } | 511 } |
494 ASSERT_TRUE(PathExists(file_path)); | 512 ASSERT_TRUE(PathExists(file_path)); |
495 | 513 |
496 mmfile.reset(new MemoryMappedFile()); | 514 mmfile.reset(new MemoryMappedFile()); |
497 mmfile->Initialize(file_path); | 515 mmfile->Initialize(file_path); |
498 EXPECT_EQ(filesize, mmfile->length()); | 516 EXPECT_EQ(filesize, mmfile->length()); |
499 if (FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile)) { | 517 if (FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile)) { |
500 // Just need to make sure it doesn't crash. | 518 // Just need to make sure it doesn't crash. |
501 FilePersistentMemoryAllocator allocator(mmfile.release(), 0, "") ; | 519 FilePersistentMemoryAllocator allocator(mmfile.release(), 0, "") ; |
502 EXPECT_TRUE(allocator.IsCorrupt()); // Garbage data so it should be. | 520 EXPECT_TRUE(allocator.IsCorrupt()); // Garbage data so it should be. |
503 } else { | 521 } else { |
504 // For filesize >= minsize, the file must be acceptable. This | 522 // For filesize >= minsize, the file must be acceptable. This |
505 // else clause (file-not-acceptable) should be reached only if | 523 // else clause (file-not-acceptable) should be reached only if |
506 // filesize < minsize. | 524 // filesize < minsize. |
507 EXPECT_GT(minsize, filesize); | 525 EXPECT_GT(minsize, filesize); |
508 } | 526 } |
509 #endif | |
510 } | 527 } |
511 } | 528 } |
529 #endif // !DCHECK_IS_ON() | |
512 | 530 |
513 } // namespace base | 531 } // namespace base |
OLD | NEW |