Index: base/shared_memory_unittest.cc |
diff --git a/base/shared_memory_unittest.cc b/base/shared_memory_unittest.cc |
index bd537692f4880febe1ce12dc9a18e91991296ca4..205a9c408174736872205a1816693ab99e994430 100644 |
--- a/base/shared_memory_unittest.cc |
+++ b/base/shared_memory_unittest.cc |
@@ -8,6 +8,7 @@ |
#endif |
#include "base/memory/scoped_ptr.h" |
#include "base/shared_memory.h" |
+#include "base/sys_info.h" |
#include "base/test/multiprocess_test.h" |
#include "base/threading/platform_thread.h" |
#include "base/time.h" |
@@ -343,6 +344,36 @@ TEST(SharedMemoryTest, AnonymousPrivate) { |
} |
} |
+TEST(SharedMemoryTest, MapFrom) { |
+ ASSERT_TRUE(SysInfo::VMAllocationGranularity() >= sizeof(uint32)); |
+ const size_t kCount = SysInfo::VMAllocationGranularity(); |
+ const size_t kDataSize = kCount * sizeof(uint32); |
+ static const char kTestName[] = "SharedMemoryMapFrom"; |
+ |
+ SharedMemory memory1; |
+ memory1.Delete(kTestName); |
+ ASSERT_TRUE(memory1.CreateNamed(kTestName, false, kDataSize)); |
+ ASSERT_TRUE(memory1.Map(kDataSize)); |
+ uint32* ptr1 = static_cast<uint32*>(memory1.memory()); |
+ ASSERT_NE(ptr1, static_cast<void*>(NULL)); |
+ |
+ for (size_t i = 0; i < kCount; ++i) { |
+ ptr1[i] = i; |
+ } |
+ |
+ SharedMemory memory2; |
+ ASSERT_TRUE(memory2.CreateNamed(kTestName, true, kDataSize)); |
+ off_t offset = SysInfo::VMAllocationGranularity(); |
+ ASSERT_TRUE(memory2.MapFrom(offset, kDataSize - offset)); |
+ offset /= sizeof(uint32); |
+ uint32* ptr2 = static_cast<uint32*>(memory2.memory()); |
+ ASSERT_NE(ptr2, static_cast<void*>(NULL)); |
+ for (size_t i = offset; i < kCount; ++i) { |
+ ASSERT_EQ(ptr2[i - offset], i); |
+ } |
+ memory1.Delete(kTestName); |
+} |
+ |
#if defined(OS_POSIX) |
// Create a shared memory object, mmap it, and mprotect it to PROT_EXEC. |
TEST(SharedMemoryTest, AnonymousExecutable) { |