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

Side by Side Diff: content/browser/memory/memory_coordinator_impl_unittest.cc

Issue 2943603002: Remove MemoryCondition::WARNING (Closed)
Patch Set: rebase Created 3 years, 6 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 unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "content/browser/memory/memory_coordinator_impl.h" 5 #include "content/browser/memory/memory_coordinator_impl.h"
6 6
7 #include "base/memory/memory_coordinator_client_registry.h" 7 #include "base/memory/memory_coordinator_client_registry.h"
8 #include "base/memory/memory_coordinator_proxy.h" 8 #include "base/memory/memory_coordinator_proxy.h"
9 #include "base/memory/memory_pressure_monitor.h" 9 #include "base/memory/memory_pressure_monitor.h"
10 #include "base/memory/ptr_util.h" 10 #include "base/memory/ptr_util.h"
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after
294 RunUntilIdle(); 294 RunUntilIdle();
295 EXPECT_EQ(mojom::MemoryState::NORMAL, child->state()); 295 EXPECT_EQ(mojom::MemoryState::NORMAL, child->state());
296 coordinator_->policy_->OnChildVisibilityChanged(1, false); 296 coordinator_->policy_->OnChildVisibilityChanged(1, false);
297 RunUntilIdle(); 297 RunUntilIdle();
298 #if defined(OS_ANDROID) 298 #if defined(OS_ANDROID)
299 EXPECT_EQ(mojom::MemoryState::THROTTLED, child->state()); 299 EXPECT_EQ(mojom::MemoryState::THROTTLED, child->state());
300 #else 300 #else
301 EXPECT_EQ(mojom::MemoryState::NORMAL, child->state()); 301 EXPECT_EQ(mojom::MemoryState::NORMAL, child->state());
302 #endif 302 #endif
303 303
304 coordinator_->memory_condition_ = MemoryCondition::WARNING;
305 coordinator_->policy_->OnChildVisibilityChanged(1, true);
306 RunUntilIdle();
307 EXPECT_EQ(mojom::MemoryState::NORMAL, child->state());
308 coordinator_->policy_->OnChildVisibilityChanged(1, false);
309 RunUntilIdle();
310 EXPECT_EQ(mojom::MemoryState::THROTTLED, child->state());
311
312 coordinator_->memory_condition_ = MemoryCondition::CRITICAL; 304 coordinator_->memory_condition_ = MemoryCondition::CRITICAL;
313 coordinator_->policy_->OnChildVisibilityChanged(1, true); 305 coordinator_->policy_->OnChildVisibilityChanged(1, true);
314 RunUntilIdle(); 306 RunUntilIdle();
315 EXPECT_EQ(mojom::MemoryState::THROTTLED, child->state()); 307 EXPECT_EQ(mojom::MemoryState::THROTTLED, child->state());
316 coordinator_->policy_->OnChildVisibilityChanged(1, false); 308 coordinator_->policy_->OnChildVisibilityChanged(1, false);
317 RunUntilIdle(); 309 RunUntilIdle();
318 EXPECT_EQ(mojom::MemoryState::THROTTLED, child->state()); 310 EXPECT_EQ(mojom::MemoryState::THROTTLED, child->state());
319 } 311 }
320 312
321 TEST_F(MemoryCoordinatorImplTest, CalculateNextCondition) { 313 TEST_F(MemoryCoordinatorImplTest, CalculateNextCondition) {
322 auto* condition_observer = coordinator_->condition_observer_.get(); 314 auto* condition_observer = coordinator_->condition_observer_.get();
323 condition_observer->expected_renderer_size_ = 10;
324 condition_observer->new_renderers_until_warning_ = 4;
325 condition_observer->new_renderers_until_critical_ = 2;
326 condition_observer->new_renderers_back_to_normal_ = 5;
327 condition_observer->new_renderers_back_to_warning_ = 3;
328 DCHECK(condition_observer->ValidateParameters());
329 315
330 // The default condition is NORMAL. 316 // The default condition is NORMAL.
331 EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition()); 317 EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition());
332 318
333 // Transitions from NORMAL 319 // Transitions from NORMAL
334 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50); 320 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(1000);
335 EXPECT_EQ(MemoryCondition::NORMAL, 321 EXPECT_EQ(MemoryCondition::NORMAL,
336 condition_observer->CalculateNextCondition()); 322 condition_observer->CalculateNextCondition());
337 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40); 323 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(0);
338 EXPECT_EQ(MemoryCondition::WARNING,
339 condition_observer->CalculateNextCondition());
340 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20);
341 EXPECT_EQ(MemoryCondition::CRITICAL,
342 condition_observer->CalculateNextCondition());
343
344 // Transitions from WARNING
345 coordinator_->memory_condition_ = MemoryCondition::WARNING;
346 EXPECT_EQ(MemoryCondition::WARNING, coordinator_->GetMemoryCondition());
347
348 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40);
349 EXPECT_EQ(MemoryCondition::WARNING,
350 condition_observer->CalculateNextCondition());
351 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50);
352 EXPECT_EQ(MemoryCondition::NORMAL,
353 condition_observer->CalculateNextCondition());
354 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20);
355 EXPECT_EQ(MemoryCondition::CRITICAL, 324 EXPECT_EQ(MemoryCondition::CRITICAL,
356 condition_observer->CalculateNextCondition()); 325 condition_observer->CalculateNextCondition());
357 326
358 // Transitions from CRITICAL 327 // Transitions from CRITICAL
359 coordinator_->memory_condition_ = MemoryCondition::CRITICAL; 328 coordinator_->memory_condition_ = MemoryCondition::CRITICAL;
360 EXPECT_EQ(MemoryCondition::CRITICAL, coordinator_->GetMemoryCondition()); 329 EXPECT_EQ(MemoryCondition::CRITICAL, coordinator_->GetMemoryCondition());
361 330 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(1000);
362 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20);
363 EXPECT_EQ(MemoryCondition::CRITICAL,
364 condition_observer->CalculateNextCondition());
365 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(30);
366 EXPECT_EQ(MemoryCondition::WARNING,
367 condition_observer->CalculateNextCondition());
368 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50);
369 EXPECT_EQ(MemoryCondition::NORMAL, 331 EXPECT_EQ(MemoryCondition::NORMAL,
370 condition_observer->CalculateNextCondition()); 332 condition_observer->CalculateNextCondition());
371 } 333 }
372 334
373 TEST_F(MemoryCoordinatorImplTest, UpdateCondition) { 335 TEST_F(MemoryCoordinatorImplTest, UpdateCondition) {
374 auto* condition_observer = coordinator_->condition_observer_.get(); 336 auto* condition_observer = coordinator_->condition_observer_.get();
375 condition_observer->expected_renderer_size_ = 10;
376 condition_observer->new_renderers_until_warning_ = 4;
377 condition_observer->new_renderers_until_critical_ = 2;
378 condition_observer->new_renderers_back_to_normal_ = 5;
379 condition_observer->new_renderers_back_to_warning_ = 3;
380 DCHECK(condition_observer->ValidateParameters());
381 337
382 auto* foreground_child = coordinator_->CreateChildMemoryCoordinator(1); 338 auto* foreground_child = coordinator_->CreateChildMemoryCoordinator(1);
383 auto* background_child = coordinator_->CreateChildMemoryCoordinator(2); 339 auto* background_child = coordinator_->CreateChildMemoryCoordinator(2);
384 auto iter = coordinator_->children().find(2); 340 auto iter = coordinator_->children().find(2);
385 iter->second.is_visible = false; 341 iter->second.is_visible = false;
386 342
387 { 343 {
388 // Transition happens (NORMAL -> WARNING). 344 // Transition happens (NORMAL -> CRITICAL).
389 // Foreground processes should remain NORMAL state but background processes 345 // All processes should be in THROTTLED memory state.
390 // should become THROTTLED state.
391 MockMemoryCoordinatorClient client; 346 MockMemoryCoordinatorClient client;
392 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client); 347 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client);
393 coordinator_->memory_condition_ = MemoryCondition::NORMAL; 348 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(0);
394 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40);
395 condition_observer->UpdateCondition(); 349 condition_observer->UpdateCondition();
396 task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(40)); 350 task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(40));
397 RunUntilIdle(); 351 RunUntilIdle();
398 EXPECT_FALSE(client.did_state_changed());
399 EXPECT_EQ(base::MemoryState::NORMAL, client.state());
400 EXPECT_EQ(mojom::MemoryState::NORMAL, foreground_child->state());
401 EXPECT_EQ(mojom::MemoryState::THROTTLED, background_child->state());
402 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(&client);
403 }
404
405 {
406 // Transition happens (WARNING -> CRITICAL).
407 // All processes should be in THROTTLED memory state.
408 MockMemoryCoordinatorClient client;
409 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client);
410 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20);
411 condition_observer->UpdateCondition();
412 task_runner_->FastForwardBy(base::TimeDelta::FromSeconds(40));
413 RunUntilIdle();
414 EXPECT_TRUE(client.did_state_changed()); 352 EXPECT_TRUE(client.did_state_changed());
415 EXPECT_EQ(base::MemoryState::THROTTLED, client.state()); 353 EXPECT_EQ(base::MemoryState::THROTTLED, client.state());
416 EXPECT_EQ(mojom::MemoryState::THROTTLED, foreground_child->state()); 354 EXPECT_EQ(mojom::MemoryState::THROTTLED, foreground_child->state());
417 EXPECT_EQ(mojom::MemoryState::THROTTLED, background_child->state()); 355 EXPECT_EQ(mojom::MemoryState::THROTTLED, background_child->state());
418 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(&client); 356 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(&client);
419 } 357 }
420 358
421 { 359 {
422 // No transtion (NORMAL -> NORMAL). OnStateChange shouldn't be called. 360 // No transtion (NORMAL -> NORMAL). OnStateChange shouldn't be called.
423 MockMemoryCoordinatorClient client; 361 MockMemoryCoordinatorClient client;
424 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client); 362 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client);
425 coordinator_->memory_condition_ = MemoryCondition::NORMAL; 363 coordinator_->memory_condition_ = MemoryCondition::NORMAL;
426 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50); 364 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(1000);
427 condition_observer->UpdateCondition(); 365 condition_observer->UpdateCondition();
428 RunUntilIdle(); 366 RunUntilIdle();
429 EXPECT_FALSE(client.did_state_changed()); 367 EXPECT_FALSE(client.did_state_changed());
430 EXPECT_EQ(base::MemoryState::NORMAL, client.state()); 368 EXPECT_EQ(base::MemoryState::NORMAL, client.state());
431 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(&client); 369 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(&client);
432 } 370 }
433 371
434 { 372 {
435 // Transition happends but browser state change is delayed 373 // Transition happends but browser state change is delayed
436 // (CRITICAL -> NORMAL). 374 // (CRITICAL -> NORMAL).
437 base::TimeDelta transition_interval = 375 base::TimeDelta transition_interval =
438 coordinator_->minimum_state_transition_period_ + 376 coordinator_->minimum_state_transition_period_ +
439 base::TimeDelta::FromSeconds(1); 377 base::TimeDelta::FromSeconds(1);
440 coordinator_->memory_condition_ = MemoryCondition::NORMAL; 378 coordinator_->memory_condition_ = MemoryCondition::NORMAL;
441 coordinator_->last_state_change_ = task_runner_->NowTicks(); 379 coordinator_->last_state_change_ = task_runner_->NowTicks();
442 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20); 380 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(0);
443 condition_observer->UpdateCondition(); 381 condition_observer->UpdateCondition();
444 EXPECT_EQ(base::MemoryState::THROTTLED, 382 EXPECT_EQ(base::MemoryState::THROTTLED,
445 coordinator_->GetCurrentMemoryState()); 383 coordinator_->GetCurrentMemoryState());
446 384
447 // Back to NORMAL condition before |minimum_state_transition_period_| is 385 // Back to NORMAL condition before |minimum_state_transition_period_| is
448 // passed. At this point the browser's state shouldn't be changed. 386 // passed. At this point the browser's state shouldn't be changed.
449 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50); 387 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(1000);
450 condition_observer->UpdateCondition(); 388 condition_observer->UpdateCondition();
451 task_runner_->FastForwardBy(transition_interval / 2); 389 task_runner_->FastForwardBy(transition_interval / 2);
452 EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition()); 390 EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition());
453 EXPECT_EQ(base::MemoryState::THROTTLED, 391 EXPECT_EQ(base::MemoryState::THROTTLED,
454 coordinator_->GetCurrentMemoryState()); 392 coordinator_->GetCurrentMemoryState());
455 393
456 // |minimum_state_transition_period_| is passed. State should be changed. 394 // |minimum_state_transition_period_| is passed. State should be changed.
457 task_runner_->FastForwardBy(transition_interval / 2); 395 task_runner_->FastForwardBy(transition_interval / 2);
458 EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->GetCurrentMemoryState()); 396 EXPECT_EQ(base::MemoryState::NORMAL, coordinator_->GetCurrentMemoryState());
459 } 397 }
460 } 398 }
461 399
400 // TODO(bashi): Move ForceSetMemoryCondition?
462 TEST_F(MemoryCoordinatorImplTest, ForceSetMemoryCondition) { 401 TEST_F(MemoryCoordinatorImplTest, ForceSetMemoryCondition) {
463 auto* condition_observer = coordinator_->condition_observer_.get(); 402 auto* condition_observer = coordinator_->condition_observer_.get();
464 condition_observer->expected_renderer_size_ = 10; 403 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(1000);
465 condition_observer->new_renderers_until_warning_ = 4;
466 condition_observer->new_renderers_until_critical_ = 2;
467 condition_observer->new_renderers_back_to_normal_ = 5;
468 condition_observer->new_renderers_back_to_warning_ = 3;
469 DCHECK(condition_observer->ValidateParameters());
470 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50);
471 404
472 base::TimeDelta interval = base::TimeDelta::FromSeconds(5); 405 base::TimeDelta interval = base::TimeDelta::FromSeconds(5);
473 condition_observer->monitoring_interval_ = interval; 406 condition_observer->monitoring_interval_ = interval;
474 407
475 // Starts updating memory condition. The initial condition should be NORMAL 408 // Starts updating memory condition. The initial condition should be NORMAL
476 // with above configuration. 409 // with above configuration.
477 coordinator_->Start(); 410 coordinator_->Start();
478 task_runner_->RunUntilIdle(); 411 task_runner_->RunUntilIdle();
479 EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition()); 412 EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition());
480 413
481 base::TimeDelta force_set_duration = interval * 3; 414 base::TimeDelta force_set_duration = interval * 3;
482 coordinator_->ForceSetMemoryCondition(MemoryCondition::WARNING, 415 coordinator_->ForceSetMemoryCondition(MemoryCondition::CRITICAL,
483 force_set_duration); 416 force_set_duration);
484 EXPECT_EQ(MemoryCondition::WARNING, coordinator_->GetMemoryCondition()); 417 EXPECT_EQ(MemoryCondition::CRITICAL, coordinator_->GetMemoryCondition());
485 418
486 // The condition should remain SUSPENDED even after some monitoring period are 419 // The condition should remain CRITICAL even after some monitoring period are
487 // passed. 420 // passed.
488 task_runner_->FastForwardBy(interval * 2); 421 task_runner_->FastForwardBy(interval * 2);
489 task_runner_->RunUntilIdle(); 422 task_runner_->RunUntilIdle();
490 EXPECT_EQ(MemoryCondition::WARNING, coordinator_->GetMemoryCondition()); 423 EXPECT_EQ(MemoryCondition::CRITICAL, coordinator_->GetMemoryCondition());
491 424
492 // The condition should be updated after |force_set_duration| is passed. 425 // The condition should be updated after |force_set_duration| is passed.
493 task_runner_->FastForwardBy(force_set_duration); 426 task_runner_->FastForwardBy(force_set_duration);
494 task_runner_->RunUntilIdle(); 427 task_runner_->RunUntilIdle();
495 EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition()); 428 EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition());
496 429
497 // Also make sure that the condition is updated based on free avaiable memory. 430 // Also make sure that the condition is updated based on free avaiable memory.
498 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40); 431 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(0);
499 task_runner_->FastForwardBy(interval * 2); 432 task_runner_->FastForwardBy(interval * 2);
500 task_runner_->RunUntilIdle(); 433 task_runner_->RunUntilIdle();
501 EXPECT_EQ(MemoryCondition::WARNING, coordinator_->GetMemoryCondition()); 434 EXPECT_EQ(MemoryCondition::CRITICAL, coordinator_->GetMemoryCondition());
502 } 435 }
503 436
504 TEST_F(MemoryCoordinatorImplTest, DiscardTab) { 437 TEST_F(MemoryCoordinatorImplTest, DiscardTab) {
505 coordinator_->DiscardTab(); 438 coordinator_->DiscardTab();
506 EXPECT_EQ(1, coordinator_->GetDelegate()->discard_tab_count()); 439 EXPECT_EQ(1, coordinator_->GetDelegate()->discard_tab_count());
507 } 440 }
508 441
509 TEST_F(MemoryCoordinatorImplTest, DiscardTabUnderCritical) { 442 TEST_F(MemoryCoordinatorImplTest, DiscardTabUnderCritical) {
510 auto* condition_observer = coordinator_->condition_observer_.get(); 443 auto* condition_observer = coordinator_->condition_observer_.get();
511 condition_observer->expected_renderer_size_ = 10; 444 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(1000);
512 condition_observer->new_renderers_until_warning_ = 4;
513 condition_observer->new_renderers_until_critical_ = 2;
514 condition_observer->new_renderers_back_to_normal_ = 5;
515 condition_observer->new_renderers_back_to_warning_ = 3;
516 DCHECK(condition_observer->ValidateParameters());
517 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50);
518 445
519 base::TimeDelta interval = base::TimeDelta::FromSeconds(5); 446 base::TimeDelta interval = base::TimeDelta::FromSeconds(5);
520 condition_observer->monitoring_interval_ = interval; 447 condition_observer->monitoring_interval_ = interval;
521 448
522 auto* delegate = coordinator_->GetDelegate(); 449 auto* delegate = coordinator_->GetDelegate();
523 450
524 coordinator_->Start(); 451 coordinator_->Start();
525 task_runner_->RunUntilIdle(); 452 task_runner_->RunUntilIdle();
526 EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition()); 453 EXPECT_EQ(MemoryCondition::NORMAL, coordinator_->GetMemoryCondition());
527 EXPECT_EQ(0, delegate->discard_tab_count()); 454 EXPECT_EQ(0, delegate->discard_tab_count());
528 455
529 // Enter WARNING condition. No tab discarding should happen.
530 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(40);
531 task_runner_->FastForwardBy(interval + base::TimeDelta::FromSeconds(1));
532 EXPECT_EQ(0, delegate->discard_tab_count());
533 task_runner_->FastForwardBy(interval);
534 EXPECT_EQ(0, delegate->discard_tab_count());
535
536 // Enter CRITICAL condition. Tab discarding should start. 456 // Enter CRITICAL condition. Tab discarding should start.
537 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(20); 457 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(0);
538 task_runner_->FastForwardBy(interval); 458 task_runner_->FastForwardBy(interval);
539 EXPECT_EQ(1, delegate->discard_tab_count()); 459 EXPECT_EQ(1, delegate->discard_tab_count());
540 task_runner_->FastForwardBy(interval); 460 task_runner_->FastForwardBy(interval);
541 EXPECT_EQ(2, delegate->discard_tab_count()); 461 EXPECT_EQ(2, delegate->discard_tab_count());
542 462
543 // Back to NORMAL. Tab discarding should stop. 463 // Back to NORMAL. Tab discarding should stop.
544 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(50); 464 GetMockMemoryMonitor()->SetFreeMemoryUntilCriticalMB(1000);
545 task_runner_->FastForwardBy(interval); 465 task_runner_->FastForwardBy(interval);
546 EXPECT_EQ(2, delegate->discard_tab_count()); 466 EXPECT_EQ(2, delegate->discard_tab_count());
547 task_runner_->FastForwardBy(interval); 467 task_runner_->FastForwardBy(interval);
548 EXPECT_EQ(2, delegate->discard_tab_count()); 468 EXPECT_EQ(2, delegate->discard_tab_count());
549 } 469 }
550 470
551 // TODO(bashi): Move policy specific tests into a separate file. 471 // TODO(bashi): Move policy specific tests into a separate file.
552 TEST_F(MemoryCoordinatorImplTest, OnWarningCondition) {
553 MockMemoryCoordinatorClient client;
554 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client);
555 auto* child1 = coordinator_->CreateChildMemoryCoordinator(1);
556 auto* child2 = coordinator_->CreateChildMemoryCoordinator(2);
557 base::TimeDelta interval = base::TimeDelta::FromSeconds(31);
558
559 // child1: Foreground, child2: Background
560 coordinator_->policy_->OnChildVisibilityChanged(1, true);
561 coordinator_->policy_->OnChildVisibilityChanged(2, false);
562
563 // Note: we never ask foreground processes (including the browser process) to
564 // purge memory on WARNING condition.
565
566 // Don't ask the background child to purge until the child remains
567 // backgrounded for a certain period of time.
568 coordinator_->policy_->OnWarningCondition();
569 RunUntilIdle();
570 EXPECT_EQ(0, client.purge_memory_calls());
571 EXPECT_EQ(0, child1->purge_memory_calls());
572 EXPECT_EQ(0, child2->purge_memory_calls());
573
574 // After a certain period of time is passed, request the child to purge
575 // memory.
576 task_runner_->FastForwardBy(interval);
577 coordinator_->policy_->OnWarningCondition();
578 task_runner_->RunUntilIdle();
579 RunUntilIdle();
580 EXPECT_EQ(0, client.purge_memory_calls());
581 EXPECT_EQ(0, child1->purge_memory_calls());
582 EXPECT_EQ(1, child2->purge_memory_calls());
583
584 // Don't purge memory more than once when the child stays backgrounded.
585 task_runner_->FastForwardBy(interval);
586 coordinator_->policy_->OnWarningCondition();
587 RunUntilIdle();
588 EXPECT_EQ(0, client.purge_memory_calls());
589 EXPECT_EQ(0, child1->purge_memory_calls());
590 EXPECT_EQ(1, child2->purge_memory_calls());
591
592 // The background child goes to foreground, goes to background, then a
593 // certain period of time is passed. Another purging request should be sent.
594 coordinator_->policy_->OnChildVisibilityChanged(2, true);
595 coordinator_->policy_->OnChildVisibilityChanged(2, false);
596 task_runner_->FastForwardBy(interval);
597 coordinator_->policy_->OnWarningCondition();
598 RunUntilIdle();
599 EXPECT_EQ(0, client.purge_memory_calls());
600 EXPECT_EQ(0, child1->purge_memory_calls());
601 EXPECT_EQ(2, child2->purge_memory_calls());
602
603 base::MemoryCoordinatorClientRegistry::GetInstance()->Unregister(&client);
604 }
605
606 // TODO(bashi): Move policy specific tests into a separate file.
607 TEST_F(MemoryCoordinatorImplTest, OnCriticalCondition) { 472 TEST_F(MemoryCoordinatorImplTest, OnCriticalCondition) {
608 MockMemoryCoordinatorClient client; 473 MockMemoryCoordinatorClient client;
609 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client); 474 base::MemoryCoordinatorClientRegistry::GetInstance()->Register(&client);
610 auto* child1 = coordinator_->CreateChildMemoryCoordinator(1); 475 auto* child1 = coordinator_->CreateChildMemoryCoordinator(1);
611 auto* child2 = coordinator_->CreateChildMemoryCoordinator(2); 476 auto* child2 = coordinator_->CreateChildMemoryCoordinator(2);
612 auto* delegate = coordinator_->GetDelegate(); 477 auto* delegate = coordinator_->GetDelegate();
613 base::TimeDelta interval = base::TimeDelta::FromSeconds(31); 478 base::TimeDelta interval = base::TimeDelta::FromSeconds(31);
614 479
615 // child1: Foreground, child2: Background 480 // child1: Foreground, child2: Background
616 coordinator_->policy_->OnChildVisibilityChanged(1, true); 481 coordinator_->policy_->OnChildVisibilityChanged(1, true);
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
682 547
683 EXPECT_TRUE( 548 EXPECT_TRUE(
684 coordinator_->SetChildMemoryState(1, MemoryState::THROTTLED)); 549 coordinator_->SetChildMemoryState(1, MemoryState::THROTTLED));
685 EXPECT_EQ(base::MemoryState::THROTTLED, 550 EXPECT_EQ(base::MemoryState::THROTTLED,
686 coordinator_->GetStateForProcess(process1.Handle())); 551 coordinator_->GetStateForProcess(process1.Handle()));
687 EXPECT_EQ(base::MemoryState::NORMAL, 552 EXPECT_EQ(base::MemoryState::NORMAL,
688 coordinator_->GetStateForProcess(process2.Handle())); 553 coordinator_->GetStateForProcess(process2.Handle()));
689 } 554 }
690 555
691 } // namespace content 556 } // namespace content
OLDNEW
« 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