Index: base/memory/shared_memory_allocator_unittest.cc |
diff --git a/base/memory/shared_memory_allocator_unittest.cc b/base/memory/shared_memory_allocator_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f2ac2174dbc45c5f46c664cc5facb382fdff667c |
--- /dev/null |
+++ b/base/memory/shared_memory_allocator_unittest.cc |
@@ -0,0 +1,106 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "base/memory/shared_memory_allocator.h" |
+ |
+#include "base/memory/scoped_ptr.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+ |
+namespace { |
+ |
+const int32 TEST_MEMORY_SIZE = 1 << 20; // 1 MiB |
+const int32 TEST_MEMORY_PAGE = 64 << 10; // 64 KiB |
+ |
+} // namespace |
+ |
+namespace base { |
+ |
+class SharedMemoryAllocatorTest : public testing::Test { |
+ public: |
+ struct TestObject1 { |
+ int32 onething; |
+ char oranother; |
+ }; |
+ |
+ struct TestObject2 { |
+ int thiis; |
+ long that; |
+ float andthe; |
+ char other; |
+ double thing; |
+ }; |
+ |
+ void SetUp() override { |
+ allocator_.reset(); |
+ mem_segment_.reset(new char[TEST_MEMORY_SIZE]); |
+ memset(mem_segment_.get(), 0, TEST_MEMORY_SIZE); |
+ allocator_.reset(new SharedMemoryAllocator(mem_segment_.get(), |
+ TEST_MEMORY_SIZE, |
+ TEST_MEMORY_PAGE)); |
+ } |
+ |
+ void TearDown() override { |
+ allocator_.reset(); |
+ mem_segment_.reset(); |
+ } |
+ |
+ scoped_ptr<char[]> mem_segment_; |
+ scoped_ptr<SharedMemoryAllocator> allocator_; |
+}; |
+ |
+TEST_F(SharedMemoryAllocatorTest, AllocateAndIterate) { |
+ SharedMemoryAllocator::MemoryInfo meminfo0; |
+ allocator_->GetMemoryInfo(&meminfo0); |
+ EXPECT_EQ(TEST_MEMORY_SIZE, meminfo0.total); |
+ EXPECT_GT(meminfo0.total, meminfo0.free); |
+ |
+ int32 block1 = allocator_->Allocate(sizeof(TestObject1), 1); |
+ EXPECT_NE(0, block1); |
+ EXPECT_NE(nullptr, allocator_->GetObject(block1, 1, (TestObject1*)0)); |
+ EXPECT_EQ(nullptr, allocator_->GetObject(block1, 1, (TestObject2*)0)); |
+ SharedMemoryAllocator::MemoryInfo meminfo1; |
+ allocator_->GetMemoryInfo(&meminfo1); |
+ EXPECT_EQ(meminfo0.total, meminfo1.total); |
+ EXPECT_GT(meminfo0.free, meminfo1.free); |
+ |
+ SharedMemoryAllocator::Iterator iter; |
+ int32 type; |
+ EXPECT_EQ(0, allocator_->GetFirstIterable(&iter, &type)); |
+ EXPECT_EQ(0, allocator_->GetNextIterable(&iter, &type)); |
+ allocator_->MakeIterable(block1); |
+ EXPECT_EQ(block1, allocator_->GetNextIterable(&iter, &type)); |
+ EXPECT_EQ(1, type); |
+ EXPECT_EQ(0, allocator_->GetNextIterable(&iter, &type)); |
+ |
+ int32 block2 = allocator_->Allocate(sizeof(TestObject2), 2); |
+ EXPECT_NE(0, block2); |
+ EXPECT_NE(nullptr, allocator_->GetObject(block2, 2, (TestObject2*)0)); |
+ EXPECT_EQ(nullptr, allocator_->GetObject(block2, 1, (TestObject2*)0)); |
+ SharedMemoryAllocator::MemoryInfo meminfo2; |
+ allocator_->GetMemoryInfo(&meminfo2); |
+ EXPECT_EQ(meminfo1.total, meminfo2.total); |
+ EXPECT_GT(meminfo1.free, meminfo2.free); |
+ |
+ allocator_->MakeIterable(block2); |
+ EXPECT_EQ(block2, allocator_->GetNextIterable(&iter, &type)); |
+ EXPECT_EQ(2, type); |
+ EXPECT_EQ(0, allocator_->GetNextIterable(&iter, &type)); |
+ |
+ EXPECT_FALSE(allocator_->IsFull()); |
+ EXPECT_FALSE(allocator_->IsCorrupted()); |
+} |
+ |
+TEST_F(SharedMemoryAllocatorTest, PageTest) { |
+ int32 block1 = allocator_->Allocate(TEST_MEMORY_PAGE / 2, 1); |
+ EXPECT_LT(0, block1); |
+ EXPECT_GT(TEST_MEMORY_PAGE, block1); |
+ |
+ int32 block2 = allocator_->Allocate(TEST_MEMORY_PAGE - 16, 2); |
+ EXPECT_EQ(TEST_MEMORY_PAGE, block2); |
+ |
+ int32 block3 = allocator_->Allocate(99, 3); |
+ EXPECT_EQ(2 * TEST_MEMORY_PAGE, block3); |
+} |
+ |
+} // namespace base |