blob: 96995a0acc28365bc5dd29a3a4693459e88b6a3b [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 Wang9df909d2021-06-12 18:26:38 -070025#include <android/binder_status.h>
Wei Wang61c2a332020-01-08 16:51:47 -080026
Wei Wang05003412021-04-01 10:44:29 -070027#include <unistd.h>
Wei Wang61c2a332020-01-08 16:51:47 -080028
Wei Wang05003412021-04-01 10:44:29 -070029namespace aidl::android::hardware::power {
30namespace {
31
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;
Matt Buckley13843882022-09-15 22:32:56 +000036using android::hardware::power::SessionHint;
Matt Buckley1fde90c2023-06-28 19:55:26 +000037using android::hardware::power::SessionMode;
Wei Wang05003412021-04-01 10:44:29 -070038using android::hardware::power::WorkDuration;
Wei Wang61c2a332020-01-08 16:51:47 -080039
Wei Wang05003412021-04-01 10:44:29 -070040const std::vector<Boost> kBoosts{ndk::enum_range<Boost>().begin(), ndk::enum_range<Boost>().end()};
Wei Wang61c2a332020-01-08 16:51:47 -080041
Wei Wang05003412021-04-01 10:44:29 -070042const std::vector<Mode> kModes{ndk::enum_range<Mode>().begin(), ndk::enum_range<Mode>().end()};
Wei Wang61c2a332020-01-08 16:51:47 -080043
Matt Buckley13843882022-09-15 22:32:56 +000044const std::vector<SessionHint> kSessionHints{ndk::enum_range<SessionHint>().begin(),
45 ndk::enum_range<SessionHint>().end()};
46
Matt Buckley1fde90c2023-06-28 19:55:26 +000047const std::vector<SessionMode> kSessionModes{ndk::enum_range<SessionMode>().begin(),
48 ndk::enum_range<SessionMode>().end()};
49
Wei Wang61c2a332020-01-08 16:51:47 -080050const std::vector<Boost> kInvalidBoosts = {
51 static_cast<Boost>(static_cast<int32_t>(kBoosts.front()) - 1),
52 static_cast<Boost>(static_cast<int32_t>(kBoosts.back()) + 1),
53};
54
55const std::vector<Mode> kInvalidModes = {
56 static_cast<Mode>(static_cast<int32_t>(kModes.front()) - 1),
57 static_cast<Mode>(static_cast<int32_t>(kModes.back()) + 1),
58};
59
Matt Buckley13843882022-09-15 22:32:56 +000060const std::vector<SessionHint> kInvalidSessionHints = {
61 static_cast<SessionHint>(static_cast<int32_t>(kSessionHints.front()) - 1),
62 static_cast<SessionHint>(static_cast<int32_t>(kSessionHints.back()) + 1),
63};
64
Matt Buckley1fde90c2023-06-28 19:55:26 +000065const std::vector<SessionMode> kInvalidSessionModes = {
66 static_cast<SessionMode>(static_cast<int32_t>(kSessionModes.front()) - 1),
67 static_cast<SessionMode>(static_cast<int32_t>(kSessionModes.back()) + 1),
68};
69
Wei Wang05003412021-04-01 10:44:29 -070070class DurationWrapper : public WorkDuration {
71 public:
72 DurationWrapper(int64_t dur, int64_t time) {
73 durationNanos = dur;
74 timeStampNanos = time;
75 }
76};
77
78const std::vector<int32_t> kSelfTids = {
79 gettid(),
80};
81
82const std::vector<int32_t> kEmptyTids = {};
83
84const std::vector<WorkDuration> kNoDurations = {};
85
86const std::vector<WorkDuration> kDurationsWithZero = {
87 DurationWrapper(1000L, 1L),
88 DurationWrapper(0L, 2L),
89};
90
91const std::vector<WorkDuration> kDurationsWithNegative = {
92 DurationWrapper(1000L, 1L),
93 DurationWrapper(-1000L, 2L),
94};
95
96const std::vector<WorkDuration> kDurations = {
97 DurationWrapper(1L, 1L),
98 DurationWrapper(1000L, 2L),
99 DurationWrapper(1000000L, 3L),
100 DurationWrapper(1000000000L, 4L),
101};
102
Wei Wang61c2a332020-01-08 16:51:47 -0800103class PowerAidl : public testing::TestWithParam<std::string> {
104 public:
105 virtual void SetUp() override {
Wei Wang05003412021-04-01 10:44:29 -0700106 AIBinder* binder = AServiceManager_waitForService(GetParam().c_str());
107 ASSERT_NE(binder, nullptr);
108 power = IPower::fromBinder(ndk::SpAIBinder(binder));
Matt Buckley42027e02023-08-07 23:50:04 +0000109 auto status = power->getInterfaceVersion(&mServiceVersion);
110 ASSERT_TRUE(status.isOk());
Wei Wang61c2a332020-01-08 16:51:47 -0800111 }
112
Wei Wang05003412021-04-01 10:44:29 -0700113 std::shared_ptr<IPower> power;
Matt Buckley42027e02023-08-07 23:50:04 +0000114 int32_t mServiceVersion;
115};
116
117class HintSessionAidl : public PowerAidl {
118 public:
119 virtual void SetUp() override {
120 PowerAidl::SetUp();
121 if (mServiceVersion < 2) {
122 GTEST_SKIP() << "DEVICE not launching with Power V2 and beyond.";
123 }
124
125 auto status = power->createHintSession(getpid(), getuid(), kSelfTids, 16666666L, &mSession);
126 ASSERT_TRUE(status.isOk());
127 ASSERT_NE(nullptr, mSession);
128 }
129 std::shared_ptr<IPowerHintSession> mSession;
Wei Wang61c2a332020-01-08 16:51:47 -0800130};
131
132TEST_P(PowerAidl, setMode) {
133 for (const auto& mode : kModes) {
134 ASSERT_TRUE(power->setMode(mode, true).isOk());
135 ASSERT_TRUE(power->setMode(mode, false).isOk());
136 }
137 for (const auto& mode : kInvalidModes) {
138 ASSERT_TRUE(power->setMode(mode, true).isOk());
139 ASSERT_TRUE(power->setMode(mode, false).isOk());
140 }
141}
142
143TEST_P(PowerAidl, isModeSupported) {
144 for (const auto& mode : kModes) {
145 bool supported;
146 ASSERT_TRUE(power->isModeSupported(mode, &supported).isOk());
147 }
148 for (const auto& mode : kInvalidModes) {
149 bool supported;
150 ASSERT_TRUE(power->isModeSupported(mode, &supported).isOk());
Dan Stozacca80272020-01-13 13:06:13 -0800151 // Should return false for values outside enum
Wei Wang61c2a332020-01-08 16:51:47 -0800152 ASSERT_FALSE(supported);
153 }
154}
155
156TEST_P(PowerAidl, setBoost) {
157 for (const auto& boost : kBoosts) {
158 ASSERT_TRUE(power->setBoost(boost, 0).isOk());
159 ASSERT_TRUE(power->setBoost(boost, 1000).isOk());
160 ASSERT_TRUE(power->setBoost(boost, -1).isOk());
161 }
162 for (const auto& boost : kInvalidBoosts) {
163 ASSERT_TRUE(power->setBoost(boost, 0).isOk());
164 ASSERT_TRUE(power->setBoost(boost, 1000).isOk());
165 ASSERT_TRUE(power->setBoost(boost, -1).isOk());
166 }
167}
168
169TEST_P(PowerAidl, isBoostSupported) {
170 for (const auto& boost : kBoosts) {
171 bool supported;
172 ASSERT_TRUE(power->isBoostSupported(boost, &supported).isOk());
173 }
174 for (const auto& boost : kInvalidBoosts) {
175 bool supported;
176 ASSERT_TRUE(power->isBoostSupported(boost, &supported).isOk());
Dan Stozacca80272020-01-13 13:06:13 -0800177 // Should return false for values outside enum
Wei Wang61c2a332020-01-08 16:51:47 -0800178 ASSERT_FALSE(supported);
179 }
180}
181
Wei Wang05003412021-04-01 10:44:29 -0700182TEST_P(PowerAidl, getHintSessionPreferredRate) {
Matt Buckley42027e02023-08-07 23:50:04 +0000183 if (mServiceVersion < 2) {
184 GTEST_SKIP() << "DEVICE not launching with Power V2 and beyond.";
Wei Wang05003412021-04-01 10:44:29 -0700185 }
Matt Buckley42027e02023-08-07 23:50:04 +0000186
187 int64_t rate = -1;
188 ASSERT_TRUE(power->getHintSessionPreferredRate(&rate).isOk());
Wei Wang05003412021-04-01 10:44:29 -0700189 // At least 1ms rate limit from HAL
190 ASSERT_GE(rate, 1000000);
191}
192
Matt Buckley42027e02023-08-07 23:50:04 +0000193TEST_P(HintSessionAidl, createAndCloseHintSession) {
194 ASSERT_TRUE(mSession->pause().isOk());
195 ASSERT_TRUE(mSession->resume().isOk());
Wei Wang05003412021-04-01 10:44:29 -0700196 // Test normal destroy operation
Matt Buckley42027e02023-08-07 23:50:04 +0000197 ASSERT_TRUE(mSession->close().isOk());
198 mSession.reset();
Wei Wang05003412021-04-01 10:44:29 -0700199}
Matt Buckley13843882022-09-15 22:32:56 +0000200
Matt Buckley42027e02023-08-07 23:50:04 +0000201TEST_P(HintSessionAidl, createHintSessionFailed) {
Wei Wang05003412021-04-01 10:44:29 -0700202 std::shared_ptr<IPowerHintSession> session;
203 auto status = power->createHintSession(getpid(), getuid(), kEmptyTids, 16666666L, &session);
Peiyong Lin3e0eb722022-10-17 19:55:20 +0000204
205 // Regardless of whether V2 and beyond is supported, the status is always not STATUS_OK.
Wei Wang05003412021-04-01 10:44:29 -0700206 ASSERT_FALSE(status.isOk());
Wei Wang05003412021-04-01 10:44:29 -0700207 ASSERT_EQ(EX_ILLEGAL_ARGUMENT, status.getExceptionCode());
208}
209
Matt Buckley42027e02023-08-07 23:50:04 +0000210TEST_P(HintSessionAidl, updateAndReportDurations) {
211 ASSERT_TRUE(mSession->updateTargetWorkDuration(16666667LL).isOk());
212 ASSERT_TRUE(mSession->reportActualWorkDuration(kDurations).isOk());
Wei Wang05003412021-04-01 10:44:29 -0700213}
214
Matt Buckley42027e02023-08-07 23:50:04 +0000215TEST_P(HintSessionAidl, sendSessionHint) {
216 if (mServiceVersion < 4) {
217 GTEST_SKIP() << "DEVICE not launching with Power V4 and beyond.";
Matt Buckley13843882022-09-15 22:32:56 +0000218 }
Matt Buckley42027e02023-08-07 23:50:04 +0000219
Matt Buckley13843882022-09-15 22:32:56 +0000220 for (const auto& sessionHint : kSessionHints) {
Matt Buckley42027e02023-08-07 23:50:04 +0000221 ASSERT_TRUE(mSession->sendHint(sessionHint).isOk());
Matt Buckley13843882022-09-15 22:32:56 +0000222 }
223 for (const auto& sessionHint : kInvalidSessionHints) {
Matt Buckley42027e02023-08-07 23:50:04 +0000224 ASSERT_TRUE(mSession->sendHint(sessionHint).isOk());
Matt Buckley13843882022-09-15 22:32:56 +0000225 }
226}
227
Matt Buckley42027e02023-08-07 23:50:04 +0000228TEST_P(HintSessionAidl, setThreads) {
229 if (mServiceVersion < 4) {
230 GTEST_SKIP() << "DEVICE not launching with Power V4 and beyond.";
Peiyong Linc7854592022-10-13 00:10:31 +0000231 }
Peiyong Linc7854592022-10-13 00:10:31 +0000232
Matt Buckley42027e02023-08-07 23:50:04 +0000233 auto status = mSession->setThreads(kEmptyTids);
Peiyong Linc7854592022-10-13 00:10:31 +0000234 ASSERT_FALSE(status.isOk());
235 ASSERT_EQ(EX_ILLEGAL_ARGUMENT, status.getExceptionCode());
236
Matt Buckley42027e02023-08-07 23:50:04 +0000237 ASSERT_TRUE(mSession->setThreads(kSelfTids).isOk());
Peiyong Linc7854592022-10-13 00:10:31 +0000238}
239
Matt Buckley1fde90c2023-06-28 19:55:26 +0000240TEST_P(HintSessionAidl, setSessionMode) {
241 if (mServiceVersion < 5) {
242 GTEST_SKIP() << "DEVICE not launching with Power V5 and beyond.";
243 }
244
245 for (const auto& sessionMode : kSessionModes) {
246 ASSERT_TRUE(mSession->setMode(sessionMode, true).isOk());
247 ASSERT_TRUE(mSession->setMode(sessionMode, false).isOk());
248 }
249 for (const auto& sessionMode : kInvalidSessionModes) {
250 ASSERT_TRUE(mSession->setMode(sessionMode, true).isOk());
251 ASSERT_TRUE(mSession->setMode(sessionMode, false).isOk());
252 }
253}
254
Dan Stozacca80272020-01-13 13:06:13 -0800255// FIXED_PERFORMANCE mode is required for all devices which ship on Android 11
256// or later
257TEST_P(PowerAidl, hasFixedPerformance) {
Peiyong Lin3e0eb722022-10-17 19:55:20 +0000258 bool supported;
259 ASSERT_TRUE(power->isModeSupported(Mode::FIXED_PERFORMANCE, &supported).isOk());
260 ASSERT_TRUE(supported);
Dan Stozacca80272020-01-13 13:06:13 -0800261}
262
Dan Shiba4d5322020-07-28 13:09:30 -0700263GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(PowerAidl);
Matt Buckley42027e02023-08-07 23:50:04 +0000264GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(HintSessionAidl);
265
Wei Wang61c2a332020-01-08 16:51:47 -0800266INSTANTIATE_TEST_SUITE_P(Power, PowerAidl,
Wei Wang05003412021-04-01 10:44:29 -0700267 testing::ValuesIn(::android::getAidlHalInstanceNames(IPower::descriptor)),
268 ::android::PrintInstanceNameToString);
Matt Buckley42027e02023-08-07 23:50:04 +0000269INSTANTIATE_TEST_SUITE_P(Power, HintSessionAidl,
270 testing::ValuesIn(::android::getAidlHalInstanceNames(IPower::descriptor)),
271 ::android::PrintInstanceNameToString);
Wei Wang05003412021-04-01 10:44:29 -0700272
273} // namespace
Xiang Wangdd0edc62023-02-08 16:47:06 -0800274} // namespace aidl::android::hardware::power
Wei Wang61c2a332020-01-08 16:51:47 -0800275
276int main(int argc, char** argv) {
277 ::testing::InitGoogleTest(&argc, argv);
Wei Wang05003412021-04-01 10:44:29 -0700278 ABinderProcess_setThreadPoolMaxThreadCount(1);
279 ABinderProcess_startThreadPool();
Wei Wang61c2a332020-01-08 16:51:47 -0800280 return RUN_ALL_TESTS();
281}