blob: 641ba9f44bb16ec459ea25be82d4a1d26d1e2fdc [file] [log] [blame]
Lais Andrade4d51f6c2020-03-25 10:58:31 +00001/*
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
17#define LOG_TAG "PowerHalWrapperAidlTest"
18
Xiang Wang99f6f3c2023-05-22 13:12:16 -070019#include <aidl/android/hardware/power/Boost.h>
20#include <aidl/android/hardware/power/IPowerHintSession.h>
21#include <aidl/android/hardware/power/Mode.h>
Lais Andrade4d51f6c2020-03-25 10:58:31 +000022#include <binder/IServiceManager.h>
Lais Andrade4d51f6c2020-03-25 10:58:31 +000023#include <gmock/gmock.h>
24#include <gtest/gtest.h>
Lais Andrade4d51f6c2020-03-25 10:58:31 +000025#include <powermanager/PowerHalWrapper.h>
Lais Andradeb59a9b52020-05-07 17:23:42 +010026#include <utils/Log.h>
Lais Andrade4d51f6c2020-03-25 10:58:31 +000027
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080028#include <unistd.h>
Lais Andrade4d51f6c2020-03-25 10:58:31 +000029#include <thread>
Lais Andrade4d51f6c2020-03-25 10:58:31 +000030
Xiang Wang99f6f3c2023-05-22 13:12:16 -070031using aidl::android::hardware::power::Boost;
32using aidl::android::hardware::power::IPower;
33using aidl::android::hardware::power::IPowerHintSession;
34using aidl::android::hardware::power::Mode;
Lais Andrade4d51f6c2020-03-25 10:58:31 +000035using android::binder::Status;
Lais Andrade4d51f6c2020-03-25 10:58:31 +000036
37using namespace android;
Lais Andradeb59a9b52020-05-07 17:23:42 +010038using namespace android::power;
Lais Andrade4d51f6c2020-03-25 10:58:31 +000039using namespace std::chrono_literals;
40using namespace testing;
41
42// -------------------------------------------------------------------------------------------------
43
44class MockIPower : public IPower {
45public:
Xiang Wang99f6f3c2023-05-22 13:12:16 -070046 MockIPower() = default;
47
48 MOCK_METHOD(ndk::ScopedAStatus, isBoostSupported, (Boost boost, bool* ret), (override));
49 MOCK_METHOD(ndk::ScopedAStatus, setBoost, (Boost boost, int32_t durationMs), (override));
50 MOCK_METHOD(ndk::ScopedAStatus, isModeSupported, (Mode mode, bool* ret), (override));
51 MOCK_METHOD(ndk::ScopedAStatus, setMode, (Mode mode, bool enabled), (override));
52 MOCK_METHOD(ndk::ScopedAStatus, createHintSession,
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080053 (int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds,
Xiang Wang99f6f3c2023-05-22 13:12:16 -070054 int64_t durationNanos, std::shared_ptr<IPowerHintSession>* session),
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080055 (override));
Xiang Wang99f6f3c2023-05-22 13:12:16 -070056 MOCK_METHOD(ndk::ScopedAStatus, getHintSessionPreferredRate, (int64_t * rate), (override));
57 MOCK_METHOD(ndk::ScopedAStatus, getInterfaceVersion, (int32_t * version), (override));
58 MOCK_METHOD(ndk::ScopedAStatus, getInterfaceHash, (std::string * hash), (override));
59 MOCK_METHOD(ndk::SpAIBinder, asBinder, (), (override));
60 MOCK_METHOD(bool, isRemote, (), (override));
Lais Andrade4d51f6c2020-03-25 10:58:31 +000061};
62
63// -------------------------------------------------------------------------------------------------
64
65class PowerHalWrapperAidlTest : public Test {
66public:
67 void SetUp() override;
68
69protected:
Lais Andradeb59a9b52020-05-07 17:23:42 +010070 std::unique_ptr<HalWrapper> mWrapper = nullptr;
Xiang Wang99f6f3c2023-05-22 13:12:16 -070071 std::shared_ptr<StrictMock<MockIPower>> mMockHal = nullptr;
Lais Andrade4d51f6c2020-03-25 10:58:31 +000072};
73
74// -------------------------------------------------------------------------------------------------
75
76void PowerHalWrapperAidlTest::SetUp() {
Xiang Wang99f6f3c2023-05-22 13:12:16 -070077 mMockHal = ndk::SharedRefBase::make<StrictMock<MockIPower>>();
Lais Andradeb59a9b52020-05-07 17:23:42 +010078 mWrapper = std::make_unique<AidlHalWrapper>(mMockHal);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080079 ASSERT_NE(nullptr, mWrapper);
Lais Andrade4d51f6c2020-03-25 10:58:31 +000080}
81
82// -------------------------------------------------------------------------------------------------
83
84TEST_F(PowerHalWrapperAidlTest, TestSetBoostSuccessful) {
85 {
86 InSequence seq;
87 EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::DISPLAY_UPDATE_IMMINENT), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +010088 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -070089 .WillOnce(DoAll(SetArgPointee<1>(true),
90 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +000091 EXPECT_CALL(*mMockHal.get(), setBoost(Eq(Boost::DISPLAY_UPDATE_IMMINENT), Eq(100)))
Xiang Wang99f6f3c2023-05-22 13:12:16 -070092 .Times(Exactly(1))
93 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
Lais Andrade4d51f6c2020-03-25 10:58:31 +000094 }
95
96 auto result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 100);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080097 ASSERT_TRUE(result.isOk());
Lais Andrade4d51f6c2020-03-25 10:58:31 +000098}
99
100TEST_F(PowerHalWrapperAidlTest, TestSetBoostFailed) {
101 {
102 InSequence seq;
103 EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::INTERACTION), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100104 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700105 .WillOnce(DoAll(SetArgPointee<1>(true),
106 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000107 EXPECT_CALL(*mMockHal.get(), setBoost(Eq(Boost::INTERACTION), Eq(100)))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100108 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700109 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000110 EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::DISPLAY_UPDATE_IMMINENT), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100111 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700112 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000113 }
114
115 auto result = mWrapper->setBoost(Boost::INTERACTION, 100);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800116 ASSERT_TRUE(result.isFailed());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000117 result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 1000);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800118 ASSERT_TRUE(result.isFailed());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000119}
120
121TEST_F(PowerHalWrapperAidlTest, TestSetBoostUnsupported) {
122 EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::INTERACTION), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100123 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700124 .WillOnce(DoAll(SetArgPointee<1>(false),
125 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000126
127 auto result = mWrapper->setBoost(Boost::INTERACTION, 1000);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800128 ASSERT_TRUE(result.isUnsupported());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000129 result = mWrapper->setBoost(Boost::CAMERA_SHOT, 10);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800130 ASSERT_TRUE(result.isUnsupported());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000131}
132
133TEST_F(PowerHalWrapperAidlTest, TestSetBoostMultiThreadCheckSupportedOnlyOnce) {
134 {
135 InSequence seq;
136 EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::INTERACTION), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100137 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700138 .WillOnce(DoAll(SetArgPointee<1>(true),
139 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
140 auto& exp = EXPECT_CALL(*mMockHal.get(), setBoost(Eq(Boost::INTERACTION), Eq(100)))
141 .Times(Exactly(10));
142 for (int i = 0; i < 10; i++) {
143 exp.WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
144 }
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000145 }
146
147 std::vector<std::thread> threads;
148 for (int i = 0; i < 10; i++) {
149 threads.push_back(std::thread([&]() {
150 auto result = mWrapper->setBoost(Boost::INTERACTION, 100);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800151 ASSERT_TRUE(result.isOk());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000152 }));
153 }
154 std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); });
155}
156
157TEST_F(PowerHalWrapperAidlTest, TestSetModeSuccessful) {
158 {
159 InSequence seq;
160 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::DISPLAY_INACTIVE), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100161 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700162 .WillOnce(DoAll(SetArgPointee<1>(true),
163 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000164 EXPECT_CALL(*mMockHal.get(), setMode(Eq(Mode::DISPLAY_INACTIVE), Eq(false)))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700165 .Times(Exactly(1))
166 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000167 }
168
169 auto result = mWrapper->setMode(Mode::DISPLAY_INACTIVE, false);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800170 ASSERT_TRUE(result.isOk());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000171}
172
173TEST_F(PowerHalWrapperAidlTest, TestSetModeFailed) {
174 {
175 InSequence seq;
176 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::LAUNCH), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100177 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700178 .WillOnce(DoAll(SetArgPointee<1>(true),
179 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000180 EXPECT_CALL(*mMockHal.get(), setMode(Eq(Mode::LAUNCH), Eq(true)))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100181 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700182 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000183 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::DISPLAY_INACTIVE), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100184 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700185 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000186 }
187
188 auto result = mWrapper->setMode(Mode::LAUNCH, true);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800189 ASSERT_TRUE(result.isFailed());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000190 result = mWrapper->setMode(Mode::DISPLAY_INACTIVE, false);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800191 ASSERT_TRUE(result.isFailed());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000192}
193
194TEST_F(PowerHalWrapperAidlTest, TestSetModeUnsupported) {
195 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::LAUNCH), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100196 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700197 .WillOnce(DoAll(SetArgPointee<1>(false),
198 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000199
200 auto result = mWrapper->setMode(Mode::LAUNCH, true);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800201 ASSERT_TRUE(result.isUnsupported());
Jim Blackler559361b2021-11-29 00:07:39 +0000202
203 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::CAMERA_STREAMING_HIGH), _))
204 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700205 .WillOnce(DoAll(SetArgPointee<1>(false),
206 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000207 result = mWrapper->setMode(Mode::CAMERA_STREAMING_HIGH, true);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800208 ASSERT_TRUE(result.isUnsupported());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000209}
210
211TEST_F(PowerHalWrapperAidlTest, TestSetModeMultiThreadCheckSupportedOnlyOnce) {
212 {
213 InSequence seq;
214 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::LAUNCH), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100215 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700216 .WillOnce(DoAll(SetArgPointee<1>(true),
217 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
218 auto& exp = EXPECT_CALL(*mMockHal.get(), setMode(Eq(Mode::LAUNCH), Eq(false)))
219 .Times(Exactly(10));
220 for (int i = 0; i < 10; i++) {
221 exp.WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
222 }
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000223 }
224
225 std::vector<std::thread> threads;
226 for (int i = 0; i < 10; i++) {
227 threads.push_back(std::thread([&]() {
228 auto result = mWrapper->setMode(Mode::LAUNCH, false);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800229 ASSERT_TRUE(result.isOk());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000230 }));
231 }
232 std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); });
233}
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800234
235TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionSuccessful) {
236 std::vector<int> threadIds{gettid()};
237 int32_t tgid = 999;
238 int32_t uid = 1001;
239 int64_t durationNanos = 16666666L;
240 EXPECT_CALL(*mMockHal.get(),
241 createHintSession(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos), _))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700242 .Times(Exactly(1))
243 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800244 auto result = mWrapper->createHintSession(tgid, uid, threadIds, durationNanos);
245 ASSERT_TRUE(result.isOk());
246}
247
248TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionFailed) {
249 int32_t tgid = 999;
250 int32_t uid = 1001;
251 std::vector<int> threadIds{};
252 int64_t durationNanos = 16666666L;
253 EXPECT_CALL(*mMockHal.get(),
254 createHintSession(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos), _))
255 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700256 .WillOnce(Return(testing::ByMove(
257 ndk::ScopedAStatus::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT))));
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800258 auto result = mWrapper->createHintSession(tgid, uid, threadIds, durationNanos);
259 ASSERT_TRUE(result.isFailed());
260}
261
262TEST_F(PowerHalWrapperAidlTest, TestGetHintSessionPreferredRate) {
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700263 EXPECT_CALL(*mMockHal.get(), getHintSessionPreferredRate(_))
264 .Times(Exactly(1))
265 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800266 auto result = mWrapper->getHintSessionPreferredRate();
267 ASSERT_TRUE(result.isOk());
268 int64_t rate = result.value();
269 ASSERT_GE(0, rate);
270}