memory_pressure_voter_unittest.cc 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. // Copyright 2019 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/memory_pressure/memory_pressure_voter.h"
  5. #include "base/bind.h"
  6. #include "testing/gtest/include/gtest/gtest.h"
  7. #include "third_party/abseil-cpp/absl/types/optional.h"
  8. namespace memory_pressure {
  9. namespace {
  10. class TestDelegate
  11. : public memory_pressure::MemoryPressureVoteAggregator::Delegate {
  12. private:
  13. void OnMemoryPressureLevelChanged(
  14. base::MemoryPressureListener::MemoryPressureLevel level) override {}
  15. void OnNotifyListenersRequested() override {}
  16. };
  17. } // namespace
  18. TEST(MemoryPressureVoterTest, EvaluateVotes) {
  19. TestDelegate delegate;
  20. MemoryPressureVoteAggregator aggregator(&delegate);
  21. aggregator.SetVotesForTesting(1, 2, 3);
  22. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  23. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
  24. aggregator.SetVotesForTesting(1, 20, 1);
  25. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  26. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
  27. aggregator.SetVotesForTesting(0, 0, 0);
  28. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  29. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE);
  30. aggregator.SetVotesForTesting(0, 2, 0);
  31. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  32. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
  33. // Reset votes so destructor doesn't think there are loose voters.
  34. aggregator.SetVotesForTesting(0, 0, 0);
  35. }
  36. TEST(MemoryPressureVoterTest, OnVote) {
  37. TestDelegate delegate;
  38. MemoryPressureVoteAggregator aggregator(&delegate);
  39. // vote count = 0,0,0
  40. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  41. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE);
  42. aggregator.OnVoteForTesting(
  43. absl::nullopt, base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE);
  44. // vote count = 1,0,0
  45. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  46. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE);
  47. aggregator.OnVoteForTesting(
  48. absl::nullopt,
  49. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
  50. // vote count = 1,0,1
  51. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  52. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
  53. aggregator.OnVoteForTesting(
  54. absl::nullopt,
  55. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
  56. // vote count = 1,1,1
  57. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  58. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
  59. aggregator.OnVoteForTesting(
  60. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL,
  61. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
  62. // vote count = 1,2,0
  63. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  64. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
  65. aggregator.OnVoteForTesting(
  66. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE,
  67. absl::nullopt);
  68. // vote count = 1,1,0
  69. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  70. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
  71. // Reset votes so destructor doesn't think there are loose voters.
  72. aggregator.SetVotesForTesting(0, 0, 0);
  73. }
  74. TEST(MemoryPressureVoterTest, SetVote) {
  75. TestDelegate delegate;
  76. MemoryPressureVoteAggregator aggregator(&delegate);
  77. auto voter_critical = aggregator.CreateVoter();
  78. auto voter_moderate = aggregator.CreateVoter();
  79. voter_critical->SetVote(
  80. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL, false);
  81. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  82. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
  83. voter_moderate->SetVote(
  84. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE, false);
  85. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  86. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL);
  87. voter_critical.reset();
  88. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  89. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE);
  90. voter_moderate.reset();
  91. EXPECT_EQ(aggregator.EvaluateVotesForTesting(),
  92. base::MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE);
  93. }
  94. } // namespace memory_pressure