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

Unified Diff: components/memory_pressure/memory_pressure_stats_collector_unittest.cc

Issue 1310043004: Create MemoryPressureStatsCollector. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Make injected dependency ownership external. Created 5 years, 3 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
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..899d3de80c4d3bd12cc40c5cc02772c5c6815ee3
--- /dev/null
+++ b/components/memory_pressure/memory_pressure_stats_collector_unittest.cc
@@ -0,0 +1,143 @@
+// 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/simple_test_tick_clock.h"
+#include "testing/gmock/include/gmock/gmock.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(ReportingDelegate* reporting_delegate,
+ base::TickClock* tick_clock)
+ : MemoryPressureStatsCollector(reporting_delegate, 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 {
+
+// A mock reporting delegate used in the unit test.
+class LenientMockReportingDelegate
+ : public MemoryPressureStatsCollector::ReportingDelegate {
+ public:
+ using MemoryPressureLevel = MemoryPressureListener::MemoryPressureLevel;
+
+ // ReportingDelegate:
+ MOCK_METHOD2(ReportCumulativeTime, void(MemoryPressureLevel, int));
+ MOCK_METHOD2(ReportLevelChange,
+ void(MemoryPressureLevel, MemoryPressureLevel));
+};
+using MockReportingDelegate = testing::StrictMock<LenientMockReportingDelegate>;
+
+// Test fixture.
+class MemoryPressureStatsCollectorTest : public testing::Test {
+ public:
+ MemoryPressureStatsCollectorTest()
+ : collector_(&reporting_delegate_, &tick_clock_) {}
+
+ void Tick(int ms) {
+ tick_clock_.Advance(base::TimeDelta::FromMilliseconds(ms));
+ }
+
+ TestMemoryPressureStatsCollector collector_;
+ MockReportingDelegate reporting_delegate_;
+ base::SimpleTestTickClock tick_clock_;
+};
+
+} // namespace
+
+TEST_F(MemoryPressureStatsCollectorTest, EndToEnd) {
+ // Upon construction the last pressure level should be invalid.
+ 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());
+
+ // And there should be no accumulated time at any pressure levels.
+ for (size_t i = 0; i < UMA_MEMORY_PRESSURE_LEVEL_COUNT; ++i)
+ EXPECT_TRUE(collector_.unreported_cumulative_time(i).is_zero());
+
+ // 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());
+ for (size_t i = 0; i < UMA_MEMORY_PRESSURE_LEVEL_COUNT; ++i)
+ EXPECT_TRUE(collector_.unreported_cumulative_time(i).is_zero());
+ testing::Mock::VerifyAndClearExpectations(&reporting_delegate_);
+
+ // 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());
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(500),
+ collector_.unreported_cumulative_time(0));
+ EXPECT_TRUE(collector_.unreported_cumulative_time(1).is_zero());
+ EXPECT_TRUE(collector_.unreported_cumulative_time(2).is_zero());
+ testing::Mock::VerifyAndClearExpectations(&reporting_delegate_);
+
+ // 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);
+ EXPECT_CALL(reporting_delegate_,
+ ReportCumulativeTime(
+ MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE, 1));
+ 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());
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(500),
+ collector_.unreported_cumulative_time(0));
+ EXPECT_TRUE(collector_.unreported_cumulative_time(1).is_zero());
+ EXPECT_TRUE(collector_.unreported_cumulative_time(2).is_zero());
+ testing::Mock::VerifyAndClearExpectations(&reporting_delegate_);
+
+ // A subsequent call with a different pressure level should increment the
+ // cumulative time and make several reports.
+ Tick(2250);
+ EXPECT_CALL(reporting_delegate_,
+ ReportCumulativeTime(
+ MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE, 2));
+ EXPECT_CALL(reporting_delegate_,
+ ReportLevelChange(
+ MemoryPressureListener::MEMORY_PRESSURE_LEVEL_NONE,
+ MemoryPressureListener::MEMORY_PRESSURE_LEVEL_MODERATE));
+ 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());
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(500),
+ collector_.unreported_cumulative_time(0));
+ EXPECT_EQ(base::TimeDelta::FromMilliseconds(250),
+ collector_.unreported_cumulative_time(1));
+ EXPECT_TRUE(collector_.unreported_cumulative_time(2).is_zero());
+ testing::Mock::VerifyAndClearExpectations(&reporting_delegate_);
+}
+
+} // namespace memory_pressure

Powered by Google App Engine
This is Rietveld 408576698