• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <base/files/file_util.h>
18 #include <base/files/scoped_temp_dir.h>
19 #include <base/macros.h>
20 #include <base/sys_info.h>
21 #include <binder/IBinder.h>
22 #include <binder/IInterface.h>
23 #include <binderwrapper/binder_test_base.h>
24 #include <binderwrapper/stub_binder_wrapper.h>
25 #include <cutils/android_reboot.h>
26 #include <nativepower/constants.h>
27 #include <powermanager/PowerManager.h>
28 
29 #include "power_manager.h"
30 #include "system_property_setter_stub.h"
31 #include "wake_lock_manager_stub.h"
32 
33 namespace android {
34 
35 class PowerManagerTest : public BinderTestBase {
36  public:
PowerManagerTest()37   PowerManagerTest()
38       : power_manager_(new PowerManager()),
39         interface_(interface_cast<IPowerManager>(power_manager_)),
40         property_setter_(new SystemPropertySetterStub()),
41         wake_lock_manager_(new WakeLockManagerStub()) {
42     CHECK(temp_dir_.CreateUniqueTempDir());
43 
44     power_state_path_ = temp_dir_.path().Append("power_state");
45     power_manager_->set_power_state_path_for_testing(power_state_path_);
46     ClearPowerState();
47 
48     power_manager_->set_property_setter_for_testing(
49         std::unique_ptr<SystemPropertySetterInterface>(property_setter_));
50     power_manager_->set_wake_lock_manager_for_testing(
51         std::unique_ptr<WakeLockManagerInterface>(wake_lock_manager_));
52 
53     CHECK(power_manager_->Init());
54   }
55   ~PowerManagerTest() override = default;
56 
57  protected:
58   // Returns the value in |power_state_path_|.
ReadPowerState()59   std::string ReadPowerState() {
60     std::string state;
61     PCHECK(base::ReadFileToString(power_state_path_, &state))
62         << "Failed to read " << power_state_path_.value();
63     return state;
64   }
65 
66   // Clears |power_state_path_|.
ClearPowerState()67   void ClearPowerState() {
68     PCHECK(base::WriteFile(power_state_path_, "", 0) == 0)
69         << "Failed to write " << power_state_path_.value();
70   }
71 
72   base::ScopedTempDir temp_dir_;
73   sp<PowerManager> power_manager_;
74   sp<IPowerManager> interface_;
75   SystemPropertySetterStub* property_setter_;  // Owned by |power_manager_|.
76   WakeLockManagerStub* wake_lock_manager_;  // Owned by |power_manager_|.
77 
78   // File under |temp_dir_| used in place of /sys/power/state.
79   base::FilePath power_state_path_;
80 
81  private:
82   DISALLOW_COPY_AND_ASSIGN(PowerManagerTest);
83 };
84 
TEST_F(PowerManagerTest,RegisterService)85 TEST_F(PowerManagerTest, RegisterService) {
86   EXPECT_EQ(power_manager_,
87             binder_wrapper()->GetRegisteredService(kPowerManagerServiceName));
88 }
89 
TEST_F(PowerManagerTest,AcquireAndReleaseWakeLock)90 TEST_F(PowerManagerTest, AcquireAndReleaseWakeLock) {
91   const char kTag[] = "foo";
92   const char kPackage[] = "bar";
93   sp<BBinder> binder = binder_wrapper()->CreateLocalBinder();
94 
95   // Check that PowerManager looks up the calling UID when necessary.
96   const uid_t kCallingUid = 100;
97   binder_wrapper()->set_calling_uid(kCallingUid);
98   EXPECT_EQ(OK, interface_->acquireWakeLock(0, binder, String16(kTag),
99                                             String16(kPackage)));
100   EXPECT_EQ(1, wake_lock_manager_->num_requests());
101   EXPECT_EQ(
102       WakeLockManagerStub::ConstructRequestString(kTag, kPackage, kCallingUid),
103       wake_lock_manager_->GetRequestString(
104           binder_wrapper()->local_binders()[0]));
105 
106   EXPECT_EQ(OK, interface_->releaseWakeLock(binder, 0));
107   EXPECT_EQ(0, wake_lock_manager_->num_requests());
108 
109   // If a UID is passed, it should be used instead.
110   const uid_t kPassedUid = 200;
111   EXPECT_EQ(OK, interface_->acquireWakeLockWithUid(
112                     0, binder, String16(kTag), String16(kPackage), kPassedUid));
113   EXPECT_EQ(1, wake_lock_manager_->num_requests());
114   EXPECT_EQ(
115       WakeLockManagerStub::ConstructRequestString(kTag, kPackage, kPassedUid),
116       wake_lock_manager_->GetRequestString(
117           binder_wrapper()->local_binders()[0]));
118 }
119 
TEST_F(PowerManagerTest,GoToSleep)120 TEST_F(PowerManagerTest, GoToSleep) {
121   EXPECT_EQ("", ReadPowerState());
122 
123   const int64_t kStartTime = base::SysInfo::Uptime().InMilliseconds();
124   EXPECT_EQ(OK,
125             interface_->goToSleep(kStartTime, 0 /* reason */, 0 /* flags */));
126   EXPECT_EQ(PowerManager::kPowerStateSuspend, ReadPowerState());
127 
128   // A request with a timestamp preceding the last resume should be ignored.
129   ClearPowerState();
130   EXPECT_EQ(BAD_VALUE, interface_->goToSleep(kStartTime - 1, 0, 0));
131   EXPECT_EQ("", ReadPowerState());
132 
133   // A second attempt with a timestamp occurring after the last
134   // resume should be honored.
135   ClearPowerState();
136   EXPECT_EQ(
137       OK,
138       interface_->goToSleep(base::SysInfo::Uptime().InMilliseconds(), 0, 0));
139   EXPECT_EQ(PowerManager::kPowerStateSuspend, ReadPowerState());
140 }
141 
TEST_F(PowerManagerTest,Reboot)142 TEST_F(PowerManagerTest, Reboot) {
143   EXPECT_EQ(OK, interface_->reboot(false, String16(), false));
144   EXPECT_EQ(PowerManager::kRebootPrefix,
145             property_setter_->GetProperty(ANDROID_RB_PROPERTY));
146 
147   EXPECT_EQ(OK, interface_->reboot(false, String16(kRebootReasonRecovery),
148                                    false));
149   EXPECT_EQ(std::string(PowerManager::kRebootPrefix) + kRebootReasonRecovery,
150             property_setter_->GetProperty(ANDROID_RB_PROPERTY));
151 
152   // Invalid values should be rejected.
153   ASSERT_TRUE(property_setter_->SetProperty(ANDROID_RB_PROPERTY, ""));
154   EXPECT_EQ(BAD_VALUE, interface_->reboot(false, String16("foo"), false));
155   EXPECT_EQ("", property_setter_->GetProperty(ANDROID_RB_PROPERTY));
156 }
157 
TEST_F(PowerManagerTest,Shutdown)158 TEST_F(PowerManagerTest, Shutdown) {
159   EXPECT_EQ(OK, interface_->shutdown(false, String16(), false));
160   EXPECT_EQ(PowerManager::kShutdownPrefix,
161             property_setter_->GetProperty(ANDROID_RB_PROPERTY));
162 
163   EXPECT_EQ(OK, interface_->shutdown(false,
164                                      String16(kShutdownReasonUserRequested),
165                                      false));
166   EXPECT_EQ(std::string(PowerManager::kShutdownPrefix) +
167             kShutdownReasonUserRequested,
168             property_setter_->GetProperty(ANDROID_RB_PROPERTY));
169 
170   // Invalid values should be rejected.
171   ASSERT_TRUE(property_setter_->SetProperty(ANDROID_RB_PROPERTY, ""));
172   EXPECT_EQ(BAD_VALUE, interface_->shutdown(false, String16("foo"), false));
173   EXPECT_EQ("", property_setter_->GetProperty(ANDROID_RB_PROPERTY));
174 }
175 
176 }  // namespace android
177