blob: 015db51be3398a6ead5820023e2962065b9ed86d [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
Gary Morain43bc6272012-01-30 14:01:15 -080014#include "shill/mock_power_manager_proxy.h"
15#include "shill/power_manager_proxy_interface.h"
16#include "shill/proxy_factory.h"
17
Eric Shienbrood3e20a232012-02-16 11:35:56 -050018using base::Bind;
19using base::Unretained;
Gary Morain52fabab2012-08-22 09:27:31 -070020using std::map;
Gary Morain43bc6272012-01-30 14:01:15 -080021using std::string;
22using testing::_;
23using testing::Test;
24
25namespace shill {
26
Gary Morain43bc6272012-01-30 14:01:15 -080027namespace {
28
29class FakeProxyFactory : public ProxyFactory {
30 public:
Gary Morain52fabab2012-08-22 09:27:31 -070031 FakeProxyFactory()
32 : delegate_(NULL),
33 proxy_(new MockPowerManagerProxy) {}
Gary Morain43bc6272012-01-30 14:01:15 -080034
35 virtual PowerManagerProxyInterface *CreatePowerManagerProxy(
36 PowerManagerProxyDelegate *delegate) {
37 delegate_ = delegate;
Gary Morain52fabab2012-08-22 09:27:31 -070038 return proxy_;
Gary Morain43bc6272012-01-30 14:01:15 -080039 }
40 PowerManagerProxyDelegate *delegate() const { return delegate_; }
Gary Morain52fabab2012-08-22 09:27:31 -070041 MockPowerManagerProxy *proxy() const { return proxy_; }
Gary Morain43bc6272012-01-30 14:01:15 -080042
43 private:
44 PowerManagerProxyDelegate *delegate_;
Gary Morain52fabab2012-08-22 09:27:31 -070045 MockPowerManagerProxy *const proxy_;
Gary Morain43bc6272012-01-30 14:01:15 -080046};
47
48} // namespace
49
50class PowerManagerTest : public Test {
51 public:
Gary Morain52fabab2012-08-22 09:27:31 -070052 static const char kKey1[];
53 static const char kKey2[];
54 static const uint32 kSequence1 = 123;
55 static const uint32 kSequence2 = 456;
56
Gary Morain43bc6272012-01-30 14:01:15 -080057 PowerManagerTest()
58 : power_manager_(&factory_),
Gary Morain52fabab2012-08-22 09:27:31 -070059 delegate_(factory_.delegate()) {
60 state_change_callback1_ =
61 Bind(&PowerManagerTest::StateChangeAction1, Unretained(this));
62 state_change_callback2_ =
63 Bind(&PowerManagerTest::StateChangeAction2, Unretained(this));
64 suspend_delay_callback1_ =
65 Bind(&PowerManagerTest::SuspendDelayAction1, Unretained(this));
66 suspend_delay_callback2_ =
67 Bind(&PowerManagerTest::SuspendDelayAction2, Unretained(this));
68 }
Gary Morain43bc6272012-01-30 14:01:15 -080069
Gary Morain52fabab2012-08-22 09:27:31 -070070 MOCK_METHOD1(StateChangeAction1, void(PowerManager::SuspendState));
71 MOCK_METHOD1(StateChangeAction2, void(PowerManager::SuspendState));
72 MOCK_METHOD1(SuspendDelayAction1, void(uint32));
73 MOCK_METHOD1(SuspendDelayAction2, void(uint32));
Eric Shienbrood3e20a232012-02-16 11:35:56 -050074
Gary Morain43bc6272012-01-30 14:01:15 -080075 protected:
76 FakeProxyFactory factory_;
77 PowerManager power_manager_;
78 PowerManagerProxyDelegate *const delegate_;
Gary Morain52fabab2012-08-22 09:27:31 -070079 PowerManager::PowerStateCallback state_change_callback1_;
80 PowerManager::PowerStateCallback state_change_callback2_;
81 PowerManager::SuspendDelayCallback suspend_delay_callback1_;
82 PowerManager::SuspendDelayCallback suspend_delay_callback2_;
Gary Morain43bc6272012-01-30 14:01:15 -080083};
84
Gary Morain52fabab2012-08-22 09:27:31 -070085const char PowerManagerTest::kKey1[] = "Zaphod";
86const char PowerManagerTest::kKey2[] = "Beeblebrox";
87
Darin Petkovca621542012-07-25 14:25:56 +020088TEST_F(PowerManagerTest, OnPowerStateChanged) {
89 EXPECT_EQ(PowerManagerProxyDelegate::kUnknown, power_manager_.power_state());
90 power_manager_.OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
91 EXPECT_EQ(PowerManagerProxyDelegate::kOn, power_manager_.power_state());
92}
93
Gary Morain52fabab2012-08-22 09:27:31 -070094TEST_F(PowerManagerTest, AddStateChangeCallback) {
95 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kOn));
96 power_manager_.AddStateChangeCallback(kKey1, state_change_callback1_);
Gary Morain43bc6272012-01-30 14:01:15 -080097 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
Gary Morain52fabab2012-08-22 09:27:31 -070098 power_manager_.RemoveStateChangeCallback(kKey1);
Gary Morain43bc6272012-01-30 14:01:15 -080099}
100
Gary Morain52fabab2012-08-22 09:27:31 -0700101TEST_F(PowerManagerTest, AddSuspendDelayCallback) {
102 EXPECT_CALL(*this, SuspendDelayAction1(kSequence1));
103 power_manager_.AddSuspendDelayCallback(kKey1, suspend_delay_callback1_);
104 factory_.delegate()->OnSuspendDelay(kSequence1);
105 power_manager_.RemoveSuspendDelayCallback(kKey1);
106}
Gary Morain43bc6272012-01-30 14:01:15 -0800107
Gary Morain52fabab2012-08-22 09:27:31 -0700108TEST_F(PowerManagerTest, AddMultipleStateChangeRunMultiple) {
109 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kOn));
110 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kMem));
111 power_manager_.AddStateChangeCallback(kKey1, state_change_callback1_);
112
113 EXPECT_CALL(*this, StateChangeAction2(PowerManagerProxyDelegate::kOn));
114 EXPECT_CALL(*this, StateChangeAction2(PowerManagerProxyDelegate::kMem));
115 power_manager_.AddStateChangeCallback(kKey2, state_change_callback2_);
Gary Morain43bc6272012-01-30 14:01:15 -0800116
117 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
118 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kMem);
119}
120
Gary Morain52fabab2012-08-22 09:27:31 -0700121TEST_F(PowerManagerTest, AddMultipleSuspendDelayRunMultiple) {
122 EXPECT_CALL(*this, SuspendDelayAction1(kSequence1));
123 EXPECT_CALL(*this, SuspendDelayAction1(kSequence2));
124 power_manager_.AddSuspendDelayCallback(kKey1, suspend_delay_callback1_);
Gary Morain43bc6272012-01-30 14:01:15 -0800125
Gary Morain52fabab2012-08-22 09:27:31 -0700126 EXPECT_CALL(*this, SuspendDelayAction2(kSequence1));
127 EXPECT_CALL(*this, SuspendDelayAction2(kSequence2));
128 power_manager_.AddSuspendDelayCallback(kKey2, suspend_delay_callback2_);
129
130 factory_.delegate()->OnSuspendDelay(kSequence1);
131 factory_.delegate()->OnSuspendDelay(kSequence2);
132}
133
134TEST_F(PowerManagerTest, RemoveStateChangeCallback) {
135 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kOn));
136 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kMem));
137 power_manager_.AddStateChangeCallback(kKey1, state_change_callback1_);
138
139 EXPECT_CALL(*this, StateChangeAction2(PowerManagerProxyDelegate::kOn));
140 EXPECT_CALL(*this, StateChangeAction2(PowerManagerProxyDelegate::kMem))
141 .Times(0);
142 power_manager_.AddStateChangeCallback(kKey2, state_change_callback2_);
Gary Morain43bc6272012-01-30 14:01:15 -0800143
144 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
145
146 power_manager_.RemoveStateChangeCallback(kKey2);
147 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kMem);
148
149 power_manager_.RemoveStateChangeCallback(kKey1);
150 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
151}
152
Gary Morain52fabab2012-08-22 09:27:31 -0700153TEST_F(PowerManagerTest, RemoveSuspendDelayCallback) {
154 EXPECT_CALL(*this, SuspendDelayAction1(kSequence1));
155 EXPECT_CALL(*this, SuspendDelayAction1(kSequence2));
156 power_manager_.AddSuspendDelayCallback(kKey1, suspend_delay_callback1_);
157
158 EXPECT_CALL(*this, SuspendDelayAction2(kSequence1));
159 EXPECT_CALL(*this, SuspendDelayAction2(kSequence2)).Times(0);
160 power_manager_.AddSuspendDelayCallback(kKey2, suspend_delay_callback2_);
161
162 factory_.delegate()->OnSuspendDelay(kSequence1);
163
164 power_manager_.RemoveSuspendDelayCallback(kKey2);
165 factory_.delegate()->OnSuspendDelay(kSequence2);
166
167 power_manager_.RemoveSuspendDelayCallback(kKey1);
168 factory_.delegate()->OnSuspendDelay(kSequence1);
Gary Morain43bc6272012-01-30 14:01:15 -0800169}
170
171typedef PowerManagerTest PowerManagerDeathTest;
172
Gary Morain52fabab2012-08-22 09:27:31 -0700173TEST_F(PowerManagerDeathTest, AddStateChangeCallbackDuplicateKey) {
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500174 power_manager_.AddStateChangeCallback(
Gary Morain52fabab2012-08-22 09:27:31 -0700175 kKey1, Bind(&PowerManagerTest::StateChangeAction1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800176
177#ifndef NDEBUG
178 // Adding another callback with the same key is an error and causes a crash in
179 // debug mode.
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500180 EXPECT_DEATH(power_manager_.AddStateChangeCallback(
Gary Morain52fabab2012-08-22 09:27:31 -0700181 kKey1, Bind(&PowerManagerTest::StateChangeAction2, Unretained(this))),
Gary Morain43bc6272012-01-30 14:01:15 -0800182 "Inserting duplicate key");
183#else // NDEBUG
Gary Morain52fabab2012-08-22 09:27:31 -0700184 EXPECT_CALL(*this, StateChangeAction2(PowerManagerProxyDelegate::kOn));
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500185 power_manager_.AddStateChangeCallback(
Gary Morain52fabab2012-08-22 09:27:31 -0700186 kKey1, Bind(&PowerManagerTest::StateChangeAction2, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800187 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
188#endif // NDEBUG
189}
190
Gary Morain52fabab2012-08-22 09:27:31 -0700191TEST_F(PowerManagerDeathTest, RemoveStateChangeCallbackUnknownKey) {
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500192 power_manager_.AddStateChangeCallback(
Gary Morain52fabab2012-08-22 09:27:31 -0700193 kKey1, Bind(&PowerManagerTest::StateChangeAction1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800194
195#ifndef NDEBUG
196 // Attempting to remove a callback key that was not added is an error and
197 // crashes in debug mode.
198 EXPECT_DEATH(power_manager_.RemoveStateChangeCallback(kKey2),
199 "Removing unknown key");
200#else // NDEBUG
Gary Morain52fabab2012-08-22 09:27:31 -0700201 EXPECT_CALL(*this, StateChangeAction1(PowerManagerProxyDelegate::kOn));
Gary Morain43bc6272012-01-30 14:01:15 -0800202
203 // In non-debug mode, removing an unknown key does nothing.
204 power_manager_.RemoveStateChangeCallback(kKey2);
205 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
206#endif // NDEBUG
207}
208
Gary Morain52fabab2012-08-22 09:27:31 -0700209TEST_F(PowerManagerTest, RegisterSuspendDelay) {
210 const int kDelay = 100;
211 EXPECT_CALL(*factory_.proxy(), RegisterSuspendDelay(kDelay));
212 power_manager_.RegisterSuspendDelay(kDelay);
213}
214
215
Gary Morain43bc6272012-01-30 14:01:15 -0800216} // namespace shill