Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(598)

Unified Diff: content/browser/memory/memory_coordinator_impl_unittest.cc

Issue 2718963002: Drop the global memory state from memory coordinator (Closed)
Patch Set: comments Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/browser/memory/memory_coordinator_impl.cc ('k') | content/browser/memory/memory_monitor_android.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/browser/memory/memory_coordinator_impl_unittest.cc
diff --git a/content/browser/memory/memory_coordinator_impl_unittest.cc b/content/browser/memory/memory_coordinator_impl_unittest.cc
index 345eacb790bb0f010ccdb8bcbcb3cd09731e896b..d0c7413b09a995ea3f4e4745e7e0251ef7ffa22c 100644
--- a/content/browser/memory/memory_coordinator_impl_unittest.cc
+++ b/content/browser/memory/memory_coordinator_impl_unittest.cc
@@ -13,8 +13,8 @@
#include "base/test/multiprocess_test.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/test_mock_time_task_runner.h"
+#include "content/browser/memory/memory_condition_observer.h"
#include "content/browser/memory/memory_monitor.h"
-#include "content/browser/memory/memory_state_updater.h"
#include "content/public/common/content_features.h"
#include "content/public/test/mock_render_process_host.h"
#include "content/public/test/test_browser_context.h"
@@ -303,87 +303,103 @@ TEST_F(MemoryCoordinatorImplTest, SetChildMemoryState) {
render_process_host->DecrementSharedWorkerRefCount();
}
-TEST_F(MemoryCoordinatorImplTest, CalculateNextState) {
- auto* state_updater = coordinator_->state_updater_.get();
- state_updater->expected_renderer_size_ = 10;
- state_updater->new_renderers_until_throttled_ = 4;
- state_updater->new_renderers_until_suspended_ = 2;
- state_updater->new_renderers_back_to_normal_ = 5;
- state_updater->new_renderers_back_to_throttled_ = 3;
- DCHECK(state_updater->ValidateParameters());
-
- // The default state is NORMAL.
- EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->GetCurrentMemoryState());
- EXPECT_EQ(base::MemoryState::NORMAL,
- base::MemoryCoordinatorProxy::GetInstance()->
- GetCurrentMemoryState());
+TEST_F(MemoryCoordinatorImplTest, CalculateNextCondition) {
+ auto* condition_observer = coordinator_->condition_observer_.get();
+ condition_observer->expected_renderer_size_ = 10;
+ condition_observer->new_renderers_until_warning_ = 4;
+ condition_observer->new_renderers_until_critical_ = 2;
+ condition_observer->new_renderers_back_to_normal_ = 5;
+ condition_observer->new_renderers_back_to_warning_ = 3;
+ DCHECK(condition_observer->ValidateParameters());
- // Transitions from NORMAL
- coordinator_->current_state_ = base::MemoryState::NORMAL;
- EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->GetCurrentMemoryState());
- EXPECT_EQ(base::MemoryState::NORMAL,
- base::MemoryCoordinatorProxy::GetInstance()->
- GetCurrentMemoryState());
+ // The default condition is NORMAL.
+ EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition());
+ // Transitions from NORMAL
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50);
- EXPECT_EQ(base::MemoryState::NORMAL, state_updater->CalculateNextState());
+ EXPECT_EQ(MemoryCondition::NORMAL,
+ condition_observer->CalculateNextCondition());
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40);
- EXPECT_EQ(base::MemoryState::THROTTLED, state_updater->CalculateNextState());
+ EXPECT_EQ(MemoryCondition::WARNING,
+ condition_observer->CalculateNextCondition());
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20);
- EXPECT_EQ(base::MemoryState::SUSPENDED, state_updater->CalculateNextState());
+ EXPECT_EQ(MemoryCondition::CRITICAL,
+ condition_observer->CalculateNextCondition());
- // Transitions from THROTTLED
- coordinator_->current_state_ = base::MemoryState::THROTTLED;
- EXPECT_EQ(base::MemoryState::THROTTLED,
- coordinator_->GetCurrentMemoryState());
- EXPECT_EQ(base::MemoryState::THROTTLED,
- base::MemoryCoordinatorProxy::GetInstance()->
- GetCurrentMemoryState());
+ // Transitions from WARNING
+ coordinator_->memory_condition_ = MemoryCondition::WARNING;
+ EXPECT_EQ(MemoryCondition::WARNING, coordinator_->GetMemoryCondition());
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40);
- EXPECT_EQ(base::MemoryState::THROTTLED, state_updater->CalculateNextState());
+ EXPECT_EQ(MemoryCondition::WARNING,
+ condition_observer->CalculateNextCondition());
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50);
- EXPECT_EQ(base::MemoryState::NORMAL, state_updater->CalculateNextState());
+ EXPECT_EQ(MemoryCondition::NORMAL,
+ condition_observer->CalculateNextCondition());
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20);
- EXPECT_EQ(base::MemoryState::SUSPENDED, state_updater->CalculateNextState());
+ EXPECT_EQ(MemoryCondition::CRITICAL,
+ condition_observer->CalculateNextCondition());
- // Transitions from SUSPENDED
- coordinator_->current_state_ = base::MemoryState::SUSPENDED;
- // GetCurrentMemoryState() returns THROTTLED state for the browser process
- // when the global state is SUSPENDED.
- EXPECT_EQ(base::MemoryState::THROTTLED,
- coordinator_->GetCurrentMemoryState());
- EXPECT_EQ(base::MemoryState::THROTTLED,
- base::MemoryCoordinatorProxy::GetInstance()->
- GetCurrentMemoryState());
+ // Transitions from CRITICAL
+ coordinator_->memory_condition_ = MemoryCondition::CRITICAL;
+ EXPECT_EQ(MemoryCondition::CRITICAL, coordinator_->GetMemoryCondition());
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20);
- EXPECT_EQ(base::MemoryState::SUSPENDED, state_updater->CalculateNextState());
+ EXPECT_EQ(MemoryCondition::CRITICAL,
+ condition_observer->CalculateNextCondition());
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(30);
- EXPECT_EQ(base::MemoryState::THROTTLED, state_updater->CalculateNextState());
+ EXPECT_EQ(MemoryCondition::WARNING,
+ condition_observer->CalculateNextCondition());
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50);
- EXPECT_EQ(base::MemoryState::NORMAL, state_updater->CalculateNextState());
+ EXPECT_EQ(MemoryCondition::NORMAL,
+ condition_observer->CalculateNextCondition());
}
-TEST_F(MemoryCoordinatorImplTest, UpdateState) {
- auto* state_updater = coordinator_->state_updater_.get();
- state_updater->expected_renderer_size_ = 10;
- state_updater->new_renderers_until_throttled_ = 4;
- state_updater->new_renderers_until_suspended_ = 2;
- state_updater->new_renderers_back_to_normal_ = 5;
- state_updater->new_renderers_back_to_throttled_ = 3;
- DCHECK(state_updater->ValidateParameters());
+TEST_F(MemoryCoordinatorImplTest, UpdateCondition) {
+ auto* condition_observer = coordinator_->condition_observer_.get();
+ condition_observer->expected_renderer_size_ = 10;
+ condition_observer->new_renderers_until_warning_ = 4;
+ condition_observer->new_renderers_until_critical_ = 2;
+ condition_observer->new_renderers_back_to_normal_ = 5;
+ condition_observer->new_renderers_back_to_warning_ = 3;
+ DCHECK(condition_observer->ValidateParameters());
+
+ auto* foreground_child = coordinator_->CreateChildMemoryCoordinator(1);
+ auto* background_child = coordinator_->CreateChildMemoryCoordinator(2);
+ auto iter = coordinator_->children().find(2);
+ iter->second.is_visible = false;
{
- // Transition happens (NORMAL -> THROTTLED).
+ // Transition happens (NORMAL -> WARNING).
+ // Foreground processes should remain NORMAL state but background processes
+ // should become THROTTLED state.
MockMemoryCoordinatorClient client;
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client);
- coordinator_->current_state_ = base::MemoryState::NORMAL;
+ coordinator_->memory_condition_ = MemoryCondition::NORMAL;
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40);
- state_updater->UpdateState();
+ condition_observer->UpdateCondition();
+ task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(40));
+ RunUntilIdle();
+ EXPECT_FALSE(client.did_state_changed());
+ EXPECT_EQ(base::MemoryState::NORMAL, client.state());
+ EXPECT_EQ(mojom::MemoryState::NORMAL, foreground_child->state());
+ EXPECT_EQ(mojom::MemoryState::THROTTLED, background_child->state());
+ base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(&client);
+ }
+
+ {
+ // Transition happens (WARNING -> CRITICAL).
+ // All processes should be in THROTTLED memory state.
+ MockMemoryCoordinatorClient client;
+ base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client);
+ GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20);
+ condition_observer->UpdateCondition();
+ task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(40));
RunUntilIdle();
EXPECT_TRUE(client.did_state_changed());
EXPECT_EQ(base::MemoryState::THROTTLED, client.state());
+ EXPECT_EQ(mojom::MemoryState::THROTTLED, foreground_child->state());
+ EXPECT_EQ(mojom::MemoryState::THROTTLED, background_child->state());
base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(&client);
}
@@ -391,9 +407,9 @@ TEST_F(MemoryCoordinatorImplTest, UpdateState) {
// No transtion (NORMAL -> NORMAL). OnStateChange shouldn't be called.
MockMemoryCoordinatorClient client;
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client);
- coordinator_->current_state_ = base::MemoryState::NORMAL;
+ coordinator_->memory_condition_ = MemoryCondition::NORMAL;
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50);
- state_updater->UpdateState();
+ condition_observer->UpdateCondition();
RunUntilIdle();
EXPECT_FALSE(client.did_state_changed());
EXPECT_EQ(base::MemoryState::NORMAL, client.state());
@@ -402,36 +418,18 @@ TEST_F(MemoryCoordinatorImplTest, UpdateState) {
}
TEST_F(MemoryCoordinatorImplTest, SetMemoryStateForTesting) {
- auto* state_updater = coordinator_->state_updater_.get();
- state_updater->expected_renderer_size_ = 10;
- state_updater->new_renderers_until_throttled_ = 4;
- state_updater->new_renderers_until_suspended_ = 2;
- state_updater->new_renderers_back_to_normal_ = 5;
- state_updater->new_renderers_back_to_throttled_ = 3;
- DCHECK(state_updater->ValidateParameters());
-
MockMemoryCoordinatorClient client;
base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client);
- EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->GetCurrentMemoryState());
+ EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->GetBrowserMemoryState());
EXPECT_EQ(base::MemoryState::NORMAL,
base::MemoryCoordinatorProxy::GetInstance()->
GetCurrentMemoryState());
EXPECT_EQ(base::MemoryState::NORMAL, client.state());
base::MemoryCoordinatorProxy::GetInstance()->SetCurrentMemoryStateForTesting(
- base::MemoryState::SUSPENDED);
- // GetCurrentMemoryState() returns THROTTLED state for the browser process
- // when the global state is SUSPENDED.
- EXPECT_EQ(base::MemoryState::THROTTLED,
- coordinator_->GetCurrentMemoryState());
- EXPECT_EQ(base::MemoryState::THROTTLED,
- base::MemoryCoordinatorProxy::GetInstance()->
- GetCurrentMemoryState());
-
- base::MemoryCoordinatorProxy::GetInstance()->SetCurrentMemoryStateForTesting(
base::MemoryState::THROTTLED);
EXPECT_EQ(base::MemoryState::THROTTLED,
- coordinator_->GetCurrentMemoryState());
+ coordinator_->GetBrowserMemoryState());
EXPECT_EQ(base::MemoryState::THROTTLED,
base::MemoryCoordinatorProxy::GetInstance()->
GetCurrentMemoryState());
@@ -441,50 +439,46 @@ TEST_F(MemoryCoordinatorImplTest, SetMemoryStateForTesting) {
base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(&client);
}
-TEST_F(MemoryCoordinatorImplTest, ForceSetGlobalState) {
- auto* state_updater = coordinator_->state_updater_.get();
- state_updater->expected_renderer_size_ = 10;
- state_updater->new_renderers_until_throttled_ = 4;
- state_updater->new_renderers_until_suspended_ = 2;
- state_updater->new_renderers_back_to_normal_ = 5;
- state_updater->new_renderers_back_to_throttled_ = 3;
- DCHECK(state_updater->ValidateParameters());
+TEST_F(MemoryCoordinatorImplTest, ForceSetMemoryCondition) {
+ auto* condition_observer = coordinator_->condition_observer_.get();
+ condition_observer->expected_renderer_size_ = 10;
+ condition_observer->new_renderers_until_warning_ = 4;
+ condition_observer->new_renderers_until_critical_ = 2;
+ condition_observer->new_renderers_back_to_normal_ = 5;
+ condition_observer->new_renderers_back_to_warning_ = 3;
+ DCHECK(condition_observer->ValidateParameters());
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50);
base::TimeDelta interval = base::TimeDelta::FromSeconds(5);
- base::TimeDelta minimum_transition = base::TimeDelta::FromSeconds(30);
- state_updater->monitoring_interval_ = interval;
- state_updater->minimum_transition_period_ = minimum_transition;
+ condition_observer->monitoring_interval_ = interval;
- // Starts updating states. The initial state should be NORMAL with above
- // configuration.
+ // Starts updating memory condition. The initial condition should be NORMAL
+ // with above configuration.
coordinator_->Start();
task_runner_->RunUntilIdle();
- EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->GetGlobalMemoryState());
+ EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition());
base::TimeDelta force_set_duration = interval * 3;
- coordinator_->ForceSetGlobalState(base::MemoryState::SUSPENDED,
- force_set_duration);
- EXPECT_EQ(base::MemoryState::SUSPENDED, coordinator_->GetGlobalMemoryState());
+ coordinator_->ForceSetMemoryCondition(MemoryCondition::WARNING,
+ force_set_duration);
+ EXPECT_EQ(MemoryCondition::WARNING, coordinator_->GetMemoryCondition());
- // The state should remain SUSPENDED even after some monitoring period are
+ // The condition should remain SUSPENDED even after some monitoring period are
// passed.
task_runner_->FastForwardBy(interval * 2);
task_runner_->RunUntilIdle();
- EXPECT_EQ(base::MemoryState::SUSPENDED, coordinator_->GetGlobalMemoryState());
+ EXPECT_EQ(MemoryCondition::WARNING, coordinator_->GetMemoryCondition());
- // The state should be updated after |force_set_duration| is passed.
+ // The condition should be updated after |force_set_duration| is passed.
task_runner_->FastForwardBy(force_set_duration);
task_runner_->RunUntilIdle();
- EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->GetGlobalMemoryState());
+ EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition());
- // Also make sure that the state is updated based on free avaiable memory.
- // Since the global state has changed in the previous task, we have to wait
- // for |minimum_transition|.
+ // Also make sure that the condition is updated based on free avaiable memory.
GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40);
- task_runner_->FastForwardBy(minimum_transition);
+ task_runner_->FastForwardBy(interval * 2);
task_runner_->RunUntilIdle();
- EXPECT_EQ(base::MemoryState::THROTTLED, coordinator_->GetGlobalMemoryState());
+ EXPECT_EQ(MemoryCondition::WARNING, coordinator_->GetMemoryCondition());
}
TEST_F(MemoryCoordinatorImplTest, DiscardTab) {
« no previous file with comments | « content/browser/memory/memory_coordinator_impl.cc ('k') | content/browser/memory/memory_monitor_android.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698