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