blob: ae84d7b133b07cdb21c55ba84228427dc823e075 [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;
Matt Buckley104f53a2023-12-14 00:19:20 +000032using aidl::android::hardware::power::ChannelConfig;
Xiang Wangc7bf1642024-10-22 17:37:25 -070033using aidl::android::hardware::power::CpuHeadroomParams;
34using aidl::android::hardware::power::GpuHeadroomParams;
Xiang Wang99f6f3c2023-05-22 13:12:16 -070035using aidl::android::hardware::power::IPower;
36using aidl::android::hardware::power::IPowerHintSession;
37using aidl::android::hardware::power::Mode;
Matt Buckley104f53a2023-12-14 00:19:20 +000038using aidl::android::hardware::power::SessionConfig;
39using aidl::android::hardware::power::SessionTag;
Matt Buckley666659a2024-10-28 18:41:40 +000040using aidl::android::hardware::power::SupportInfo;
Lais Andrade4d51f6c2020-03-25 10:58:31 +000041using android::binder::Status;
Lais Andrade4d51f6c2020-03-25 10:58:31 +000042
43using namespace android;
Lais Andradeb59a9b52020-05-07 17:23:42 +010044using namespace android::power;
Lais Andrade4d51f6c2020-03-25 10:58:31 +000045using namespace std::chrono_literals;
46using namespace testing;
47
48// -------------------------------------------------------------------------------------------------
49
50class MockIPower : public IPower {
51public:
Xiang Wang99f6f3c2023-05-22 13:12:16 -070052 MockIPower() = default;
53
54 MOCK_METHOD(ndk::ScopedAStatus, isBoostSupported, (Boost boost, bool* ret), (override));
55 MOCK_METHOD(ndk::ScopedAStatus, setBoost, (Boost boost, int32_t durationMs), (override));
56 MOCK_METHOD(ndk::ScopedAStatus, isModeSupported, (Mode mode, bool* ret), (override));
57 MOCK_METHOD(ndk::ScopedAStatus, setMode, (Mode mode, bool enabled), (override));
58 MOCK_METHOD(ndk::ScopedAStatus, createHintSession,
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080059 (int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds,
Xiang Wang99f6f3c2023-05-22 13:12:16 -070060 int64_t durationNanos, std::shared_ptr<IPowerHintSession>* session),
Jimmy Shiu0b264bb2021-03-03 00:30:50 +080061 (override));
Matt Buckley104f53a2023-12-14 00:19:20 +000062 MOCK_METHOD(ndk::ScopedAStatus, createHintSessionWithConfig,
63 (int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds,
64 int64_t durationNanos, SessionTag tag, SessionConfig* config,
65 std::shared_ptr<IPowerHintSession>* _aidl_return),
66 (override));
67 MOCK_METHOD(ndk::ScopedAStatus, getSessionChannel,
68 (int32_t tgid, int32_t uid, ChannelConfig* _aidl_return), (override));
69 MOCK_METHOD(ndk::ScopedAStatus, closeSessionChannel, (int32_t tgid, int32_t uid), (override));
Xiang Wang99f6f3c2023-05-22 13:12:16 -070070 MOCK_METHOD(ndk::ScopedAStatus, getHintSessionPreferredRate, (int64_t * rate), (override));
Matt Buckley666659a2024-10-28 18:41:40 +000071 MOCK_METHOD(ndk::ScopedAStatus, getSupportInfo, (SupportInfo * _aidl_return), (override));
Xiang Wang99f6f3c2023-05-22 13:12:16 -070072 MOCK_METHOD(ndk::ScopedAStatus, getInterfaceVersion, (int32_t * version), (override));
73 MOCK_METHOD(ndk::ScopedAStatus, getInterfaceHash, (std::string * hash), (override));
74 MOCK_METHOD(ndk::SpAIBinder, asBinder, (), (override));
75 MOCK_METHOD(bool, isRemote, (), (override));
Xiang Wangc7bf1642024-10-22 17:37:25 -070076 MOCK_METHOD(ndk::ScopedAStatus, getCpuHeadroom,
77 (const CpuHeadroomParams& params, std::vector<float>* headroom), (override));
78 MOCK_METHOD(ndk::ScopedAStatus, getGpuHeadroom,
79 (const GpuHeadroomParams& params, float* headroom), (override));
80 MOCK_METHOD(ndk::ScopedAStatus, getCpuHeadroomMinIntervalMillis, (int64_t* interval),
81 (override));
82 MOCK_METHOD(ndk::ScopedAStatus, getGpuHeadroomMinIntervalMillis, (int64_t* interval),
83 (override));
Lais Andrade4d51f6c2020-03-25 10:58:31 +000084};
85
86// -------------------------------------------------------------------------------------------------
87
88class PowerHalWrapperAidlTest : public Test {
89public:
90 void SetUp() override;
91
92protected:
Lais Andradeb59a9b52020-05-07 17:23:42 +010093 std::unique_ptr<HalWrapper> mWrapper = nullptr;
Xiang Wang99f6f3c2023-05-22 13:12:16 -070094 std::shared_ptr<StrictMock<MockIPower>> mMockHal = nullptr;
Lais Andrade4d51f6c2020-03-25 10:58:31 +000095};
96
97// -------------------------------------------------------------------------------------------------
98
99void PowerHalWrapperAidlTest::SetUp() {
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700100 mMockHal = ndk::SharedRefBase::make<StrictMock<MockIPower>>();
Matt Buckley6c18e6d2024-02-07 23:39:50 +0000101 EXPECT_CALL(*mMockHal, getInterfaceVersion(_)).WillRepeatedly(([](int32_t* ret) {
102 *ret = 5;
103 return ndk::ScopedAStatus::ok();
104 }));
Lais Andradeb59a9b52020-05-07 17:23:42 +0100105 mWrapper = std::make_unique<AidlHalWrapper>(mMockHal);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800106 ASSERT_NE(nullptr, mWrapper);
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000107}
108
109// -------------------------------------------------------------------------------------------------
110
111TEST_F(PowerHalWrapperAidlTest, TestSetBoostSuccessful) {
112 {
113 InSequence seq;
114 EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::DISPLAY_UPDATE_IMMINENT), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100115 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700116 .WillOnce(DoAll(SetArgPointee<1>(true),
117 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000118 EXPECT_CALL(*mMockHal.get(), setBoost(Eq(Boost::DISPLAY_UPDATE_IMMINENT), Eq(100)))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700119 .Times(Exactly(1))
120 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000121 }
122
123 auto result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 100);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800124 ASSERT_TRUE(result.isOk());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000125}
126
127TEST_F(PowerHalWrapperAidlTest, TestSetBoostFailed) {
128 {
129 InSequence seq;
130 EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::INTERACTION), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100131 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700132 .WillOnce(DoAll(SetArgPointee<1>(true),
133 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000134 EXPECT_CALL(*mMockHal.get(), setBoost(Eq(Boost::INTERACTION), Eq(100)))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100135 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700136 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000137 EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::DISPLAY_UPDATE_IMMINENT), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100138 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700139 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000140 }
141
142 auto result = mWrapper->setBoost(Boost::INTERACTION, 100);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800143 ASSERT_TRUE(result.isFailed());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000144 result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 1000);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800145 ASSERT_TRUE(result.isFailed());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000146}
147
148TEST_F(PowerHalWrapperAidlTest, TestSetBoostUnsupported) {
Matt Buckley6c18e6d2024-02-07 23:39:50 +0000149 EXPECT_CALL(*mMockHal.get(), isBoostSupported(_, _))
150 .Times(Exactly(2))
151 .WillRepeatedly([](Boost, bool* ret) {
152 *ret = false;
153 return ndk::ScopedAStatus::ok();
154 });
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000155
156 auto result = mWrapper->setBoost(Boost::INTERACTION, 1000);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800157 ASSERT_TRUE(result.isUnsupported());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000158 result = mWrapper->setBoost(Boost::CAMERA_SHOT, 10);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800159 ASSERT_TRUE(result.isUnsupported());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000160}
161
162TEST_F(PowerHalWrapperAidlTest, TestSetBoostMultiThreadCheckSupportedOnlyOnce) {
163 {
164 InSequence seq;
165 EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::INTERACTION), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100166 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700167 .WillOnce(DoAll(SetArgPointee<1>(true),
168 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
169 auto& exp = EXPECT_CALL(*mMockHal.get(), setBoost(Eq(Boost::INTERACTION), Eq(100)))
170 .Times(Exactly(10));
171 for (int i = 0; i < 10; i++) {
172 exp.WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
173 }
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000174 }
175
176 std::vector<std::thread> threads;
177 for (int i = 0; i < 10; i++) {
178 threads.push_back(std::thread([&]() {
179 auto result = mWrapper->setBoost(Boost::INTERACTION, 100);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800180 ASSERT_TRUE(result.isOk());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000181 }));
182 }
183 std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); });
184}
185
186TEST_F(PowerHalWrapperAidlTest, TestSetModeSuccessful) {
187 {
188 InSequence seq;
189 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::DISPLAY_INACTIVE), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100190 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700191 .WillOnce(DoAll(SetArgPointee<1>(true),
192 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000193 EXPECT_CALL(*mMockHal.get(), setMode(Eq(Mode::DISPLAY_INACTIVE), Eq(false)))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700194 .Times(Exactly(1))
195 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000196 }
197
198 auto result = mWrapper->setMode(Mode::DISPLAY_INACTIVE, false);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800199 ASSERT_TRUE(result.isOk());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000200}
201
202TEST_F(PowerHalWrapperAidlTest, TestSetModeFailed) {
203 {
204 InSequence seq;
205 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::LAUNCH), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100206 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700207 .WillOnce(DoAll(SetArgPointee<1>(true),
208 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000209 EXPECT_CALL(*mMockHal.get(), setMode(Eq(Mode::LAUNCH), Eq(true)))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100210 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700211 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000212 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::DISPLAY_INACTIVE), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100213 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700214 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000215 }
216
217 auto result = mWrapper->setMode(Mode::LAUNCH, true);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800218 ASSERT_TRUE(result.isFailed());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000219 result = mWrapper->setMode(Mode::DISPLAY_INACTIVE, false);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800220 ASSERT_TRUE(result.isFailed());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000221}
222
223TEST_F(PowerHalWrapperAidlTest, TestSetModeUnsupported) {
224 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::LAUNCH), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100225 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700226 .WillOnce(DoAll(SetArgPointee<1>(false),
227 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000228
229 auto result = mWrapper->setMode(Mode::LAUNCH, true);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800230 ASSERT_TRUE(result.isUnsupported());
Jim Blackler559361b2021-11-29 00:07:39 +0000231
232 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::CAMERA_STREAMING_HIGH), _))
233 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700234 .WillOnce(DoAll(SetArgPointee<1>(false),
235 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000236 result = mWrapper->setMode(Mode::CAMERA_STREAMING_HIGH, true);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800237 ASSERT_TRUE(result.isUnsupported());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000238}
239
240TEST_F(PowerHalWrapperAidlTest, TestSetModeMultiThreadCheckSupportedOnlyOnce) {
241 {
242 InSequence seq;
243 EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::LAUNCH), _))
Lais Andradeb59a9b52020-05-07 17:23:42 +0100244 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700245 .WillOnce(DoAll(SetArgPointee<1>(true),
246 Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
247 auto& exp = EXPECT_CALL(*mMockHal.get(), setMode(Eq(Mode::LAUNCH), Eq(false)))
248 .Times(Exactly(10));
249 for (int i = 0; i < 10; i++) {
250 exp.WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
251 }
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000252 }
253
254 std::vector<std::thread> threads;
255 for (int i = 0; i < 10; i++) {
256 threads.push_back(std::thread([&]() {
257 auto result = mWrapper->setMode(Mode::LAUNCH, false);
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800258 ASSERT_TRUE(result.isOk());
Lais Andrade4d51f6c2020-03-25 10:58:31 +0000259 }));
260 }
261 std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); });
262}
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800263
264TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionSuccessful) {
265 std::vector<int> threadIds{gettid()};
266 int32_t tgid = 999;
267 int32_t uid = 1001;
268 int64_t durationNanos = 16666666L;
269 EXPECT_CALL(*mMockHal.get(),
270 createHintSession(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos), _))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700271 .Times(Exactly(1))
272 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800273 auto result = mWrapper->createHintSession(tgid, uid, threadIds, durationNanos);
274 ASSERT_TRUE(result.isOk());
275}
276
Matt Buckleydb4192a2023-12-21 20:00:32 +0000277TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionWithConfigSuccessful) {
278 std::vector<int> threadIds{gettid()};
279 int32_t tgid = 999;
280 int32_t uid = 1001;
281 int64_t durationNanos = 16666666L;
282 SessionTag tag = SessionTag::OTHER;
283 SessionConfig out;
284 EXPECT_CALL(*mMockHal.get(),
285 createHintSessionWithConfig(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos),
286 Eq(tag), _, _))
287 .Times(Exactly(1))
288 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
289 auto result =
290 mWrapper->createHintSessionWithConfig(tgid, uid, threadIds, durationNanos, tag, &out);
291 ASSERT_TRUE(result.isOk());
292}
293
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800294TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionFailed) {
295 int32_t tgid = 999;
296 int32_t uid = 1001;
297 std::vector<int> threadIds{};
298 int64_t durationNanos = 16666666L;
299 EXPECT_CALL(*mMockHal.get(),
300 createHintSession(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos), _))
301 .Times(Exactly(1))
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700302 .WillOnce(Return(testing::ByMove(
303 ndk::ScopedAStatus::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT))));
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800304 auto result = mWrapper->createHintSession(tgid, uid, threadIds, durationNanos);
305 ASSERT_TRUE(result.isFailed());
306}
307
308TEST_F(PowerHalWrapperAidlTest, TestGetHintSessionPreferredRate) {
Xiang Wang99f6f3c2023-05-22 13:12:16 -0700309 EXPECT_CALL(*mMockHal.get(), getHintSessionPreferredRate(_))
310 .Times(Exactly(1))
311 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
Jimmy Shiu0b264bb2021-03-03 00:30:50 +0800312 auto result = mWrapper->getHintSessionPreferredRate();
313 ASSERT_TRUE(result.isOk());
314 int64_t rate = result.value();
315 ASSERT_GE(0, rate);
316}
Matt Buckleydb4192a2023-12-21 20:00:32 +0000317
318TEST_F(PowerHalWrapperAidlTest, TestSessionChannel) {
319 int32_t tgid = 999;
320 int32_t uid = 1001;
321 EXPECT_CALL(*mMockHal.get(), getSessionChannel(Eq(tgid), Eq(uid), _))
322 .Times(Exactly(1))
323 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
324 EXPECT_CALL(*mMockHal.get(), closeSessionChannel(Eq(tgid), Eq(uid)))
325 .Times(Exactly(1))
326 .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
327 auto createResult = mWrapper->getSessionChannel(tgid, uid);
328 ASSERT_TRUE(createResult.isOk());
329 auto closeResult = mWrapper->closeSessionChannel(tgid, uid);
330 ASSERT_TRUE(closeResult.isOk());
331}
Matt Buckley6c18e6d2024-02-07 23:39:50 +0000332
333TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionWithConfigUnsupported) {
334 std::vector<int> threadIds{gettid()};
335 int32_t tgid = 999;
336 int32_t uid = 1001;
337 int64_t durationNanos = 16666666L;
338 SessionTag tag = SessionTag::OTHER;
339 SessionConfig out;
340 EXPECT_CALL(*mMockHal.get(),
341 createHintSessionWithConfig(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos),
342 Eq(tag), _, _))
343 .Times(1)
344 .WillOnce(Return(testing::ByMove(
345 ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))));
346 auto result =
347 mWrapper->createHintSessionWithConfig(tgid, uid, threadIds, durationNanos, tag, &out);
348 ASSERT_TRUE(result.isUnsupported());
349 Mock::VerifyAndClearExpectations(mMockHal.get());
350 EXPECT_CALL(*mMockHal.get(),
351 createHintSessionWithConfig(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos),
352 Eq(tag), _, _))
353 .WillOnce(Return(
354 testing::ByMove(ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION))));
355 result = mWrapper->createHintSessionWithConfig(tgid, uid, threadIds, durationNanos, tag, &out);
356 ASSERT_TRUE(result.isUnsupported());
357}