Index: base/power_monitor/power_monitor_unittest.cc |
diff --git a/base/power_monitor/power_monitor_unittest.cc b/base/power_monitor/power_monitor_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..18c214d2965a8da7b70303338f219a862e5a9d19 |
--- /dev/null |
+++ b/base/power_monitor/power_monitor_unittest.cc |
@@ -0,0 +1,105 @@ |
+// Copyright (c) 2012 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 "base/power_monitor/power_monitor.h" |
+ |
+#include "base/message_loop.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace base { |
+ |
+class PowerTest : public PowerObserver { |
+ public: |
+ PowerTest() |
+ : power_state_changes_(0), |
+ suspends_(0), |
+ resumes_(0) { |
+ } |
+ |
+ // PowerObserver callbacks. |
+ virtual void OnPowerStateChange(bool on_battery_power) OVERRIDE { |
+ power_state_changes_++; |
+ } |
+ |
+ virtual void OnSuspend() OVERRIDE { |
+ suspends_++; |
+ } |
+ |
+ virtual void OnResume() OVERRIDE { |
+ resumes_++; |
+ } |
+ |
+ // Test status counts. |
+ int power_state_changes() { return power_state_changes_; } |
+ int suspends() { return suspends_; } |
+ int resumes() { return resumes_; } |
+ |
+ private: |
+ int power_state_changes_; // Count of OnPowerStateChange notifications. |
+ int suspends_; // Count of OnSuspend notifications. |
+ int resumes_; // Count of OnResume notifications. |
+}; |
+ |
+class PowerMonitorTest : public testing::Test { |
+ protected: |
+ PowerMonitorTest() { |
+#if defined(OS_MACOSX) |
+ // This needs to happen before PowerMonitor's ctor. |
+ PowerMonitor::AllocateSystemIOPorts(); |
+#endif |
+ power_monitor_.reset(new PowerMonitor); |
+ } |
+ virtual ~PowerMonitorTest() {} |
+ |
+ void ProcessPowerEvent(PowerMonitor::PowerEvent event) { |
+ power_monitor_->ProcessPowerEvent(event); |
+ } |
+ |
+ MessageLoop message_loop_; |
+ scoped_ptr<PowerMonitor> power_monitor_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(PowerMonitorTest); |
+}; |
+ |
+TEST_F(PowerMonitorTest, PowerNotifications) { |
+ const int kObservers = 5; |
+ |
+ PowerTest test[kObservers]; |
+ for (int index = 0; index < kObservers; ++index) |
+ power_monitor_->AddObserver(&test[index]); |
+ |
+ // Send a bunch of power changes. Since the battery power hasn't |
+ // actually changed, we shouldn't get notifications. |
+ for (int index = 0; index < 5; index++) { |
+ ProcessPowerEvent(PowerMonitor::POWER_STATE_EVENT); |
+ EXPECT_EQ(test[0].power_state_changes(), 0); |
+ } |
+ |
+ // Sending resume when not suspended should have no effect. |
+ ProcessPowerEvent(PowerMonitor::RESUME_EVENT); |
+ message_loop_.RunAllPending(); |
+ EXPECT_EQ(test[0].resumes(), 0); |
+ |
+ // Pretend we suspended. |
+ ProcessPowerEvent(PowerMonitor::SUSPEND_EVENT); |
+ message_loop_.RunAllPending(); |
+ EXPECT_EQ(test[0].suspends(), 1); |
+ |
+ // Send a second suspend notification. This should be suppressed. |
+ ProcessPowerEvent(PowerMonitor::SUSPEND_EVENT); |
+ message_loop_.RunAllPending(); |
+ EXPECT_EQ(test[0].suspends(), 1); |
+ |
+ // Pretend we were awakened. |
+ ProcessPowerEvent(PowerMonitor::RESUME_EVENT); |
+ message_loop_.RunAllPending(); |
+ EXPECT_EQ(test[0].resumes(), 1); |
+ |
+ // Send a duplicate resume notification. This should be suppressed. |
+ ProcessPowerEvent(PowerMonitor::RESUME_EVENT); |
+ message_loop_.RunAllPending(); |
+ EXPECT_EQ(test[0].resumes(), 1); |
+} |
+ |
+} // namespace base |