Index: components/memory_pressure/memory_pressure_stats_collector_unittest.cc |
diff --git a/components/memory_pressure/memory_pressure_stats_collector_unittest.cc b/components/memory_pressure/memory_pressure_stats_collector_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..161798833287578d40df87d8eee86e6af1a1e4c5 |
--- /dev/null |
+++ b/components/memory_pressure/memory_pressure_stats_collector_unittest.cc |
@@ -0,0 +1,144 @@ |
+// 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 "components/memory_pressure/memory_pressure_stats_collector.h" |
+ |
+#include "base/test/histogram_tester.h" |
+#include "base/test/simple_test_tick_clock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace memory_pressure { |
+ |
+// This is outside of the anonymous namespace as it is a friend to the class |
+// under test. |
+class TestMemoryPressureStatsCollector : public MemoryPressureStatsCollector { |
+ public: |
+ TestMemoryPressureStatsCollector(base::TickClock* tick_clock) |
+ : MemoryPressureStatsCollector(tick_clock) {} |
+ |
+ // Accessors. |
+ base::TimeDelta unreported_cumulative_time(int i) const { |
+ return unreported_cumulative_time_[i]; |
+ } |
+ MemoryPressureLevel last_pressure_level() const { |
+ return last_pressure_level_; |
+ } |
+ base::TimeTicks last_update_time() const { return last_update_time_; } |
+}; |
+ |
+namespace { |
+ |
+// Histogram names. |
+static const char kPressureLevel[] = "Memory.PressureLevel"; |
grt (UTC plus 2)
2015/09/08 17:22:46
nit: no "static" for constants in the unnamed name
chrisha
2015/09/08 18:48:43
Done.
|
+static const char kPressureLevelChange[] = "Memory.PressureLevelChange"; |
+ |
+// Test fixture. |
+class MemoryPressureStatsCollectorTest : public testing::Test { |
grt (UTC plus 2)
2015/09/08 17:22:47
i don't see an advantage to having this in an unna
chrisha
2015/09/08 18:48:43
No compelling reason, just habit. Done.
|
+ public: |
+ MemoryPressureStatsCollectorTest() : collector_(&tick_clock_) {} |
+ |
+ void Tick(int ms) { |
+ tick_clock_.Advance(base::TimeDelta::FromMilliseconds(ms)); |
+ } |
+ |
+ // Validates expectations on the amount of accumulated (and unreported) |
+ // time (milliseconds) per pressure level. |
+ void ExpectAccumulated(int none_ms, int moderate_ms, int critical_ms) { |
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(none_ms), |
+ collector_.unreported_cumulative_time(0)); // None. |
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(moderate_ms), |
+ collector_.unreported_cumulative_time(1)); // Moderate. |
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(critical_ms), |
+ collector_.unreported_cumulative_time(2)); // Critical. |
+ } |
+ |
+ // Validates expectations on the amount of reported time (seconds) per |
+ // pressure level. |
+ void ExpectReported(int none_s, int moderate_s, int critical_s) { |
+ int total_s = none_s + moderate_s + critical_s; |
+ |
+ // If the histogram should be empty then simply confirm that it doesn't |
+ // yet exist. |
+ if (total_s == 0) { |
+ EXPECT_TRUE(histograms_.GetTotalCountsForPrefix(kPressureLevel).empty()); |
+ return; |
+ } |
+ |
+ histograms_.ExpectBucketCount(kPressureLevel, 0, none_s); // None. |
+ histograms_.ExpectBucketCount(kPressureLevel, 1, moderate_s); // Moderate. |
+ histograms_.ExpectBucketCount(kPressureLevel, 2, critical_s); // Critical. |
+ histograms_.ExpectTotalCount(kPressureLevel, total_s); |
+ } |
+ |
+ TestMemoryPressureStatsCollector collector_; |
+ base::SimpleTestTickClock tick_clock_; |
grt (UTC plus 2)
2015/09/08 17:22:46
since |tick_clock_| is passed to |collector_|'s ct
chrisha
2015/09/08 18:48:43
Done.
|
+ base::HistogramTester histograms_; |
+}; |
+ |
+} // namespace |
+ |
+TEST_F(MemoryPressureStatsCollectorTest, EndToEnd) { |
+ // Upon construction the last pressure level should be invalid. |
grt (UTC plus 2)
2015/09/08 17:22:46
this seems to be testing an implementation detail.
chrisha
2015/09/08 18:48:43
Good point.
|
+ EXPECT_NE(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE, |
+ collector_.last_pressure_level()); |
+ EXPECT_NE(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE, |
+ collector_.last_pressure_level()); |
+ EXPECT_NE(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_CRITICAL, |
+ collector_.last_pressure_level()); |
+ ExpectAccumulated(0, 0, 0); |
+ ExpectReported(0, 0, 0); |
+ |
+ // A first call should not invoke any reporting functions, but it should |
+ // modify member variables. |
+ Tick(500); |
+ collector_.UpdateStatistics( |
+ MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE); |
+ EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE, |
+ collector_.last_pressure_level()); |
+ EXPECT_EQ(tick_clock_.NowTicks(), collector_.last_update_time()); |
+ ExpectAccumulated(0, 0, 0); |
+ ExpectReported(0, 0, 0); |
+ histograms_.ExpectTotalCount(kPressureLevelChange, 0); |
+ |
+ // A subsequent call with the same pressure level should increment the |
+ // cumulative time but not make a report, as less than one second of time |
+ // has been accumulated. |
+ Tick(500); |
+ collector_.UpdateStatistics( |
+ MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE); |
+ EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE, |
+ collector_.last_pressure_level()); |
+ EXPECT_EQ(tick_clock_.NowTicks(), collector_.last_update_time()); |
+ ExpectAccumulated(500, 0, 0); |
+ ExpectReported(0, 0, 0); |
+ histograms_.ExpectTotalCount(kPressureLevelChange, 0); |
+ |
+ // Yet another call and this time a report should be made, as one second |
+ // of time has been accumulated. 500ms should remain unreported. |
+ Tick(1000); |
+ collector_.UpdateStatistics( |
+ MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE); |
+ EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE, |
+ collector_.last_pressure_level()); |
+ EXPECT_EQ(tick_clock_.NowTicks(), collector_.last_update_time()); |
+ ExpectAccumulated(500, 0, 0); |
+ ExpectReported(1, 0, 0); |
+ histograms_.ExpectTotalCount(kPressureLevelChange, 0); |
+ |
+ // A subsequent call with a different pressure level should increment the |
+ // cumulative time and make several reports. |
+ Tick(2250); |
+ collector_.UpdateStatistics( |
+ MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE); |
+ EXPECT_EQ(MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE, |
+ collector_.last_pressure_level()); |
+ EXPECT_EQ(tick_clock_.NowTicks(), collector_.last_update_time()); |
+ ExpectAccumulated(500, 250, 0); |
+ ExpectReported(1, 2, 0); |
+ histograms_.ExpectBucketCount(kPressureLevelChange, |
+ UMA_MEMORY_PRESSURE_LEVEL_CHANGE_NONE_TO_MODERATE, 1); |
+ histograms_.ExpectTotalCount(kPressureLevelChange, 1); |
+} |
+ |
+} // namespace memory_pressure |