blob: 3920a9d5d87669f9122a6f32282f100d85e222c5 [file] [log] [blame]
Gary Morain43bc6272012-01-30 14:01:15 -08001// Copyright (c) 2012 The Chromium OS 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
5#include "shill/power_manager.h"
6
7#include <string>
8
Eric Shienbrood3e20a232012-02-16 11:35:56 -05009#include <base/bind.h>
10#include <base/memory/scoped_ptr.h>
Gary Morain43bc6272012-01-30 14:01:15 -080011#include <gmock/gmock.h>
12#include <gtest/gtest.h>
13
Darin Petkov3ec55342012-09-28 14:04:44 +020014#include "shill/mock_event_dispatcher.h"
Gary Morain43bc6272012-01-30 14:01:15 -080015#include "shill/mock_power_manager_proxy.h"
16#include "shill/power_manager_proxy_interface.h"
17#include "shill/proxy_factory.h"
18
Eric Shienbrood3e20a232012-02-16 11:35:56 -050019using base::Bind;
20using base::Unretained;
Gary Morain52fabab2012-08-22 09:27:31 -070021using std::map;
Gary Morain43bc6272012-01-30 14:01:15 -080022using std::string;
23using testing::_;
24using testing::Test;
25
26namespace shill {
27
Gary Morain43bc6272012-01-30 14:01:15 -080028namespace {
29
30class FakeProxyFactory : public ProxyFactory {
31 public:
Gary Morain52fabab2012-08-22 09:27:31 -070032 FakeProxyFactory()
33 : delegate_(NULL),
34 proxy_(new MockPowerManagerProxy) {}
Gary Morain43bc6272012-01-30 14:01:15 -080035
36 virtual PowerManagerProxyInterface *CreatePowerManagerProxy(
37 PowerManagerProxyDelegate *delegate) {
38 delegate_ = delegate;
Gary Morain52fabab2012-08-22 09:27:31 -070039 return proxy_;
Gary Morain43bc6272012-01-30 14:01:15 -080040 }
41 PowerManagerProxyDelegate *delegate() const { return delegate_; }
Gary Morain52fabab2012-08-22 09:27:31 -070042 MockPowerManagerProxy *proxy() const { return proxy_; }
Gary Morain43bc6272012-01-30 14:01:15 -080043
44 private:
45 PowerManagerProxyDelegate *delegate_;
Gary Morain52fabab2012-08-22 09:27:31 -070046 MockPowerManagerProxy *const proxy_;
Gary Morain43bc6272012-01-30 14:01:15 -080047};
48
49} // namespace
50
51class PowerManagerTest : public Test {
52 public:
Gary Morain52fabab2012-08-22 09:27:31 -070053 static const char kKey1[];
54 static const char kKey2[];
55 static const uint32 kSequence1 = 123;
56 static const uint32 kSequence2 = 456;
57
Gary Morain43bc6272012-01-30 14:01:15 -080058 PowerManagerTest()
Darin Petkov3ec55342012-09-28 14:04:44 +020059 : power_manager_(&dispatcher_, &factory_),
Gary Morain52fabab2012-08-22 09:27:31 -070060 delegate_(factory_.delegate()) {
61 state_change_callback1_ =
62 Bind(&PowerManagerTest::StateChangeAction1, Unretained(this));
63 state_change_callback2_ =
64 Bind(&PowerManagerTest::StateChangeAction2, Unretained(this));
65 suspend_delay_callback1_ =
66 Bind(&PowerManagerTest::SuspendDelayAction1, Unretained(this));
67 suspend_delay_callback2_ =
68 Bind(&PowerManagerTest::SuspendDelayAction2, Unretained(this));
69 }
Gary Morain43bc6272012-01-30 14:01:15 -080070
Gary Morain52fabab2012-08-22 09:27:31 -070071 MOCK_METHOD1(StateChangeAction1, void(PowerManager::SuspendState));
72 MOCK_METHOD1(StateChangeAction2, void(PowerManager::SuspendState));
73 MOCK_METHOD1(SuspendDelayAction1, void(uint32));
74 MOCK_METHOD1(SuspendDelayAction2, void(uint32));
Eric Shienbrood3e20a232012-02-16 11:35:56 -050075
Gary Morain43bc6272012-01-30 14:01:15 -080076 protected:
Darin Petkov3ec55342012-09-28 14:04:44 +020077 void OnSuspendDelay(uint32 sequence_number) {
78 EXPECT_CALL(dispatcher_,
79 PostDelayedTask(_, PowerManager::kSuspendTimeoutMilliseconds));
80 factory_.delegate()->OnSuspendDelay(sequence_number);
81 EXPECT_EQ(PowerManagerProxyDelegate::kSuspending,
82 power_manager_.power_state());
83 }
84
85 void OnSuspendTimeout() {
86 power_manager_.OnSuspendTimeout();
87 }
88
89 MockEventDispatcher dispatcher_;
Gary Morain43bc6272012-01-30 14:01:15 -080090 FakeProxyFactory factory_;
91 PowerManager power_manager_;
92 PowerManagerProxyDelegate *const delegate_;
Gary Morain52fabab2012-08-22 09:27:31 -070093 PowerManager::PowerStateCallback state_change_callback1_;
94 PowerManager::PowerStateCallback state_change_callback2_;
95 PowerManager::SuspendDelayCallback suspend_delay_callback1_;
96 PowerManager::SuspendDelayCallback suspend_delay_callback2_;
Gary Morain43bc6272012-01-30 14:01:15 -080097};
98
Gary Morain52fabab2012-08-22 09:27:31 -070099const char PowerManagerTest::kKey1[] = "Zaphod";
100const char PowerManagerTest::kKey2[] = "Beeblebrox";
101
Darin Petkovca621542012-07-25 14:25:56 +0200102TEST_F(PowerManagerTest, OnPowerStateChanged) {
103 EXPECT_EQ(PowerManagerProxyDelegate::kUnknown, power_manager_.power_state());
104 power_manager_.OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
105 EXPECT_EQ(PowerManagerProxyDelegate::kOn, power_manager_.power_state());
106}
107
Gary Morain52fabab2012-08-22 09:27:31 -0700108TEST_F(PowerManagerTest, AddStateChangeCallback) {
109 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kOn));
110 power_manager_.AddStateChangeCallback(kKey1, state_change_callback1_);
Gary Morain43bc6272012-01-30 14:01:15 -0800111 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
Gary Morain52fabab2012-08-22 09:27:31 -0700112 power_manager_.RemoveStateChangeCallback(kKey1);
Gary Morain43bc6272012-01-30 14:01:15 -0800113}
114
Gary Morain52fabab2012-08-22 09:27:31 -0700115TEST_F(PowerManagerTest, AddSuspendDelayCallback) {
116 EXPECT_CALL(*this, SuspendDelayAction1(kSequence1));
117 power_manager_.AddSuspendDelayCallback(kKey1, suspend_delay_callback1_);
Darin Petkov3ec55342012-09-28 14:04:44 +0200118 EXPECT_EQ(PowerManagerProxyDelegate::kUnknown, power_manager_.power_state());
119 OnSuspendDelay(kSequence1);
Gary Morain52fabab2012-08-22 09:27:31 -0700120 power_manager_.RemoveSuspendDelayCallback(kKey1);
121}
Gary Morain43bc6272012-01-30 14:01:15 -0800122
Gary Morain52fabab2012-08-22 09:27:31 -0700123TEST_F(PowerManagerTest, AddMultipleStateChangeRunMultiple) {
124 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kOn));
125 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kMem));
126 power_manager_.AddStateChangeCallback(kKey1, state_change_callback1_);
127
128 EXPECT_CALL(*this, StateChangeAction2(PowerManagerProxyDelegate::kOn));
129 EXPECT_CALL(*this, StateChangeAction2(PowerManagerProxyDelegate::kMem));
130 power_manager_.AddStateChangeCallback(kKey2, state_change_callback2_);
Gary Morain43bc6272012-01-30 14:01:15 -0800131
132 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
133 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kMem);
134}
135
Gary Morain52fabab2012-08-22 09:27:31 -0700136TEST_F(PowerManagerTest, AddMultipleSuspendDelayRunMultiple) {
137 EXPECT_CALL(*this, SuspendDelayAction1(kSequence1));
138 EXPECT_CALL(*this, SuspendDelayAction1(kSequence2));
139 power_manager_.AddSuspendDelayCallback(kKey1, suspend_delay_callback1_);
Gary Morain43bc6272012-01-30 14:01:15 -0800140
Gary Morain52fabab2012-08-22 09:27:31 -0700141 EXPECT_CALL(*this, SuspendDelayAction2(kSequence1));
142 EXPECT_CALL(*this, SuspendDelayAction2(kSequence2));
143 power_manager_.AddSuspendDelayCallback(kKey2, suspend_delay_callback2_);
144
Darin Petkov3ec55342012-09-28 14:04:44 +0200145 OnSuspendDelay(kSequence1);
146 OnSuspendDelay(kSequence2);
Gary Morain52fabab2012-08-22 09:27:31 -0700147}
148
149TEST_F(PowerManagerTest, RemoveStateChangeCallback) {
150 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kOn));
151 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kMem));
152 power_manager_.AddStateChangeCallback(kKey1, state_change_callback1_);
153
154 EXPECT_CALL(*this, StateChangeAction2(PowerManagerProxyDelegate::kOn));
155 EXPECT_CALL(*this, StateChangeAction2(PowerManagerProxyDelegate::kMem))
156 .Times(0);
157 power_manager_.AddStateChangeCallback(kKey2, state_change_callback2_);
Gary Morain43bc6272012-01-30 14:01:15 -0800158
159 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
160
161 power_manager_.RemoveStateChangeCallback(kKey2);
162 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kMem);
163
164 power_manager_.RemoveStateChangeCallback(kKey1);
165 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
166}
167
Gary Morain52fabab2012-08-22 09:27:31 -0700168TEST_F(PowerManagerTest, RemoveSuspendDelayCallback) {
169 EXPECT_CALL(*this, SuspendDelayAction1(kSequence1));
170 EXPECT_CALL(*this, SuspendDelayAction1(kSequence2));
171 power_manager_.AddSuspendDelayCallback(kKey1, suspend_delay_callback1_);
172
173 EXPECT_CALL(*this, SuspendDelayAction2(kSequence1));
174 EXPECT_CALL(*this, SuspendDelayAction2(kSequence2)).Times(0);
175 power_manager_.AddSuspendDelayCallback(kKey2, suspend_delay_callback2_);
176
Darin Petkov3ec55342012-09-28 14:04:44 +0200177 OnSuspendDelay(kSequence1);
Gary Morain52fabab2012-08-22 09:27:31 -0700178
179 power_manager_.RemoveSuspendDelayCallback(kKey2);
Darin Petkov3ec55342012-09-28 14:04:44 +0200180 OnSuspendDelay(kSequence2);
Gary Morain52fabab2012-08-22 09:27:31 -0700181
182 power_manager_.RemoveSuspendDelayCallback(kKey1);
Darin Petkov3ec55342012-09-28 14:04:44 +0200183 OnSuspendDelay(kSequence1);
Gary Morain43bc6272012-01-30 14:01:15 -0800184}
185
186typedef PowerManagerTest PowerManagerDeathTest;
187
Gary Morain52fabab2012-08-22 09:27:31 -0700188TEST_F(PowerManagerDeathTest, AddStateChangeCallbackDuplicateKey) {
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500189 power_manager_.AddStateChangeCallback(
Gary Morain52fabab2012-08-22 09:27:31 -0700190 kKey1, Bind(&PowerManagerTest::StateChangeAction1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800191
192#ifndef NDEBUG
193 // Adding another callback with the same key is an error and causes a crash in
194 // debug mode.
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500195 EXPECT_DEATH(power_manager_.AddStateChangeCallback(
Gary Morain52fabab2012-08-22 09:27:31 -0700196 kKey1, Bind(&PowerManagerTest::StateChangeAction2, Unretained(this))),
Gary Morain43bc6272012-01-30 14:01:15 -0800197 "Inserting duplicate key");
198#else // NDEBUG
Gary Morain52fabab2012-08-22 09:27:31 -0700199 EXPECT_CALL(*this, StateChangeAction2(PowerManagerProxyDelegate::kOn));
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500200 power_manager_.AddStateChangeCallback(
Gary Morain52fabab2012-08-22 09:27:31 -0700201 kKey1, Bind(&PowerManagerTest::StateChangeAction2, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800202 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
203#endif // NDEBUG
204}
205
Gary Morain52fabab2012-08-22 09:27:31 -0700206TEST_F(PowerManagerDeathTest, RemoveStateChangeCallbackUnknownKey) {
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500207 power_manager_.AddStateChangeCallback(
Gary Morain52fabab2012-08-22 09:27:31 -0700208 kKey1, Bind(&PowerManagerTest::StateChangeAction1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800209
210#ifndef NDEBUG
211 // Attempting to remove a callback key that was not added is an error and
212 // crashes in debug mode.
213 EXPECT_DEATH(power_manager_.RemoveStateChangeCallback(kKey2),
214 "Removing unknown key");
215#else // NDEBUG
Gary Morain52fabab2012-08-22 09:27:31 -0700216 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kOn));
Gary Morain43bc6272012-01-30 14:01:15 -0800217
218 // In non-debug mode, removing an unknown key does nothing.
219 power_manager_.RemoveStateChangeCallback(kKey2);
220 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
221#endif // NDEBUG
222}
223
Gary Morain52fabab2012-08-22 09:27:31 -0700224TEST_F(PowerManagerTest, RegisterSuspendDelay) {
225 const int kDelay = 100;
226 EXPECT_CALL(*factory_.proxy(), RegisterSuspendDelay(kDelay));
227 power_manager_.RegisterSuspendDelay(kDelay);
228}
229
Darin Petkov3ec55342012-09-28 14:04:44 +0200230TEST_F(PowerManagerTest, UnregisterSuspendDelay) {
231 EXPECT_CALL(*factory_.proxy(), UnregisterSuspendDelay());
232 power_manager_.UnregisterSuspendDelay();
233}
234
235TEST_F(PowerManagerTest, SuspendReady) {
236 const uint32 kSeqNumber = 12345;
237 EXPECT_CALL(*factory_.proxy(), SuspendReady(kSeqNumber));
238 power_manager_.SuspendReady(kSeqNumber);
239}
240
241TEST_F(PowerManagerTest, OnSuspendTimeout) {
242 EXPECT_EQ(PowerManagerProxyDelegate::kUnknown, power_manager_.power_state());
243 OnSuspendTimeout();
244 EXPECT_EQ(PowerManagerProxyDelegate::kOn, power_manager_.power_state());
245}
Gary Morain52fabab2012-08-22 09:27:31 -0700246
Gary Morain43bc6272012-01-30 14:01:15 -0800247} // namespace shill