Index: content/common/host_discardable_shared_memory_manager_unittest.cc |
diff --git a/content/common/host_discardable_shared_memory_manager_unittest.cc b/content/common/host_discardable_shared_memory_manager_unittest.cc |
deleted file mode 100644 |
index fcd39baa99416a5520acec5809817e6446f6327a..0000000000000000000000000000000000000000 |
--- a/content/common/host_discardable_shared_memory_manager_unittest.cc |
+++ /dev/null |
@@ -1,288 +0,0 @@ |
-// Copyright 2014 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 "content/common/host_discardable_shared_memory_manager.h" |
- |
-#include <stddef.h> |
-#include <stdint.h> |
-#include <string.h> |
- |
-#include "base/threading/simple_thread.h" |
-#include "content/public/common/child_process_host.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace content { |
-namespace { |
- |
-class TestDiscardableSharedMemory : public base::DiscardableSharedMemory { |
- public: |
- TestDiscardableSharedMemory() {} |
- |
- explicit TestDiscardableSharedMemory(base::SharedMemoryHandle handle) |
- : DiscardableSharedMemory(handle) {} |
- |
- void SetNow(base::Time now) { now_ = now; } |
- |
- private: |
- // Overriden from base::DiscardableSharedMemory: |
- base::Time Now() const override { return now_; } |
- |
- base::Time now_; |
-}; |
- |
-class TestHostDiscardableSharedMemoryManager |
- : public HostDiscardableSharedMemoryManager { |
- public: |
- TestHostDiscardableSharedMemoryManager() |
- : enforce_memory_policy_pending_(false) {} |
- |
- void SetNow(base::Time now) { now_ = now; } |
- |
- void set_enforce_memory_policy_pending(bool enforce_memory_policy_pending) { |
- enforce_memory_policy_pending_ = enforce_memory_policy_pending; |
- } |
- bool enforce_memory_policy_pending() const { |
- return enforce_memory_policy_pending_; |
- } |
- |
- private: |
- // Overriden from HostDiscardableSharedMemoryManager: |
- base::Time Now() const override { return now_; } |
- void ScheduleEnforceMemoryPolicy() override { |
- enforce_memory_policy_pending_ = true; |
- } |
- |
- base::Time now_; |
- bool enforce_memory_policy_pending_; |
-}; |
- |
-class HostDiscardableSharedMemoryManagerTest : public testing::Test { |
- protected: |
- // Overridden from testing::Test: |
- void SetUp() override { |
- manager_.reset(new TestHostDiscardableSharedMemoryManager); |
- } |
- |
- // HostDiscardableSharedMemoryManager requires a message loop. |
- base::MessageLoop message_loop_; |
- std::unique_ptr<TestHostDiscardableSharedMemoryManager> manager_; |
-}; |
- |
-TEST_F(HostDiscardableSharedMemoryManagerTest, AllocateForChild) { |
- const int kDataSize = 1024; |
- uint8_t data[kDataSize]; |
- memset(data, 0x80, kDataSize); |
- |
- base::SharedMemoryHandle shared_handle; |
- manager_->AllocateLockedDiscardableSharedMemoryForChild( |
- base::GetCurrentProcessHandle(), ChildProcessHost::kInvalidUniqueID, |
- kDataSize, 0, &shared_handle); |
- ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); |
- |
- TestDiscardableSharedMemory memory(shared_handle); |
- bool rv = memory.Map(kDataSize); |
- ASSERT_TRUE(rv); |
- |
- memcpy(memory.memory(), data, kDataSize); |
- memory.SetNow(base::Time::FromDoubleT(1)); |
- memory.Unlock(0, 0); |
- |
- ASSERT_EQ(base::DiscardableSharedMemory::SUCCESS, memory.Lock(0, 0)); |
- EXPECT_EQ(memcmp(data, memory.memory(), kDataSize), 0); |
- memory.Unlock(0, 0); |
-} |
- |
-TEST_F(HostDiscardableSharedMemoryManagerTest, Purge) { |
- const int kDataSize = 1024; |
- |
- base::SharedMemoryHandle shared_handle1; |
- manager_->AllocateLockedDiscardableSharedMemoryForChild( |
- base::GetCurrentProcessHandle(), ChildProcessHost::kInvalidUniqueID, |
- kDataSize, 1, &shared_handle1); |
- ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle1)); |
- |
- TestDiscardableSharedMemory memory1(shared_handle1); |
- bool rv = memory1.Map(kDataSize); |
- ASSERT_TRUE(rv); |
- |
- base::SharedMemoryHandle shared_handle2; |
- manager_->AllocateLockedDiscardableSharedMemoryForChild( |
- base::GetCurrentProcessHandle(), ChildProcessHost::kInvalidUniqueID, |
- kDataSize, 2, &shared_handle2); |
- ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle2)); |
- |
- TestDiscardableSharedMemory memory2(shared_handle2); |
- rv = memory2.Map(kDataSize); |
- ASSERT_TRUE(rv); |
- |
- // Enough memory for both allocations. |
- manager_->SetNow(base::Time::FromDoubleT(1)); |
- manager_->SetMemoryLimit(memory1.mapped_size() + memory2.mapped_size()); |
- |
- memory1.SetNow(base::Time::FromDoubleT(2)); |
- memory1.Unlock(0, 0); |
- memory2.SetNow(base::Time::FromDoubleT(2)); |
- memory2.Unlock(0, 0); |
- |
- // Manager should not have to schedule another call to EnforceMemoryPolicy(). |
- manager_->SetNow(base::Time::FromDoubleT(3)); |
- manager_->EnforceMemoryPolicy(); |
- EXPECT_FALSE(manager_->enforce_memory_policy_pending()); |
- |
- // Memory should still be resident. |
- EXPECT_TRUE(memory1.IsMemoryResident()); |
- EXPECT_TRUE(memory2.IsMemoryResident()); |
- |
- auto lock_rv = memory1.Lock(0, 0); |
- EXPECT_EQ(base::DiscardableSharedMemory::SUCCESS, lock_rv); |
- lock_rv = memory2.Lock(0, 0); |
- EXPECT_EQ(base::DiscardableSharedMemory::SUCCESS, lock_rv); |
- |
- memory1.SetNow(base::Time::FromDoubleT(4)); |
- memory1.Unlock(0, 0); |
- memory2.SetNow(base::Time::FromDoubleT(5)); |
- memory2.Unlock(0, 0); |
- |
- // Just enough memory for one allocation. |
- manager_->SetNow(base::Time::FromDoubleT(6)); |
- manager_->SetMemoryLimit(memory2.mapped_size()); |
- EXPECT_FALSE(manager_->enforce_memory_policy_pending()); |
- |
- // LRU allocation should still be resident. |
- EXPECT_FALSE(memory1.IsMemoryResident()); |
- EXPECT_TRUE(memory2.IsMemoryResident()); |
- |
- lock_rv = memory1.Lock(0, 0); |
- EXPECT_EQ(base::DiscardableSharedMemory::FAILED, lock_rv); |
- lock_rv = memory2.Lock(0, 0); |
- EXPECT_EQ(base::DiscardableSharedMemory::SUCCESS, lock_rv); |
-} |
- |
-TEST_F(HostDiscardableSharedMemoryManagerTest, EnforceMemoryPolicy) { |
- const int kDataSize = 1024; |
- |
- base::SharedMemoryHandle shared_handle; |
- manager_->AllocateLockedDiscardableSharedMemoryForChild( |
- base::GetCurrentProcessHandle(), ChildProcessHost::kInvalidUniqueID, |
- kDataSize, 0, &shared_handle); |
- ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); |
- |
- TestDiscardableSharedMemory memory(shared_handle); |
- bool rv = memory.Map(kDataSize); |
- ASSERT_TRUE(rv); |
- |
- // Not enough memory for one allocation. |
- manager_->SetNow(base::Time::FromDoubleT(1)); |
- manager_->SetMemoryLimit(memory.mapped_size() - 1); |
- // We need to enforce memory policy as our memory usage is currently above |
- // the limit. |
- EXPECT_TRUE(manager_->enforce_memory_policy_pending()); |
- |
- manager_->set_enforce_memory_policy_pending(false); |
- manager_->SetNow(base::Time::FromDoubleT(2)); |
- manager_->EnforceMemoryPolicy(); |
- // Still need to enforce memory policy as nothing can be purged. |
- EXPECT_TRUE(manager_->enforce_memory_policy_pending()); |
- |
- memory.SetNow(base::Time::FromDoubleT(3)); |
- memory.Unlock(0, 0); |
- |
- manager_->set_enforce_memory_policy_pending(false); |
- manager_->SetNow(base::Time::FromDoubleT(4)); |
- manager_->EnforceMemoryPolicy(); |
- // Memory policy should have successfully been enforced. |
- EXPECT_FALSE(manager_->enforce_memory_policy_pending()); |
- |
- EXPECT_EQ(base::DiscardableSharedMemory::FAILED, memory.Lock(0, 0)); |
-} |
- |
-TEST_F(HostDiscardableSharedMemoryManagerTest, |
- ReduceMemoryAfterSegmentHasBeenDeleted) { |
- const int kDataSize = 1024; |
- |
- base::SharedMemoryHandle shared_handle1; |
- manager_->AllocateLockedDiscardableSharedMemoryForChild( |
- base::GetCurrentProcessHandle(), ChildProcessHost::kInvalidUniqueID, |
- kDataSize, 1, &shared_handle1); |
- ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle1)); |
- |
- TestDiscardableSharedMemory memory1(shared_handle1); |
- bool rv = memory1.Map(kDataSize); |
- ASSERT_TRUE(rv); |
- |
- base::SharedMemoryHandle shared_handle2; |
- manager_->AllocateLockedDiscardableSharedMemoryForChild( |
- base::GetCurrentProcessHandle(), ChildProcessHost::kInvalidUniqueID, |
- kDataSize, 2, &shared_handle2); |
- ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle2)); |
- |
- TestDiscardableSharedMemory memory2(shared_handle2); |
- rv = memory2.Map(kDataSize); |
- ASSERT_TRUE(rv); |
- |
- // Unlock and delete segment 1. |
- memory1.SetNow(base::Time::FromDoubleT(1)); |
- memory1.Unlock(0, 0); |
- memory1.Unmap(); |
- memory1.Close(); |
- manager_->ChildDeletedDiscardableSharedMemory( |
- 1, ChildProcessHost::kInvalidUniqueID); |
- |
- // Make sure the manager is able to reduce memory after the segment 1 was |
- // deleted. |
- manager_->SetNow(base::Time::FromDoubleT(2)); |
- manager_->SetMemoryLimit(0); |
- |
- // Unlock segment 2. |
- memory2.SetNow(base::Time::FromDoubleT(3)); |
- memory2.Unlock(0, 0); |
-} |
- |
-class HostDiscardableSharedMemoryManagerScheduleEnforceMemoryPolicyTest |
- : public testing::Test { |
- protected: |
- // Overridden from testing::Test: |
- void SetUp() override { |
- manager_.reset(new HostDiscardableSharedMemoryManager); |
- } |
- |
- // HostDiscardableSharedMemoryManager requires a message loop. |
- base::MessageLoop message_loop_; |
- std::unique_ptr<HostDiscardableSharedMemoryManager> manager_; |
-}; |
- |
-class SetMemoryLimitRunner : public base::DelegateSimpleThread::Delegate { |
- public: |
- SetMemoryLimitRunner(HostDiscardableSharedMemoryManager* manager, |
- size_t limit) |
- : manager_(manager), limit_(limit) {} |
- ~SetMemoryLimitRunner() override {} |
- |
- void Run() override { manager_->SetMemoryLimit(limit_); } |
- |
- private: |
- HostDiscardableSharedMemoryManager* const manager_; |
- const size_t limit_; |
-}; |
- |
-TEST_F(HostDiscardableSharedMemoryManagerScheduleEnforceMemoryPolicyTest, |
- SetMemoryLimitOnSimpleThread) { |
- const int kDataSize = 1024; |
- |
- base::SharedMemoryHandle shared_handle; |
- manager_->AllocateLockedDiscardableSharedMemoryForChild( |
- base::GetCurrentProcessHandle(), ChildProcessHost::kInvalidUniqueID, |
- kDataSize, 0, &shared_handle); |
- ASSERT_TRUE(base::SharedMemory::IsHandleValid(shared_handle)); |
- |
- // Set the memory limit to a value that will require EnforceMemoryPolicy() |
- // to be schedule on a thread without a message loop. |
- SetMemoryLimitRunner runner(manager_.get(), kDataSize - 1); |
- base::DelegateSimpleThread thread(&runner, "memory_limit_setter"); |
- thread.Start(); |
- thread.Join(); |
-} |
- |
-} // namespace |
-} // namespace content |