power_manager_unittest.cc revision fac0953b10f3c13f47ecd588c0f9a0382bc32776
143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
243bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain// Use of this source code is governed by a BSD-style license that can be
343bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain// found in the LICENSE file.
443bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include "shill/power_manager.h"
643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
743bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include <string>
843bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
93e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood#include <base/bind.h>
103e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood#include <base/memory/scoped_ptr.h>
1143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include <gmock/gmock.h>
1243bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include <gtest/gtest.h>
1343bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
143ec553401f04d005cfce24411cd63929557dea75Darin Petkov#include "shill/mock_event_dispatcher.h"
1543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include "shill/mock_power_manager_proxy.h"
1643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include "shill/power_manager_proxy_interface.h"
1743bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include "shill/proxy_factory.h"
1843bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
193e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbroodusing base::Bind;
203e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbroodusing base::Unretained;
2152fababdf2b577cd9a28455b21bc623fe407f79bGary Morainusing std::map;
2243bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainusing std::string;
2343bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainusing testing::_;
24fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Eratusing testing::DoAll;
25fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Eratusing testing::Mock;
260818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Eratusing testing::Return;
27fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Eratusing testing::SetArgumentPointee;
2843bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainusing testing::Test;
2943bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
3043bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainnamespace shill {
3143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
3243bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainnamespace {
3343bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
3443bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainclass FakeProxyFactory : public ProxyFactory {
3543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain public:
3652fababdf2b577cd9a28455b21bc623fe407f79bGary Morain  FakeProxyFactory()
3752fababdf2b577cd9a28455b21bc623fe407f79bGary Morain      : delegate_(NULL),
3852fababdf2b577cd9a28455b21bc623fe407f79bGary Morain        proxy_(new MockPowerManagerProxy) {}
3943bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
4043bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain  virtual PowerManagerProxyInterface *CreatePowerManagerProxy(
4143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain      PowerManagerProxyDelegate *delegate) {
4243bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain    delegate_ = delegate;
4352fababdf2b577cd9a28455b21bc623fe407f79bGary Morain    return proxy_;
4443bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain  }
4543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain  PowerManagerProxyDelegate *delegate() const { return delegate_; }
4652fababdf2b577cd9a28455b21bc623fe407f79bGary Morain  MockPowerManagerProxy *proxy() const { return proxy_; }
4743bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
4843bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain private:
4943bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain  PowerManagerProxyDelegate *delegate_;
5052fababdf2b577cd9a28455b21bc623fe407f79bGary Morain  MockPowerManagerProxy *const proxy_;
5143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain};
5243bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
5343bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain}  // namespace
5443bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
5543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainclass PowerManagerTest : public Test {
5643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain public:
5752fababdf2b577cd9a28455b21bc623fe407f79bGary Morain  static const char kKey1[];
5852fababdf2b577cd9a28455b21bc623fe407f79bGary Morain  static const char kKey2[];
59fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  static const char kDescription1[];
60fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  static const char kDescription2[];
610818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat  static const int kSuspendId1 = 123;
620818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat  static const int kSuspendId2 = 456;
63fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  static const int kDelayId1 = 4;
64fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  static const int kDelayId2 = 16;
6552fababdf2b577cd9a28455b21bc623fe407f79bGary Morain
6643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain  PowerManagerTest()
67fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      : kTimeout(base::TimeDelta::FromSeconds(3)),
68fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat        power_manager_(&dispatcher_, &factory_),
69fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat        proxy_(factory_.proxy()),
7052fababdf2b577cd9a28455b21bc623fe407f79bGary Morain        delegate_(factory_.delegate()) {
71fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat    suspend_imminent_callback1_ =
72fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat        Bind(&PowerManagerTest::SuspendImminentAction1, Unretained(this));
73fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat    suspend_imminent_callback2_ =
74fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat        Bind(&PowerManagerTest::SuspendImminentAction2, Unretained(this));
75fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat    suspend_done_callback1_ =
76fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat        Bind(&PowerManagerTest::SuspendDoneAction1, Unretained(this));
77fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat    suspend_done_callback2_ =
78fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat        Bind(&PowerManagerTest::SuspendDoneAction2, Unretained(this));
7952fababdf2b577cd9a28455b21bc623fe407f79bGary Morain  }
8043bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
81fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  MOCK_METHOD1(SuspendImminentAction1, void(int));
82fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  MOCK_METHOD1(SuspendImminentAction2, void(int));
83fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  MOCK_METHOD1(SuspendDoneAction1, void(int));
84fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  MOCK_METHOD1(SuspendDoneAction2, void(int));
853e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood
8643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain protected:
87fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  void AddProxyRegisterSuspendDelayExpectation(
88fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      base::TimeDelta timeout,
89fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      const std::string &description,
90fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      int delay_id,
91fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      bool return_value) {
92fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat    EXPECT_CALL(*proxy_, RegisterSuspendDelay(timeout, description, _))
93fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat        .WillOnce(DoAll(SetArgumentPointee<2>(delay_id),
94fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                        Return(return_value)));
95fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  }
96fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
97fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  void AddProxyUnregisterSuspendDelayExpectation(int delay_id,
98fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                                                 bool return_value) {
99fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat    EXPECT_CALL(*proxy_, UnregisterSuspendDelay(delay_id))
100fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat        .WillOnce(Return(return_value));
101fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  }
102fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
103fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  void AddProxyReportSuspendReadinessExpectation(int delay_id,
104fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                                                 int suspend_id,
105fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                                                 bool return_value) {
106fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat    EXPECT_CALL(*proxy_, ReportSuspendReadiness(delay_id, suspend_id))
107fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat        .WillOnce(Return(return_value));
108fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  }
109fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
1100818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat  void OnSuspendImminent(int suspend_id) {
1113ec553401f04d005cfce24411cd63929557dea75Darin Petkov    EXPECT_CALL(dispatcher_,
1123ec553401f04d005cfce24411cd63929557dea75Darin Petkov                PostDelayedTask(_, PowerManager::kSuspendTimeoutMilliseconds));
1130818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat    factory_.delegate()->OnSuspendImminent(suspend_id);
114fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat    EXPECT_TRUE(power_manager_.suspending());
115fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  }
116fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
117fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  void OnSuspendDone(int suspend_id) {
118fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat    factory_.delegate()->OnSuspendDone(suspend_id);
119fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat    EXPECT_FALSE(power_manager_.suspending());
1203ec553401f04d005cfce24411cd63929557dea75Darin Petkov  }
1213ec553401f04d005cfce24411cd63929557dea75Darin Petkov
122fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  void OnSuspendTimeout(int suspend_id) {
123fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat    power_manager_.OnSuspendTimeout(suspend_id);
1243ec553401f04d005cfce24411cd63929557dea75Darin Petkov  }
1253ec553401f04d005cfce24411cd63929557dea75Darin Petkov
126fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  // This is non-static since it's a non-POD type.
127fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  const base::TimeDelta kTimeout;
128fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
1293ec553401f04d005cfce24411cd63929557dea75Darin Petkov  MockEventDispatcher dispatcher_;
13043bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain  FakeProxyFactory factory_;
13143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain  PowerManager power_manager_;
132fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  MockPowerManagerProxy *const proxy_;
13343bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain  PowerManagerProxyDelegate *const delegate_;
134fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  PowerManager::SuspendImminentCallback suspend_imminent_callback1_;
135fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  PowerManager::SuspendImminentCallback suspend_imminent_callback2_;
136fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  PowerManager::SuspendDoneCallback suspend_done_callback1_;
137fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  PowerManager::SuspendDoneCallback suspend_done_callback2_;
13843bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain};
13943bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
14052fababdf2b577cd9a28455b21bc623fe407f79bGary Morainconst char PowerManagerTest::kKey1[] = "Zaphod";
14152fababdf2b577cd9a28455b21bc623fe407f79bGary Morainconst char PowerManagerTest::kKey2[] = "Beeblebrox";
142fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Eratconst char PowerManagerTest::kDescription1[] = "Foo";
143fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Eratconst char PowerManagerTest::kDescription2[] = "Bar";
144fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
145fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel EratTEST_F(PowerManagerTest, SuspendingState) {
146fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  const int kSuspendId = 3;
147fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_FALSE(power_manager_.suspending());
148fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  OnSuspendImminent(kSuspendId);
149fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.suspending());
150fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  OnSuspendDone(kSuspendId);
151fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_FALSE(power_manager_.suspending());
15243bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain}
15343bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
154fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel EratTEST_F(PowerManagerTest, MultipleSuspendDelays) {
155fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyRegisterSuspendDelayExpectation(
156fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      kTimeout, kDescription1, kDelayId1, true);
157fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.AddSuspendDelay(
158fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  kKey1, kDescription1, kTimeout,
159fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  suspend_imminent_callback1_, suspend_done_callback1_));
160fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
161fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
162fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyRegisterSuspendDelayExpectation(
163fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      kTimeout, kDescription2, kDelayId2, true);
164fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.AddSuspendDelay(
165fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  kKey2, kDescription2, kTimeout,
166fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  suspend_imminent_callback2_, suspend_done_callback2_));
167fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
168fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
169fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_CALL(*this, SuspendImminentAction1(kSuspendId1));
170fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_CALL(*this, SuspendImminentAction2(kSuspendId1));
1710818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat  OnSuspendImminent(kSuspendId1);
172fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(this);
17343bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
174fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyReportSuspendReadinessExpectation(kDelayId1, kSuspendId1, true);
175fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.ReportSuspendReadiness(kKey1, kSuspendId1));
176fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
17752fababdf2b577cd9a28455b21bc623fe407f79bGary Morain
178fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyReportSuspendReadinessExpectation(kDelayId2, kSuspendId2, true);
179fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.ReportSuspendReadiness(kKey2, kSuspendId2));
180fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
18143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
182fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_CALL(*this, SuspendDoneAction1(kSuspendId1));
183fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_CALL(*this, SuspendDoneAction2(kSuspendId1));
184fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  OnSuspendDone(kSuspendId1);
185fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(this);
18643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
187fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyUnregisterSuspendDelayExpectation(kDelayId1, true);
188fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.RemoveSuspendDelay(kKey1));
189fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
19043bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
191fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyUnregisterSuspendDelayExpectation(kDelayId2, true);
192fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.RemoveSuspendDelay(kKey2));
193fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
19452fababdf2b577cd9a28455b21bc623fe407f79bGary Morain
195fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  // Start a second suspend attempt with no registered delays.
1960818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat  OnSuspendImminent(kSuspendId2);
197fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  OnSuspendDone(kSuspendId1);
198fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(this);
19952fababdf2b577cd9a28455b21bc623fe407f79bGary Morain}
20052fababdf2b577cd9a28455b21bc623fe407f79bGary Morain
201fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel EratTEST_F(PowerManagerTest, RegisterSuspendDelayFailure) {
202fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyRegisterSuspendDelayExpectation(
203fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      kTimeout, kDescription1, kDelayId1, false);
204fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_FALSE(power_manager_.AddSuspendDelay(
205fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                   kKey1, kDescription1, kTimeout,
206fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                   suspend_imminent_callback1_, suspend_done_callback1_));
207fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
20852fababdf2b577cd9a28455b21bc623fe407f79bGary Morain
209fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  // No callbacks should be invoked.
2100818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat  OnSuspendImminent(kSuspendId1);
211fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  OnSuspendDone(kSuspendId1);
212fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(this);
21343bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain}
21443bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
215fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel EratTEST_F(PowerManagerTest, ReportSuspendReadinessFailure) {
216fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyRegisterSuspendDelayExpectation(
217fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      kTimeout, kDescription1, kDelayId1, true);
218fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.AddSuspendDelay(
219fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  kKey1, kDescription1, kTimeout,
220fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  suspend_imminent_callback1_, suspend_done_callback1_));
221fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
222fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
223fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyReportSuspendReadinessExpectation(kDelayId1, kSuspendId1, false);
224fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_FALSE(power_manager_.ReportSuspendReadiness(kKey1, kSuspendId1));
225fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
22643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain}
22743bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
228fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel EratTEST_F(PowerManagerTest, UnregisterSuspendDelayFailure) {
229fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyRegisterSuspendDelayExpectation(
230fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      kTimeout, kDescription1, kDelayId1, true);
231fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.AddSuspendDelay(
232fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  kKey1, kDescription1, kTimeout,
233fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  suspend_imminent_callback1_, suspend_done_callback1_));
234fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
235fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
236fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  // Make the proxy report failure for unregistering.
237fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyUnregisterSuspendDelayExpectation(kDelayId1, false);
238fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_FALSE(power_manager_.RemoveSuspendDelay(kKey1));
239fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
240fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
241fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  // As a result, the callback should still be invoked.
242fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_CALL(*this, SuspendImminentAction1(kSuspendId1));
243fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  OnSuspendImminent(kSuspendId1);
244fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(this);
24543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain
246fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  // Let the unregister request complete successfully now.
247fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyUnregisterSuspendDelayExpectation(kDelayId1, true);
248fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.RemoveSuspendDelay(kKey1));
249fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
25052fababdf2b577cd9a28455b21bc623fe407f79bGary Morain}
25152fababdf2b577cd9a28455b21bc623fe407f79bGary Morain
252fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel EratTEST_F(PowerManagerTest, DuplicateKey) {
253fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyRegisterSuspendDelayExpectation(
254fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      kTimeout, kDescription1, kDelayId1, true);
255fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.AddSuspendDelay(
256fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  kKey1, kDescription1, kTimeout,
257fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  suspend_imminent_callback1_, suspend_done_callback1_));
258fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
259fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
260fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  // The new request should be ignored.
261fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_FALSE(power_manager_.AddSuspendDelay(
262fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                   kKey1, kDescription2, kTimeout,
263fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                   suspend_imminent_callback2_, suspend_done_callback2_));
264fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
265fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  // The first delay's callback should be invoked.
266fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_CALL(*this, SuspendImminentAction1(kSuspendId1));
267fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  OnSuspendImminent(kSuspendId1);
268fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(this);
2693ec553401f04d005cfce24411cd63929557dea75Darin Petkov}
2703ec553401f04d005cfce24411cd63929557dea75Darin Petkov
271fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel EratTEST_F(PowerManagerTest, UnknownKey) {
272fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_FALSE(power_manager_.RemoveSuspendDelay(kKey1));
273fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
2743ec553401f04d005cfce24411cd63929557dea75Darin Petkov}
2753ec553401f04d005cfce24411cd63929557dea75Darin Petkov
2763ec553401f04d005cfce24411cd63929557dea75Darin PetkovTEST_F(PowerManagerTest, OnSuspendTimeout) {
277fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  AddProxyRegisterSuspendDelayExpectation(
278fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat      kTimeout, kDescription1, kDelayId1, true);
279fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_TRUE(power_manager_.AddSuspendDelay(
280fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  kKey1, kDescription1, kTimeout,
281fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat                  suspend_imminent_callback1_, suspend_done_callback1_));
282fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(proxy_);
283fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
284fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_CALL(*this, SuspendImminentAction1(kSuspendId1));
285fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  OnSuspendImminent(kSuspendId1);
286fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(this);
287fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat
288fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  // After the timeout, the "done" callback should be run.
289fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_CALL(*this, SuspendDoneAction1(kSuspendId1));
290fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  OnSuspendTimeout(kSuspendId1);
291fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  EXPECT_FALSE(power_manager_.suspending());
292fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat  Mock::VerifyAndClearExpectations(this);
2933ec553401f04d005cfce24411cd63929557dea75Darin Petkov}
29452fababdf2b577cd9a28455b21bc623fe407f79bGary Morain
29543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain}  // namespace shill
296