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