blob: a11500a51d21112d1d5c569a15e810b56d7bdcfc [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 Morain43bc6272012-01-30 14:01:15 -080020using std::string;
21using testing::_;
22using testing::Test;
23
24namespace shill {
25
Gary Morain43bc6272012-01-30 14:01:15 -080026namespace {
27
28class FakeProxyFactory : public ProxyFactory {
29 public:
30 FakeProxyFactory() : delegate_(NULL) {}
31
32 virtual PowerManagerProxyInterface *CreatePowerManagerProxy(
33 PowerManagerProxyDelegate *delegate) {
34 delegate_ = delegate;
35 return new MockPowerManagerProxy;
36 }
37 PowerManagerProxyDelegate *delegate() const { return delegate_; }
38
39 private:
40 PowerManagerProxyDelegate *delegate_;
41};
42
43} // namespace
44
45class PowerManagerTest : public Test {
46 public:
47 PowerManagerTest()
48 : power_manager_(&factory_),
49 delegate_(factory_.delegate()) { }
50
Eric Shienbrood3e20a232012-02-16 11:35:56 -050051 MOCK_METHOD1(TestCallback1, void(PowerManager::SuspendState));
52 MOCK_METHOD1(TestCallback2, void(PowerManager::SuspendState));
53
Gary Morain43bc6272012-01-30 14:01:15 -080054 protected:
55 FakeProxyFactory factory_;
56 PowerManager power_manager_;
57 PowerManagerProxyDelegate *const delegate_;
58};
59
Darin Petkovca621542012-07-25 14:25:56 +020060TEST_F(PowerManagerTest, OnPowerStateChanged) {
61 EXPECT_EQ(PowerManagerProxyDelegate::kUnknown, power_manager_.power_state());
62 power_manager_.OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
63 EXPECT_EQ(PowerManagerProxyDelegate::kOn, power_manager_.power_state());
64}
65
Gary Morain43bc6272012-01-30 14:01:15 -080066TEST_F(PowerManagerTest, Add) {
67 const string kKey = "Zaphod";
Eric Shienbrood3e20a232012-02-16 11:35:56 -050068 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn));
69 power_manager_.AddStateChangeCallback(
70 kKey, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -080071 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
Eric Shienbrood3e20a232012-02-16 11:35:56 -050072 power_manager_.RemoveStateChangeCallback(kKey);
Gary Morain43bc6272012-01-30 14:01:15 -080073}
74
75TEST_F(PowerManagerTest, AddMultipleRunMultiple) {
76 const string kKey1 = "Zaphod";
Eric Shienbrood3e20a232012-02-16 11:35:56 -050077 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn));
78 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kMem));
79 power_manager_.AddStateChangeCallback(
80 kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -080081
82 const string kKey2 = "Beeblebrox";
Eric Shienbrood3e20a232012-02-16 11:35:56 -050083 EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kOn));
84 EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kMem));
85 power_manager_.AddStateChangeCallback(
86 kKey2, Bind(&PowerManagerTest::TestCallback2, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -080087
88 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
89 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kMem);
90}
91
92TEST_F(PowerManagerTest, Remove) {
93 const string kKey1 = "Zaphod";
Eric Shienbrood3e20a232012-02-16 11:35:56 -050094 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn));
95 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kMem));
96 power_manager_.AddStateChangeCallback(
97 kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -080098
99 const string kKey2 = "Beeblebrox";
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500100 EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kOn));
101 EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kMem)).Times(0);
102 power_manager_.AddStateChangeCallback(
103 kKey2, Bind(&PowerManagerTest::TestCallback2, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800104
105 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
106
107 power_manager_.RemoveStateChangeCallback(kKey2);
108 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kMem);
109
110 power_manager_.RemoveStateChangeCallback(kKey1);
111 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
112}
113
114TEST_F(PowerManagerTest, OnSuspendDelayIgnored) {
115 const string kKey = "Zaphod";
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500116 EXPECT_CALL(*this, TestCallback1(_)).Times(0);
117 power_manager_.AddStateChangeCallback(
118 kKey, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800119 factory_.delegate()->OnSuspendDelay(99);
120}
121
122typedef PowerManagerTest PowerManagerDeathTest;
123
124TEST_F(PowerManagerDeathTest, AddDuplicateKey) {
125 const string kKey1 = "Zaphod";
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500126 power_manager_.AddStateChangeCallback(
127 kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800128
129#ifndef NDEBUG
130 // Adding another callback with the same key is an error and causes a crash in
131 // debug mode.
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500132 EXPECT_DEATH(power_manager_.AddStateChangeCallback(
133 kKey1, Bind(&PowerManagerTest::TestCallback2, Unretained(this))),
Gary Morain43bc6272012-01-30 14:01:15 -0800134 "Inserting duplicate key");
135#else // NDEBUG
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500136 EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kOn));
137 power_manager_.AddStateChangeCallback(
138 kKey1, Bind(&PowerManagerTest::TestCallback2, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800139 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
140#endif // NDEBUG
141}
142
143TEST_F(PowerManagerDeathTest, RemoveUnknownKey) {
144 const string kKey1 = "Zaphod";
145 const string kKey2 = "Beeblebrox";
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500146 power_manager_.AddStateChangeCallback(
147 kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800148
149#ifndef NDEBUG
150 // Attempting to remove a callback key that was not added is an error and
151 // crashes in debug mode.
152 EXPECT_DEATH(power_manager_.RemoveStateChangeCallback(kKey2),
153 "Removing unknown key");
154#else // NDEBUG
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500155 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn));
Gary Morain43bc6272012-01-30 14:01:15 -0800156
157 // In non-debug mode, removing an unknown key does nothing.
158 power_manager_.RemoveStateChangeCallback(kKey2);
159 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
160#endif // NDEBUG
161}
162
163} // namespace shill