blob: 2bc744dc8f5a233623c3884eba1f3b0c41742df1 [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
60TEST_F(PowerManagerTest, Add) {
61 const string kKey = "Zaphod";
Eric Shienbrood3e20a232012-02-16 11:35:56 -050062 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn));
63 power_manager_.AddStateChangeCallback(
64 kKey, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -080065 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
Eric Shienbrood3e20a232012-02-16 11:35:56 -050066 power_manager_.RemoveStateChangeCallback(kKey);
Gary Morain43bc6272012-01-30 14:01:15 -080067}
68
69TEST_F(PowerManagerTest, AddMultipleRunMultiple) {
70 const string kKey1 = "Zaphod";
Eric Shienbrood3e20a232012-02-16 11:35:56 -050071 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn));
72 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kMem));
73 power_manager_.AddStateChangeCallback(
74 kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -080075
76 const string kKey2 = "Beeblebrox";
Eric Shienbrood3e20a232012-02-16 11:35:56 -050077 EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kOn));
78 EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kMem));
79 power_manager_.AddStateChangeCallback(
80 kKey2, Bind(&PowerManagerTest::TestCallback2, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -080081
82 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
83 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kMem);
84}
85
86TEST_F(PowerManagerTest, Remove) {
87 const string kKey1 = "Zaphod";
Eric Shienbrood3e20a232012-02-16 11:35:56 -050088 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn));
89 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kMem));
90 power_manager_.AddStateChangeCallback(
91 kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -080092
93 const string kKey2 = "Beeblebrox";
Eric Shienbrood3e20a232012-02-16 11:35:56 -050094 EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kOn));
95 EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kMem)).Times(0);
96 power_manager_.AddStateChangeCallback(
97 kKey2, Bind(&PowerManagerTest::TestCallback2, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -080098
99 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
100
101 power_manager_.RemoveStateChangeCallback(kKey2);
102 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kMem);
103
104 power_manager_.RemoveStateChangeCallback(kKey1);
105 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
106}
107
108TEST_F(PowerManagerTest, OnSuspendDelayIgnored) {
109 const string kKey = "Zaphod";
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500110 EXPECT_CALL(*this, TestCallback1(_)).Times(0);
111 power_manager_.AddStateChangeCallback(
112 kKey, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800113 factory_.delegate()->OnSuspendDelay(99);
114}
115
116typedef PowerManagerTest PowerManagerDeathTest;
117
118TEST_F(PowerManagerDeathTest, AddDuplicateKey) {
119 const string kKey1 = "Zaphod";
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500120 power_manager_.AddStateChangeCallback(
121 kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800122
123#ifndef NDEBUG
124 // Adding another callback with the same key is an error and causes a crash in
125 // debug mode.
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500126 EXPECT_DEATH(power_manager_.AddStateChangeCallback(
127 kKey1, Bind(&PowerManagerTest::TestCallback2, Unretained(this))),
Gary Morain43bc6272012-01-30 14:01:15 -0800128 "Inserting duplicate key");
129#else // NDEBUG
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500130 EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kOn));
131 power_manager_.AddStateChangeCallback(
132 kKey1, Bind(&PowerManagerTest::TestCallback2, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800133 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
134#endif // NDEBUG
135}
136
137TEST_F(PowerManagerDeathTest, RemoveUnknownKey) {
138 const string kKey1 = "Zaphod";
139 const string kKey2 = "Beeblebrox";
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500140 power_manager_.AddStateChangeCallback(
141 kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this)));
Gary Morain43bc6272012-01-30 14:01:15 -0800142
143#ifndef NDEBUG
144 // Attempting to remove a callback key that was not added is an error and
145 // crashes in debug mode.
146 EXPECT_DEATH(power_manager_.RemoveStateChangeCallback(kKey2),
147 "Removing unknown key");
148#else // NDEBUG
Eric Shienbrood3e20a232012-02-16 11:35:56 -0500149 EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn));
Gary Morain43bc6272012-01-30 14:01:15 -0800150
151 // In non-debug mode, removing an unknown key does nothing.
152 power_manager_.RemoveStateChangeCallback(kKey2);
153 factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn);
154#endif // NDEBUG
155}
156
157} // namespace shill