blob: 5bb088a12102932e825c7d0787dd30d52f21959b [file] [log] [blame]
Wei Wang61c2a332020-01-08 16:51:47 -08001/*
2 * Copyright (C) 2020 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#include <aidl/Gtest.h>
17#include <aidl/Vintf.h>
18
Wei Wang05003412021-04-01 10:44:29 -070019#include <aidl/android/hardware/power/BnPower.h>
20#include <aidl/android/hardware/power/BnPowerHintSession.h>
Dan Stozacca80272020-01-13 13:06:13 -080021#include <android-base/properties.h>
Wei Wang05003412021-04-01 10:44:29 -070022#include <android/binder_ibinder.h>
23#include <android/binder_manager.h>
24#include <android/binder_process.h>
Wei Wang61c2a332020-01-08 16:51:47 -080025
Wei Wang05003412021-04-01 10:44:29 -070026#include <unistd.h>
Wei Wang61c2a332020-01-08 16:51:47 -080027
Wei Wang05003412021-04-01 10:44:29 -070028namespace aidl::android::hardware::power {
29namespace {
30
31using ::android::base::GetUintProperty;
Wei Wang61c2a332020-01-08 16:51:47 -080032using android::hardware::power::Boost;
33using android::hardware::power::IPower;
Wei Wang05003412021-04-01 10:44:29 -070034using android::hardware::power::IPowerHintSession;
Wei Wang61c2a332020-01-08 16:51:47 -080035using android::hardware::power::Mode;
Wei Wang05003412021-04-01 10:44:29 -070036using android::hardware::power::WorkDuration;
Wei Wang61c2a332020-01-08 16:51:47 -080037
Wei Wang05003412021-04-01 10:44:29 -070038const std::vector<Boost> kBoosts{ndk::enum_range<Boost>().begin(), ndk::enum_range<Boost>().end()};
Wei Wang61c2a332020-01-08 16:51:47 -080039
Wei Wang05003412021-04-01 10:44:29 -070040const std::vector<Mode> kModes{ndk::enum_range<Mode>().begin(), ndk::enum_range<Mode>().end()};
Wei Wang61c2a332020-01-08 16:51:47 -080041
42const std::vector<Boost> kInvalidBoosts = {
43 static_cast<Boost>(static_cast<int32_t>(kBoosts.front()) - 1),
44 static_cast<Boost>(static_cast<int32_t>(kBoosts.back()) + 1),
45};
46
47const std::vector<Mode> kInvalidModes = {
48 static_cast<Mode>(static_cast<int32_t>(kModes.front()) - 1),
49 static_cast<Mode>(static_cast<int32_t>(kModes.back()) + 1),
50};
51
Wei Wang05003412021-04-01 10:44:29 -070052class DurationWrapper : public WorkDuration {
53 public:
54 DurationWrapper(int64_t dur, int64_t time) {
55 durationNanos = dur;
56 timeStampNanos = time;
57 }
58};
59
60const std::vector<int32_t> kSelfTids = {
61 gettid(),
62};
63
64const std::vector<int32_t> kEmptyTids = {};
65
66const std::vector<WorkDuration> kNoDurations = {};
67
68const std::vector<WorkDuration> kDurationsWithZero = {
69 DurationWrapper(1000L, 1L),
70 DurationWrapper(0L, 2L),
71};
72
73const std::vector<WorkDuration> kDurationsWithNegative = {
74 DurationWrapper(1000L, 1L),
75 DurationWrapper(-1000L, 2L),
76};
77
78const std::vector<WorkDuration> kDurations = {
79 DurationWrapper(1L, 1L),
80 DurationWrapper(1000L, 2L),
81 DurationWrapper(1000000L, 3L),
82 DurationWrapper(1000000000L, 4L),
83};
84
Wei Wang61c2a332020-01-08 16:51:47 -080085class PowerAidl : public testing::TestWithParam<std::string> {
86 public:
87 virtual void SetUp() override {
Wei Wang05003412021-04-01 10:44:29 -070088 AIBinder* binder = AServiceManager_waitForService(GetParam().c_str());
89 ASSERT_NE(binder, nullptr);
90 power = IPower::fromBinder(ndk::SpAIBinder(binder));
Wei Wang61c2a332020-01-08 16:51:47 -080091 }
92
Wei Wang05003412021-04-01 10:44:29 -070093 std::shared_ptr<IPower> power;
Wei Wang61c2a332020-01-08 16:51:47 -080094};
95
96TEST_P(PowerAidl, setMode) {
97 for (const auto& mode : kModes) {
98 ASSERT_TRUE(power->setMode(mode, true).isOk());
99 ASSERT_TRUE(power->setMode(mode, false).isOk());
100 }
101 for (const auto& mode : kInvalidModes) {
102 ASSERT_TRUE(power->setMode(mode, true).isOk());
103 ASSERT_TRUE(power->setMode(mode, false).isOk());
104 }
105}
106
107TEST_P(PowerAidl, isModeSupported) {
108 for (const auto& mode : kModes) {
109 bool supported;
110 ASSERT_TRUE(power->isModeSupported(mode, &supported).isOk());
111 }
112 for (const auto& mode : kInvalidModes) {
113 bool supported;
114 ASSERT_TRUE(power->isModeSupported(mode, &supported).isOk());
Dan Stozacca80272020-01-13 13:06:13 -0800115 // Should return false for values outside enum
Wei Wang61c2a332020-01-08 16:51:47 -0800116 ASSERT_FALSE(supported);
117 }
118}
119
120TEST_P(PowerAidl, setBoost) {
121 for (const auto& boost : kBoosts) {
122 ASSERT_TRUE(power->setBoost(boost, 0).isOk());
123 ASSERT_TRUE(power->setBoost(boost, 1000).isOk());
124 ASSERT_TRUE(power->setBoost(boost, -1).isOk());
125 }
126 for (const auto& boost : kInvalidBoosts) {
127 ASSERT_TRUE(power->setBoost(boost, 0).isOk());
128 ASSERT_TRUE(power->setBoost(boost, 1000).isOk());
129 ASSERT_TRUE(power->setBoost(boost, -1).isOk());
130 }
131}
132
133TEST_P(PowerAidl, isBoostSupported) {
134 for (const auto& boost : kBoosts) {
135 bool supported;
136 ASSERT_TRUE(power->isBoostSupported(boost, &supported).isOk());
137 }
138 for (const auto& boost : kInvalidBoosts) {
139 bool supported;
140 ASSERT_TRUE(power->isBoostSupported(boost, &supported).isOk());
Dan Stozacca80272020-01-13 13:06:13 -0800141 // Should return false for values outside enum
Wei Wang61c2a332020-01-08 16:51:47 -0800142 ASSERT_FALSE(supported);
143 }
144}
145
Wei Wang05003412021-04-01 10:44:29 -0700146TEST_P(PowerAidl, getHintSessionPreferredRate) {
147 int64_t rate = -1;
148 auto status = power->getHintSessionPreferredRate(&rate);
149 if (!status.isOk()) {
150 ASSERT_EQ(EX_UNSUPPORTED_OPERATION, status.getExceptionCode());
151 return;
152 }
153
154 // At least 1ms rate limit from HAL
155 ASSERT_GE(rate, 1000000);
156}
157
158TEST_P(PowerAidl, createAndCloseHintSession) {
159 std::shared_ptr<IPowerHintSession> session;
160 auto status = power->createHintSession(getpid(), getuid(), kSelfTids, 16666666L, &session);
161 if (!status.isOk()) {
162 ASSERT_EQ(EX_UNSUPPORTED_OPERATION, status.getExceptionCode());
163 return;
164 }
165 ASSERT_NE(nullptr, session);
166 ASSERT_TRUE(session->pause().isOk());
167 ASSERT_TRUE(session->resume().isOk());
168 // Test normal destroy operation
169 ASSERT_TRUE(session->close().isOk());
170 session.reset();
171}
172TEST_P(PowerAidl, createHintSessionFailed) {
173 std::shared_ptr<IPowerHintSession> session;
174 auto status = power->createHintSession(getpid(), getuid(), kEmptyTids, 16666666L, &session);
175 ASSERT_FALSE(status.isOk());
176 if (EX_UNSUPPORTED_OPERATION == status.getExceptionCode()) {
177 return;
178 }
179 // Test with empty tid list
180 ASSERT_EQ(EX_ILLEGAL_ARGUMENT, status.getExceptionCode());
181}
182
183TEST_P(PowerAidl, updateAndReportDurations) {
184 std::shared_ptr<IPowerHintSession> session;
185 auto status = power->createHintSession(getpid(), getuid(), kSelfTids, 16666666L, &session);
186 if (!status.isOk()) {
187 ASSERT_EQ(EX_UNSUPPORTED_OPERATION, status.getExceptionCode());
188 return;
189 }
190 ASSERT_NE(nullptr, session);
191
192 ASSERT_TRUE(session->updateTargetWorkDuration(16666667LL).isOk());
193 ASSERT_TRUE(session->reportActualWorkDuration(kDurations).isOk());
194}
195
Dan Stozacca80272020-01-13 13:06:13 -0800196// FIXED_PERFORMANCE mode is required for all devices which ship on Android 11
197// or later
198TEST_P(PowerAidl, hasFixedPerformance) {
199 auto apiLevel = GetUintProperty<uint64_t>("ro.product.first_api_level", 0);
200 if (apiLevel == 0) {
201 apiLevel = GetUintProperty<uint64_t>("ro.build.version.sdk", 0);
202 }
203 ASSERT_NE(apiLevel, 0);
204
205 if (apiLevel >= 30) {
206 bool supported;
207 ASSERT_TRUE(power->isModeSupported(Mode::FIXED_PERFORMANCE, &supported).isOk());
208 ASSERT_TRUE(supported);
209 }
210}
211
Dan Shiba4d5322020-07-28 13:09:30 -0700212GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(PowerAidl);
Wei Wang61c2a332020-01-08 16:51:47 -0800213INSTANTIATE_TEST_SUITE_P(Power, PowerAidl,
Wei Wang05003412021-04-01 10:44:29 -0700214 testing::ValuesIn(::android::getAidlHalInstanceNames(IPower::descriptor)),
215 ::android::PrintInstanceNameToString);
216
217} // namespace
Wei Wang61c2a332020-01-08 16:51:47 -0800218
219int main(int argc, char** argv) {
220 ::testing::InitGoogleTest(&argc, argv);
Wei Wang05003412021-04-01 10:44:29 -0700221 ABinderProcess_setThreadPoolMaxThreadCount(1);
222 ABinderProcess_startThreadPool();
Wei Wang61c2a332020-01-08 16:51:47 -0800223 return RUN_ALL_TESTS();
224}
Wei Wang05003412021-04-01 10:44:29 -0700225
226} // namespace aidl::android::hardware::power