Index: base/metrics/persistent_memory_allocator_unittest.cc |
diff --git a/base/metrics/persistent_memory_allocator_unittest.cc b/base/metrics/persistent_memory_allocator_unittest.cc |
index 93b5be8460cb1bf18ed7ea8868d57dfed0d6f584..b34cf14de315d1bc464565df624cb824736f5313 100644 |
--- a/base/metrics/persistent_memory_allocator_unittest.cc |
+++ b/base/metrics/persistent_memory_allocator_unittest.cc |
@@ -9,6 +9,7 @@ |
#include "base/files/memory_mapped_file.h" |
#include "base/files/scoped_temp_dir.h" |
#include "base/memory/scoped_ptr.h" |
+#include "base/memory/shared_memory.h" |
#include "base/metrics/histogram.h" |
#include "base/rand_util.h" |
#include "base/strings/safe_sprintf.h" |
@@ -387,6 +388,96 @@ TEST(LocalPersistentMemoryAllocatorTest, CreationTest) { |
} |
+//----- SharedPersistentMemoryAllocator ---------------------------------------- |
+ |
+TEST(SharedPersistentMemoryAllocatorTest, CreationTest) { |
+ SharedMemoryHandle shared_handle; |
+ |
+ PersistentMemoryAllocator::MemoryInfo meminfo1; |
+ Reference r123, r456, r789; |
+ { |
+ scoped_ptr<SharedMemory> shmem1(new SharedMemory()); |
+ ASSERT_TRUE(shmem1->CreateAndMapAnonymous(TEST_MEMORY_SIZE)); |
+ SharedPersistentMemoryAllocator local(std::move(shmem1), TEST_ID, "", |
+ false); |
+ EXPECT_FALSE(local.IsReadonly()); |
+ r123 = local.Allocate(123, 123); |
+ r456 = local.Allocate(456, 456); |
+ r789 = local.Allocate(789, 789); |
+ local.MakeIterable(r123); |
+ local.SetType(r456, 654); |
+ local.MakeIterable(r789); |
+ local.GetMemoryInfo(&meminfo1); |
+ EXPECT_FALSE(local.IsFull()); |
+ EXPECT_FALSE(local.IsCorrupt()); |
+ |
+ ASSERT_TRUE(local.shared_memory()->ShareToProcess( |
+ GetCurrentProcessHandle(), |
+ &shared_handle)); |
+ } |
+ |
+ // Read-only test. |
+ scoped_ptr<SharedMemory> shmem2(new SharedMemory(shared_handle, |
+ /*readonly=*/true)); |
+ ASSERT_TRUE(shmem2->Map(TEST_MEMORY_SIZE)); |
+ |
+ SharedPersistentMemoryAllocator shalloc2(std::move(shmem2), 0, "", true); |
+ EXPECT_TRUE(shalloc2.IsReadonly()); |
+ EXPECT_EQ(TEST_ID, shalloc2.Id()); |
+ EXPECT_FALSE(shalloc2.IsFull()); |
+ EXPECT_FALSE(shalloc2.IsCorrupt()); |
+ |
+ PersistentMemoryAllocator::Iterator iter2; |
+ uint32_t type; |
+ shalloc2.CreateIterator(&iter2); |
+ EXPECT_EQ(r123, shalloc2.GetNextIterable(&iter2, &type)); |
+ EXPECT_EQ(r789, shalloc2.GetNextIterable(&iter2, &type)); |
+ EXPECT_EQ(0U, shalloc2.GetNextIterable(&iter2, &type)); |
+ |
+ EXPECT_EQ(123U, shalloc2.GetType(r123)); |
+ EXPECT_EQ(654U, shalloc2.GetType(r456)); |
+ EXPECT_EQ(789U, shalloc2.GetType(r789)); |
+ |
+ PersistentMemoryAllocator::MemoryInfo meminfo2; |
+ shalloc2.GetMemoryInfo(&meminfo2); |
+ EXPECT_EQ(meminfo1.total, meminfo2.total); |
+ EXPECT_EQ(meminfo1.free, meminfo2.free); |
+ |
+ // Read/write test. |
+ scoped_ptr<SharedMemory> shmem3(new SharedMemory(shared_handle, |
+ /*readonly=*/false)); |
+ ASSERT_TRUE(shmem3->Map(TEST_MEMORY_SIZE)); |
+ |
+ SharedPersistentMemoryAllocator shalloc3(std::move(shmem3), 0, "", false); |
+ EXPECT_FALSE(shalloc3.IsReadonly()); |
+ EXPECT_EQ(TEST_ID, shalloc3.Id()); |
+ EXPECT_FALSE(shalloc3.IsFull()); |
+ EXPECT_FALSE(shalloc3.IsCorrupt()); |
+ |
+ PersistentMemoryAllocator::Iterator iter3; |
+ shalloc3.CreateIterator(&iter3); |
+ EXPECT_EQ(r123, shalloc3.GetNextIterable(&iter3, &type)); |
+ EXPECT_EQ(r789, shalloc3.GetNextIterable(&iter3, &type)); |
+ EXPECT_EQ(0U, shalloc3.GetNextIterable(&iter3, &type)); |
+ |
+ EXPECT_EQ(123U, shalloc3.GetType(r123)); |
+ EXPECT_EQ(654U, shalloc3.GetType(r456)); |
+ EXPECT_EQ(789U, shalloc3.GetType(r789)); |
+ |
+ PersistentMemoryAllocator::MemoryInfo meminfo3; |
+ shalloc3.GetMemoryInfo(&meminfo3); |
+ EXPECT_EQ(meminfo1.total, meminfo3.total); |
+ EXPECT_EQ(meminfo1.free, meminfo3.free); |
+ |
+ // Interconnectivity test. |
+ Reference obj = shalloc3.Allocate(42, 42); |
+ ASSERT_TRUE(obj); |
+ shalloc3.MakeIterable(obj); |
+ EXPECT_EQ(obj, shalloc2.GetNextIterable(&iter2, &type)); |
+ EXPECT_EQ(42U, type); |
+} |
+ |
+ |
//----- FilePersistentMemoryAllocator ------------------------------------------ |
TEST(FilePersistentMemoryAllocatorTest, CreationTest) { |
@@ -420,7 +511,7 @@ TEST(FilePersistentMemoryAllocatorTest, CreationTest) { |
const size_t mmlength = mmfile->length(); |
EXPECT_GE(meminfo1.total, mmlength); |
- FilePersistentMemoryAllocator file(mmfile.release(), 0, ""); |
+ FilePersistentMemoryAllocator file(std::move(mmfile), 0, ""); |
EXPECT_TRUE(file.IsReadonly()); |
EXPECT_EQ(TEST_ID, file.Id()); |
EXPECT_FALSE(file.IsFull()); |
@@ -475,7 +566,7 @@ TEST(FilePersistentMemoryAllocatorTest, AcceptableTest) { |
EXPECT_EQ(filesize, mmfile->length()); |
if (FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile)) { |
// Make sure construction doesn't crash. |
- FilePersistentMemoryAllocator allocator(mmfile.release(), 0, ""); |
+ FilePersistentMemoryAllocator allocator(std::move(mmfile), 0, ""); |
// Also make sure that iteration doesn't crash. |
PersistentMemoryAllocator::Iterator iter; |
allocator.CreateIterator(&iter); |
@@ -515,7 +606,7 @@ TEST(FilePersistentMemoryAllocatorTest, AcceptableTest) { |
EXPECT_EQ(filesize, mmfile->length()); |
if (FilePersistentMemoryAllocator::IsFileAcceptable(*mmfile)) { |
// Just need to make sure it doesn't crash. |
- FilePersistentMemoryAllocator allocator(mmfile.release(), 0, "") ; |
+ FilePersistentMemoryAllocator allocator(std::move(mmfile), 0, ""); |
EXPECT_TRUE(allocator.IsCorrupt()); // Garbage data so it should be. |
} else { |
// For filesize >= minsize, the file must be acceptable. This |