1c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 2c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Copyright (C) 2012 The Android Open Source Project 3c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 4c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Licensed under the Apache License, Version 2.0 (the "License"); 5c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// you may not use this file except in compliance with the License. 6c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// You may obtain a copy of the License at 7c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 8c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// http://www.apache.org/licenses/LICENSE-2.0 9c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 10c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// Unless required by applicable law or agreed to in writing, software 11c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// distributed under the License is distributed on an "AS IS" BASIS, 12c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// See the License for the specific language governing permissions and 14c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// limitations under the License. 15c0beca55d290fe0b1c96d78cbbcf94b05c23f5a5Peter Qiu// 1643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 1743bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include "shill/power_manager.h" 1843bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 19cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan#include <memory> 2043bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include <string> 2143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 223e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood#include <base/bind.h> 23289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#if defined(__ANDROID__) 24289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#include <dbus/service_constants.h> 25289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#else 26d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu#include <chromeos/dbus/service_constants.h> 27289a5a5e18bb1a676b3dfce111af4c2c00c7776eSamuel Tan#endif // __ANDROID__ 2843bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include <gmock/gmock.h> 2943bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include <gtest/gtest.h> 3043bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 31608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu#include "shill/mock_control.h" 323ec553401f04d005cfce24411cd63929557dea75Darin Petkov#include "shill/mock_event_dispatcher.h" 33d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu#include "shill/mock_metrics.h" 3443bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include "shill/mock_power_manager_proxy.h" 3543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain#include "shill/power_manager_proxy_interface.h" 3643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 373e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbroodusing base::Bind; 383e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbroodusing base::Unretained; 3952fababdf2b577cd9a28455b21bc623fe407f79bGary Morainusing std::map; 4043bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainusing std::string; 4143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainusing testing::_; 42fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Eratusing testing::DoAll; 4364ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhuusing testing::IgnoreResult; 440f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhuusing testing::InvokeWithoutArgs; 45fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Eratusing testing::Mock; 460818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Eratusing testing::Return; 47fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Eratusing testing::SetArgumentPointee; 4843bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainusing testing::Test; 4943bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 5043bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainnamespace shill { 5143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 5243bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainnamespace { 5343bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 54608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiuclass FakeControl : public MockControl { 5543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain public: 56608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu FakeControl() 57cc225ef3b77b5e098cc12c661a947e1737480777Ben Chan : delegate_(nullptr), 58d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu power_manager_proxy_raw_(new MockPowerManagerProxy), 597723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu power_manager_proxy_(power_manager_proxy_raw_) {} 6043bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 613b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart virtual PowerManagerProxyInterface* CreatePowerManagerProxy( 627723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu PowerManagerProxyDelegate* delegate, 637723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu const base::Closure& service_appeared_callback, 647723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu const base::Closure& service_vanished_callback) { 65d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu CHECK(power_manager_proxy_); 6643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain delegate_ = delegate; 67d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu // Passes ownership. 68d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu return power_manager_proxy_.release(); 6943bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain } 70d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu 713b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart PowerManagerProxyDelegate* delegate() const { return delegate_; } 72d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu // Can not guarantee that the returned object is alive. 733b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart MockPowerManagerProxy* power_manager_proxy() const { 74d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu return power_manager_proxy_raw_; 75d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu } 7643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 7743bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain private: 783b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart PowerManagerProxyDelegate* delegate_; 793b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart MockPowerManagerProxy* const power_manager_proxy_raw_; 80cd47732488cd101eaf0d3558dde5a7d4e4fc260bBen Chan std::unique_ptr<MockPowerManagerProxy> power_manager_proxy_; 8143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain}; 8243bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 8343bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain} // namespace 8443bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 8543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morainclass PowerManagerTest : public Test { 8643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain public: 879fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu static const char kDescription[]; 8864ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu static const char kDarkDescription[]; 89d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu static const char kPowerManagerDefaultOwner[]; 900818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat static const int kSuspendId1 = 123; 910818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat static const int kSuspendId2 = 456; 929fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu static const int kDelayId = 4; 939fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu static const int kDelayId2 = 5; 9452fababdf2b577cd9a28455b21bc623fe407f79bGary Morain 9543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain PowerManagerTest() 96fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat : kTimeout(base::TimeDelta::FromSeconds(3)), 97608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu power_manager_(&dispatcher_, &control_), 98608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu power_manager_proxy_(control_.power_manager_proxy()), 99608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu delegate_(control_.delegate()) { 1009fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu suspend_imminent_callback_ = 1019fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu Bind(&PowerManagerTest::SuspendImminentAction, Unretained(this)); 1029fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu suspend_done_callback_ = 1039fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu Bind(&PowerManagerTest::SuspendDoneAction, Unretained(this)); 10464ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu dark_suspend_imminent_callback_ = 10564ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu Bind(&PowerManagerTest::DarkSuspendImminentAction, Unretained(this)); 10652fababdf2b577cd9a28455b21bc623fe407f79bGary Morain } 10743bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 1089fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu MOCK_METHOD0(SuspendImminentAction, void()); 1099fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu MOCK_METHOD0(SuspendDoneAction, void()); 11064ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu MOCK_METHOD0(DarkSuspendImminentAction, void()); 1113e20a2341d0aeb7681e4ee0f89eae6817ade2b3bEric Shienbrood 11243bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain protected: 113d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu virtual void SetUp() { 1147723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu power_manager_.Start(kTimeout, suspend_imminent_callback_, 11564ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu suspend_done_callback_, 11664ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu dark_suspend_imminent_callback_); 117d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu } 118d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu 1197723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu virtual void TearDown() { 1207723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu power_manager_.Stop(); 1217723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu } 122d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu 123f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan void AddProxyExpectationForRegisterSuspendDelay(int delay_id, 124f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan bool return_value) { 125d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu EXPECT_CALL(*power_manager_proxy_, 12664ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterSuspendDelay(kTimeout, kDescription, _)) 1271897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan .WillOnce(DoAll(SetArgumentPointee<2>(delay_id), Return(return_value))); 128fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat } 129fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat 130f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan void AddProxyExpectationForUnregisterSuspendDelay(int delay_id, 131f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan bool return_value) { 132d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu EXPECT_CALL(*power_manager_proxy_, UnregisterSuspendDelay(delay_id)) 133fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat .WillOnce(Return(return_value)); 134fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat } 135fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat 136f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan void AddProxyExpectationForReportSuspendReadiness(int delay_id, 137f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan int suspend_id, 138f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan bool return_value) { 139d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu EXPECT_CALL(*power_manager_proxy_, 140d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu ReportSuspendReadiness(delay_id, suspend_id)) 141fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat .WillOnce(Return(return_value)); 142fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat } 143fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat 144f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan void AddProxyExpectationForRecordDarkResumeWakeReason( 1453b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart const string& wake_reason, bool return_value) { 1461897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan EXPECT_CALL(*power_manager_proxy_, RecordDarkResumeWakeReason(wake_reason)) 1471897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan .WillOnce(Return(return_value)); 1481897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan } 1491897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan 150f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan void AddProxyExpectationForRegisterDarkSuspendDelay(int delay_id, 151f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan bool return_value) { 15264ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu EXPECT_CALL(*power_manager_proxy_, 15364ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterDarkSuspendDelay(kTimeout, kDarkDescription, _)) 1541897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan .WillOnce(DoAll(SetArgumentPointee<2>(delay_id), Return(return_value))); 15564ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu } 15664ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu 157f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan void AddProxyExpectationForReportDarkSuspendReadiness(int delay_id, 158f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan int suspend_id, 159f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan bool return_value) { 16064ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu EXPECT_CALL(*power_manager_proxy_, 16164ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu ReportDarkSuspendReadiness(delay_id, suspend_id)) 16264ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu .WillOnce(Return(return_value)); 16364ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu } 16464ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu 165f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan void AddProxyExpectationForUnregisterDarkSuspendDelay(int delay_id, 166f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan bool return_value) { 16764ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu EXPECT_CALL(*power_manager_proxy_, UnregisterDarkSuspendDelay(delay_id)) 16864ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu .WillOnce(Return(return_value)); 16964ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu } 17064ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu 17164ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu void RegisterSuspendDelays() { 172f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForRegisterSuspendDelay(kDelayId, true); 173f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForRegisterDarkSuspendDelay(kDelayId, true); 1749fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu OnPowerManagerAppeared(); 1759fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu Mock::VerifyAndClearExpectations(power_manager_proxy_); 1769fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu } 1779fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu 1780818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat void OnSuspendImminent(int suspend_id) { 179608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu control_.delegate()->OnSuspendImminent(suspend_id); 180fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat EXPECT_TRUE(power_manager_.suspending()); 181fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat } 182fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat 183fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat void OnSuspendDone(int suspend_id) { 184608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu control_.delegate()->OnSuspendDone(suspend_id); 185fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat EXPECT_FALSE(power_manager_.suspending()); 1863ec553401f04d005cfce24411cd63929557dea75Darin Petkov } 1873ec553401f04d005cfce24411cd63929557dea75Darin Petkov 18864ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu void OnDarkSuspendImminent(int suspend_id) { 189608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu control_.delegate()->OnDarkSuspendImminent(suspend_id); 19064ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu } 19164ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu 1929fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu void OnPowerManagerAppeared() { 1937723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu power_manager_.OnPowerManagerAppeared(); 194d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu } 195d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu 1969fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu void OnPowerManagerVanished() { 1977723677fb789a6cec68c9732d79e7e454f3597b0Peter Qiu power_manager_.OnPowerManagerVanished(); 198d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu } 199d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu 200fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat // This is non-static since it's a non-POD type. 201fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat const base::TimeDelta kTimeout; 202fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat 2033ec553401f04d005cfce24411cd63929557dea75Darin Petkov MockEventDispatcher dispatcher_; 204608ec29525f553d51f0a92e84176e3d4b45930a9Peter Qiu FakeControl control_; 20543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain PowerManager power_manager_; 2063b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart MockPowerManagerProxy* const power_manager_proxy_; 2073b30ca58d13cf66b75ba0729b222ddc42ae68b33Paul Stewart PowerManagerProxyDelegate* const delegate_; 2089fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu PowerManager::SuspendImminentCallback suspend_imminent_callback_; 2099fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu PowerManager::SuspendDoneCallback suspend_done_callback_; 21064ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu PowerManager::DarkSuspendImminentCallback dark_suspend_imminent_callback_; 21143bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain}; 21243bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 2139fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhuconst char PowerManagerTest::kDescription[] = "shill"; 21464ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhuconst char PowerManagerTest::kDarkDescription[] = "shill"; 215d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhuconst char PowerManagerTest::kPowerManagerDefaultOwner[] = 216d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu "PowerManagerDefaultOwner"; 217fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat 218fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel EratTEST_F(PowerManagerTest, SuspendingState) { 219fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat const int kSuspendId = 3; 220fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat EXPECT_FALSE(power_manager_.suspending()); 221fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat OnSuspendImminent(kSuspendId); 222fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat EXPECT_TRUE(power_manager_.suspending()); 223fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat OnSuspendDone(kSuspendId); 224fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat EXPECT_FALSE(power_manager_.suspending()); 22543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain} 22643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 2279fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh PrabhuTEST_F(PowerManagerTest, RegisterSuspendDelayFailure) { 228f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForRegisterSuspendDelay(kDelayId, false); 2299fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu OnPowerManagerAppeared(); 230d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu Mock::VerifyAndClearExpectations(power_manager_proxy_); 231fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat 2329fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // Outstanding shill callbacks should still be invoked. 2339fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // - suspend_done_callback: If powerd died in the middle of a suspend 2349fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // we want to wake shill up with suspend_done_action, so this callback 2359fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // should be invoked anyway. 2369fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // See PowerManagerTest::PowerManagerDiedInSuspend and 2379fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // PowerManagerTest::PowerManagerReappearedInSuspend. 2389fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_CALL(*this, SuspendDoneAction()); 2399fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // - suspend_imminent_callback: The only case this can happen is if this 2409fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // callback was put on the queue, and then powerd reappeared, but we failed 2419fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // to registered a suspend delay with it. 2429fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // It is safe to go through the suspend_imminent -> timeout -> suspend_done 2439fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // path in this black swan case. 2449fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_CALL(*this, SuspendImminentAction()); 2450818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat OnSuspendImminent(kSuspendId1); 246fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat OnSuspendDone(kSuspendId1); 247fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat Mock::VerifyAndClearExpectations(this); 2489fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu} 24943bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 25064ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh PrabhuTEST_F(PowerManagerTest, RegisterDarkSuspendDelayFailure) { 251f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForRegisterDarkSuspendDelay(kDelayId, false); 25264ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu OnPowerManagerAppeared(); 25364ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu Mock::VerifyAndClearExpectations(power_manager_proxy_); 25464ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu 25564ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu // Outstanding dark suspend imminent signal should be ignored, since we 25664ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu // probably won't have time to cleanly do dark resume actions. Might as well 25764ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu // ignore the signal. 25864ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu EXPECT_CALL(*this, DarkSuspendImminentAction()).Times(0); 25964ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu OnDarkSuspendImminent(kSuspendId1); 26064ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu} 26164ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu 2629fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh PrabhuTEST_F(PowerManagerTest, ReportSuspendReadinessFailure) { 26364ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterSuspendDelays(); 2649fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_CALL(*this, SuspendImminentAction()); 2659fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu OnSuspendImminent(kSuspendId1); 266f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForReportSuspendReadiness(kDelayId, kSuspendId1, false); 2679fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_FALSE(power_manager_.ReportSuspendReadiness()); 2689fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu} 26952fababdf2b577cd9a28455b21bc623fe407f79bGary Morain 2701897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel TanTEST_F(PowerManagerTest, RecordDarkResumeWakeReasonFailure) { 2711897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan const string kWakeReason = "WiFi.Disconnect"; 2721897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan RegisterSuspendDelays(); 2731897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan EXPECT_CALL(*this, DarkSuspendImminentAction()); 2741897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan OnDarkSuspendImminent(kSuspendId1); 275f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForRecordDarkResumeWakeReason(kWakeReason, false); 2761897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan EXPECT_FALSE(power_manager_.RecordDarkResumeWakeReason(kWakeReason)); 2771897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan} 2781897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan 2791897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel TanTEST_F(PowerManagerTest, RecordDarkResumeWakeReasonSuccess) { 2801897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan const string kWakeReason = "WiFi.Disconnect"; 2811897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan RegisterSuspendDelays(); 2821897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan EXPECT_CALL(*this, DarkSuspendImminentAction()); 2831897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan OnDarkSuspendImminent(kSuspendId1); 284f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForRecordDarkResumeWakeReason(kWakeReason, true); 2851897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan EXPECT_TRUE(power_manager_.RecordDarkResumeWakeReason(kWakeReason)); 2861897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan} 2871897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan 28864ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh PrabhuTEST_F(PowerManagerTest, ReportDarkSuspendReadinessFailure) { 28964ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterSuspendDelays(); 29064ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu EXPECT_CALL(*this, DarkSuspendImminentAction()); 29164ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu OnDarkSuspendImminent(kSuspendId1); 292f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForReportDarkSuspendReadiness(kDelayId, kSuspendId1, 293f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan false); 29464ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu EXPECT_FALSE(power_manager_.ReportDarkSuspendReadiness()); 29564ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu} 29664ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu 2970f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh PrabhuTEST_F(PowerManagerTest, ReportSuspendReadinessFailsOutsideSuspend) { 29864ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterSuspendDelays(); 2991897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan EXPECT_CALL(*power_manager_proxy_, ReportSuspendReadiness(_, _)).Times(0); 3009fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_FALSE(power_manager_.ReportSuspendReadiness()); 30152fababdf2b577cd9a28455b21bc623fe407f79bGary Morain} 30252fababdf2b577cd9a28455b21bc623fe407f79bGary Morain 3030f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh PrabhuTEST_F(PowerManagerTest, ReportSuspendReadinessSynchronous) { 3040f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu // Verifies that a synchronous ReportSuspendReadiness call by shill on a 3050f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu // SuspendImminent callback is routed back to powerd. 30664ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterSuspendDelays(); 3071897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan EXPECT_CALL(*power_manager_proxy_, ReportSuspendReadiness(_, _)) 3080f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu .WillOnce(Return(true)); 3090f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu EXPECT_CALL(*this, SuspendImminentAction()) 3101897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan .WillOnce(IgnoreResult(InvokeWithoutArgs( 3111897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan &power_manager_, &PowerManager::ReportSuspendReadiness))); 3120f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu OnSuspendImminent(kSuspendId1); 3130f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu} 3140f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu 31564ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh PrabhuTEST_F(PowerManagerTest, ReportDarkSuspendReadinessSynchronous) { 31664ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu // Verifies that a synchronous ReportDarkSuspendReadiness call by shill on a 31764ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu // DarkSuspendImminent callback is routed back to powerd. 31864ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterSuspendDelays(); 3191897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan EXPECT_CALL(*power_manager_proxy_, ReportDarkSuspendReadiness(_, _)) 32064ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu .WillOnce(Return(true)); 32164ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu EXPECT_CALL(*this, DarkSuspendImminentAction()) 3221897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan .WillOnce(IgnoreResult(InvokeWithoutArgs( 3231897afaeb89003f5cc75a256f6fd7528e6abd54fSamuel Tan &power_manager_, &PowerManager::ReportDarkSuspendReadiness))); 32464ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu OnDarkSuspendImminent(kSuspendId1); 32564ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu} 32664ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu 32764ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh PrabhuTEST_F(PowerManagerTest, Stop) { 32864ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterSuspendDelays(); 329f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForUnregisterSuspendDelay(kDelayId, true); 330f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForUnregisterDarkSuspendDelay(kDelayId, true); 33164ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu power_manager_.Stop(); 33264ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu} 33364ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu 3349fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh PrabhuTEST_F(PowerManagerTest, StopFailure) { 33564ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterSuspendDelays(); 3369fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu 337f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForUnregisterSuspendDelay(kDelayId, false); 3389fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu power_manager_.Stop(); 339d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu Mock::VerifyAndClearExpectations(power_manager_proxy_); 34052fababdf2b577cd9a28455b21bc623fe407f79bGary Morain 3419fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // As a result, callbacks should still be invoked. 3429fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_CALL(*this, SuspendImminentAction()); 3439fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_CALL(*this, SuspendDoneAction()); 3440818cca76b252080dc78f10e6c4c7c4580a226fcDaniel Erat OnSuspendImminent(kSuspendId1); 345fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat OnSuspendDone(kSuspendId1); 34643bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain} 34743bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain 3489fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh PrabhuTEST_F(PowerManagerTest, OnPowerManagerReappeared) { 34964ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterSuspendDelays(); 3509fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu 3519fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // Check that we re-register suspend delay on powerd restart. 352f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForRegisterSuspendDelay(kDelayId2, true); 353f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForRegisterDarkSuspendDelay(kDelayId2, true); 3549fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu OnPowerManagerVanished(); 3559fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu OnPowerManagerAppeared(); 356d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu Mock::VerifyAndClearExpectations(power_manager_proxy_); 357fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat 3589fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // Check that a |ReportSuspendReadiness| message is sent with the new delay 3599fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu // id. 3609fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_CALL(*this, SuspendImminentAction()); 361fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat OnSuspendImminent(kSuspendId1); 362f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForReportSuspendReadiness(kDelayId2, kSuspendId1, true); 3639fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_TRUE(power_manager_.ReportSuspendReadiness()); 364d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu Mock::VerifyAndClearExpectations(power_manager_proxy_); 36564ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu 36664ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu // Check that a |ReportDarkSuspendReadiness| message is sent with the new 36764ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu // delay id. 36864ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu EXPECT_CALL(*this, DarkSuspendImminentAction()); 36964ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu OnDarkSuspendImminent(kSuspendId1); 370f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForReportDarkSuspendReadiness(kDelayId2, kSuspendId1, 371f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan true); 37264ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu EXPECT_TRUE(power_manager_.ReportDarkSuspendReadiness()); 3733ec553401f04d005cfce24411cd63929557dea75Darin Petkov} 3743ec553401f04d005cfce24411cd63929557dea75Darin Petkov 3759fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh PrabhuTEST_F(PowerManagerTest, PowerManagerDiedInSuspend) { 37664ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterSuspendDelays(); 3779fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_CALL(*this, SuspendImminentAction()); 378fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat OnSuspendImminent(kSuspendId1); 379fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat Mock::VerifyAndClearExpectations(this); 380fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat 3819fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_CALL(*this, SuspendDoneAction()); 3820f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu OnPowerManagerVanished(); 383fac0953b10f3c13f47ecd588c0f9a0382bc32776Daniel Erat EXPECT_FALSE(power_manager_.suspending()); 3843ec553401f04d005cfce24411cd63929557dea75Darin Petkov} 38552fababdf2b577cd9a28455b21bc623fe407f79bGary Morain 3869fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh PrabhuTEST_F(PowerManagerTest, PowerManagerReappearedInSuspend) { 38764ad2383c4555a99f4f09fe8f5faa088f99f5b90Prathmesh Prabhu RegisterSuspendDelays(); 3889fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_CALL(*this, SuspendImminentAction()); 3899fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu OnSuspendImminent(kSuspendId1); 3909fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu Mock::VerifyAndClearExpectations(this); 391d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu 392f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForRegisterSuspendDelay(kDelayId2, true); 393f1e31ac6c8ea0827985144679d655640a8df4759Samuel Tan AddProxyExpectationForRegisterDarkSuspendDelay(kDelayId2, true); 3940f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu EXPECT_CALL(*this, SuspendDoneAction()); 3959fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu OnPowerManagerVanished(); 3969fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu OnPowerManagerAppeared(); 3979fdb84ba0ac2eb56961c90bba592481af493a10fPrathmesh Prabhu EXPECT_FALSE(power_manager_.suspending()); 3980f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu Mock::VerifyAndClearExpectations(this); 3990f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu 4000f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu // Let's check a normal suspend request after the fact. 4010f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu EXPECT_CALL(*this, SuspendImminentAction()); 4020f4e0a4bab95dc4b1c85d1c78850b5650284b422Prathmesh Prabhu OnSuspendImminent(kSuspendId2); 403d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu} 404d9c786cc050f879da87bffb05f85732e3f21eedePrathmesh Prabhu 40543bc62758e1f69fc2570920fdf7cee7171c431ceGary Morain} // namespace shill 406