1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2020 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #define LOG_TAG "PowerHalWrapperAidlTest"
18*38e8c45fSAndroid Build Coastguard Worker
19*38e8c45fSAndroid Build Coastguard Worker #include <aidl/android/hardware/power/Boost.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <aidl/android/hardware/power/IPowerHintSession.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <aidl/android/hardware/power/Mode.h>
22*38e8c45fSAndroid Build Coastguard Worker #include <binder/IServiceManager.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <gmock/gmock.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
25*38e8c45fSAndroid Build Coastguard Worker #include <powermanager/PowerHalWrapper.h>
26*38e8c45fSAndroid Build Coastguard Worker #include <utils/Log.h>
27*38e8c45fSAndroid Build Coastguard Worker
28*38e8c45fSAndroid Build Coastguard Worker #include <unistd.h>
29*38e8c45fSAndroid Build Coastguard Worker #include <thread>
30*38e8c45fSAndroid Build Coastguard Worker
31*38e8c45fSAndroid Build Coastguard Worker
32*38e8c45fSAndroid Build Coastguard Worker using android::binder::Status;
33*38e8c45fSAndroid Build Coastguard Worker
34*38e8c45fSAndroid Build Coastguard Worker using namespace aidl::android::hardware::power;
35*38e8c45fSAndroid Build Coastguard Worker using namespace android;
36*38e8c45fSAndroid Build Coastguard Worker using namespace android::power;
37*38e8c45fSAndroid Build Coastguard Worker using namespace std::chrono_literals;
38*38e8c45fSAndroid Build Coastguard Worker using namespace testing;
39*38e8c45fSAndroid Build Coastguard Worker
40*38e8c45fSAndroid Build Coastguard Worker // -------------------------------------------------------------------------------------------------
41*38e8c45fSAndroid Build Coastguard Worker
42*38e8c45fSAndroid Build Coastguard Worker class MockIPower : public IPower {
43*38e8c45fSAndroid Build Coastguard Worker public:
44*38e8c45fSAndroid Build Coastguard Worker MockIPower() = default;
45*38e8c45fSAndroid Build Coastguard Worker
46*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, isBoostSupported, (Boost boost, bool* ret), (override));
47*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, setBoost, (Boost boost, int32_t durationMs), (override));
48*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, isModeSupported, (Mode mode, bool* ret), (override));
49*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, setMode, (Mode mode, bool enabled), (override));
50*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, createHintSession,
51*38e8c45fSAndroid Build Coastguard Worker (int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds,
52*38e8c45fSAndroid Build Coastguard Worker int64_t durationNanos, std::shared_ptr<IPowerHintSession>* session),
53*38e8c45fSAndroid Build Coastguard Worker (override));
54*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, createHintSessionWithConfig,
55*38e8c45fSAndroid Build Coastguard Worker (int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds,
56*38e8c45fSAndroid Build Coastguard Worker int64_t durationNanos, SessionTag tag, SessionConfig* config,
57*38e8c45fSAndroid Build Coastguard Worker std::shared_ptr<IPowerHintSession>* _aidl_return),
58*38e8c45fSAndroid Build Coastguard Worker (override));
59*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, getSessionChannel,
60*38e8c45fSAndroid Build Coastguard Worker (int32_t tgid, int32_t uid, ChannelConfig* _aidl_return), (override));
61*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, closeSessionChannel, (int32_t tgid, int32_t uid), (override));
62*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, getHintSessionPreferredRate, (int64_t * rate), (override));
63*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, getSupportInfo, (SupportInfo * _aidl_return), (override));
64*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, getInterfaceVersion, (int32_t * version), (override));
65*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, getInterfaceHash, (std::string * hash), (override));
66*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::SpAIBinder, asBinder, (), (override));
67*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(bool, isRemote, (), (override));
68*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, getCpuHeadroom,
69*38e8c45fSAndroid Build Coastguard Worker (const CpuHeadroomParams& params, CpuHeadroomResult* headroom), (override));
70*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, getGpuHeadroom,
71*38e8c45fSAndroid Build Coastguard Worker (const GpuHeadroomParams& params, GpuHeadroomResult* headroom), (override));
72*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, sendCompositionData,
73*38e8c45fSAndroid Build Coastguard Worker (const std::vector<CompositionData>& in_data), (override));
74*38e8c45fSAndroid Build Coastguard Worker MOCK_METHOD(ndk::ScopedAStatus, sendCompositionUpdate,
75*38e8c45fSAndroid Build Coastguard Worker (const CompositionUpdate& in_update), (override));
76*38e8c45fSAndroid Build Coastguard Worker };
77*38e8c45fSAndroid Build Coastguard Worker
78*38e8c45fSAndroid Build Coastguard Worker // -------------------------------------------------------------------------------------------------
79*38e8c45fSAndroid Build Coastguard Worker
80*38e8c45fSAndroid Build Coastguard Worker class PowerHalWrapperAidlTest : public Test {
81*38e8c45fSAndroid Build Coastguard Worker public:
82*38e8c45fSAndroid Build Coastguard Worker void SetUp() override;
83*38e8c45fSAndroid Build Coastguard Worker
84*38e8c45fSAndroid Build Coastguard Worker protected:
85*38e8c45fSAndroid Build Coastguard Worker std::unique_ptr<HalWrapper> mWrapper = nullptr;
86*38e8c45fSAndroid Build Coastguard Worker std::shared_ptr<StrictMock<MockIPower>> mMockHal = nullptr;
87*38e8c45fSAndroid Build Coastguard Worker };
88*38e8c45fSAndroid Build Coastguard Worker
89*38e8c45fSAndroid Build Coastguard Worker // -------------------------------------------------------------------------------------------------
90*38e8c45fSAndroid Build Coastguard Worker
SetUp()91*38e8c45fSAndroid Build Coastguard Worker void PowerHalWrapperAidlTest::SetUp() {
92*38e8c45fSAndroid Build Coastguard Worker mMockHal = ndk::SharedRefBase::make<StrictMock<MockIPower>>();
93*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal, getInterfaceVersion(_)).WillRepeatedly(([](int32_t* ret) {
94*38e8c45fSAndroid Build Coastguard Worker *ret = 5;
95*38e8c45fSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
96*38e8c45fSAndroid Build Coastguard Worker }));
97*38e8c45fSAndroid Build Coastguard Worker mWrapper = std::make_unique<AidlHalWrapper>(mMockHal);
98*38e8c45fSAndroid Build Coastguard Worker ASSERT_NE(nullptr, mWrapper);
99*38e8c45fSAndroid Build Coastguard Worker }
100*38e8c45fSAndroid Build Coastguard Worker
101*38e8c45fSAndroid Build Coastguard Worker // -------------------------------------------------------------------------------------------------
102*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestSetBoostSuccessful)103*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestSetBoostSuccessful) {
104*38e8c45fSAndroid Build Coastguard Worker {
105*38e8c45fSAndroid Build Coastguard Worker InSequence seq;
106*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::DISPLAY_UPDATE_IMMINENT), _))
107*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
108*38e8c45fSAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(true),
109*38e8c45fSAndroid Build Coastguard Worker Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
110*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), setBoost(Eq(Boost::DISPLAY_UPDATE_IMMINENT), Eq(100)))
111*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
112*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
113*38e8c45fSAndroid Build Coastguard Worker }
114*38e8c45fSAndroid Build Coastguard Worker
115*38e8c45fSAndroid Build Coastguard Worker auto result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 100);
116*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isOk());
117*38e8c45fSAndroid Build Coastguard Worker }
118*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestSetBoostFailed)119*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestSetBoostFailed) {
120*38e8c45fSAndroid Build Coastguard Worker {
121*38e8c45fSAndroid Build Coastguard Worker InSequence seq;
122*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::INTERACTION), _))
123*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
124*38e8c45fSAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(true),
125*38e8c45fSAndroid Build Coastguard Worker Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
126*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), setBoost(Eq(Boost::INTERACTION), Eq(100)))
127*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
128*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
129*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::DISPLAY_UPDATE_IMMINENT), _))
130*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
131*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
132*38e8c45fSAndroid Build Coastguard Worker }
133*38e8c45fSAndroid Build Coastguard Worker
134*38e8c45fSAndroid Build Coastguard Worker auto result = mWrapper->setBoost(Boost::INTERACTION, 100);
135*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isFailed());
136*38e8c45fSAndroid Build Coastguard Worker result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 1000);
137*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isFailed());
138*38e8c45fSAndroid Build Coastguard Worker }
139*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestSetBoostUnsupported)140*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestSetBoostUnsupported) {
141*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), isBoostSupported(_, _))
142*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(2))
143*38e8c45fSAndroid Build Coastguard Worker .WillRepeatedly([](Boost, bool* ret) {
144*38e8c45fSAndroid Build Coastguard Worker *ret = false;
145*38e8c45fSAndroid Build Coastguard Worker return ndk::ScopedAStatus::ok();
146*38e8c45fSAndroid Build Coastguard Worker });
147*38e8c45fSAndroid Build Coastguard Worker
148*38e8c45fSAndroid Build Coastguard Worker auto result = mWrapper->setBoost(Boost::INTERACTION, 1000);
149*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isUnsupported());
150*38e8c45fSAndroid Build Coastguard Worker result = mWrapper->setBoost(Boost::CAMERA_SHOT, 10);
151*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isUnsupported());
152*38e8c45fSAndroid Build Coastguard Worker }
153*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestSetBoostMultiThreadCheckSupportedOnlyOnce)154*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestSetBoostMultiThreadCheckSupportedOnlyOnce) {
155*38e8c45fSAndroid Build Coastguard Worker {
156*38e8c45fSAndroid Build Coastguard Worker InSequence seq;
157*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), isBoostSupported(Eq(Boost::INTERACTION), _))
158*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
159*38e8c45fSAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(true),
160*38e8c45fSAndroid Build Coastguard Worker Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
161*38e8c45fSAndroid Build Coastguard Worker auto& exp = EXPECT_CALL(*mMockHal.get(), setBoost(Eq(Boost::INTERACTION), Eq(100)))
162*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(10));
163*38e8c45fSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
164*38e8c45fSAndroid Build Coastguard Worker exp.WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
165*38e8c45fSAndroid Build Coastguard Worker }
166*38e8c45fSAndroid Build Coastguard Worker }
167*38e8c45fSAndroid Build Coastguard Worker
168*38e8c45fSAndroid Build Coastguard Worker std::vector<std::thread> threads;
169*38e8c45fSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
170*38e8c45fSAndroid Build Coastguard Worker threads.push_back(std::thread([&]() {
171*38e8c45fSAndroid Build Coastguard Worker auto result = mWrapper->setBoost(Boost::INTERACTION, 100);
172*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isOk());
173*38e8c45fSAndroid Build Coastguard Worker }));
174*38e8c45fSAndroid Build Coastguard Worker }
175*38e8c45fSAndroid Build Coastguard Worker std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); });
176*38e8c45fSAndroid Build Coastguard Worker }
177*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestSetModeSuccessful)178*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestSetModeSuccessful) {
179*38e8c45fSAndroid Build Coastguard Worker {
180*38e8c45fSAndroid Build Coastguard Worker InSequence seq;
181*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::DISPLAY_INACTIVE), _))
182*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
183*38e8c45fSAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(true),
184*38e8c45fSAndroid Build Coastguard Worker Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
185*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), setMode(Eq(Mode::DISPLAY_INACTIVE), Eq(false)))
186*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
187*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
188*38e8c45fSAndroid Build Coastguard Worker }
189*38e8c45fSAndroid Build Coastguard Worker
190*38e8c45fSAndroid Build Coastguard Worker auto result = mWrapper->setMode(Mode::DISPLAY_INACTIVE, false);
191*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isOk());
192*38e8c45fSAndroid Build Coastguard Worker }
193*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestSetModeFailed)194*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestSetModeFailed) {
195*38e8c45fSAndroid Build Coastguard Worker {
196*38e8c45fSAndroid Build Coastguard Worker InSequence seq;
197*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::LAUNCH), _))
198*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
199*38e8c45fSAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(true),
200*38e8c45fSAndroid Build Coastguard Worker Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
201*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), setMode(Eq(Mode::LAUNCH), Eq(true)))
202*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
203*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
204*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::DISPLAY_INACTIVE), _))
205*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
206*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::fromExceptionCode(-1))));
207*38e8c45fSAndroid Build Coastguard Worker }
208*38e8c45fSAndroid Build Coastguard Worker
209*38e8c45fSAndroid Build Coastguard Worker auto result = mWrapper->setMode(Mode::LAUNCH, true);
210*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isFailed());
211*38e8c45fSAndroid Build Coastguard Worker result = mWrapper->setMode(Mode::DISPLAY_INACTIVE, false);
212*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isFailed());
213*38e8c45fSAndroid Build Coastguard Worker }
214*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestSetModeUnsupported)215*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestSetModeUnsupported) {
216*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::LAUNCH), _))
217*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
218*38e8c45fSAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(false),
219*38e8c45fSAndroid Build Coastguard Worker Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
220*38e8c45fSAndroid Build Coastguard Worker
221*38e8c45fSAndroid Build Coastguard Worker auto result = mWrapper->setMode(Mode::LAUNCH, true);
222*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isUnsupported());
223*38e8c45fSAndroid Build Coastguard Worker
224*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::CAMERA_STREAMING_HIGH), _))
225*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
226*38e8c45fSAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(false),
227*38e8c45fSAndroid Build Coastguard Worker Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
228*38e8c45fSAndroid Build Coastguard Worker result = mWrapper->setMode(Mode::CAMERA_STREAMING_HIGH, true);
229*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isUnsupported());
230*38e8c45fSAndroid Build Coastguard Worker }
231*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestSetModeMultiThreadCheckSupportedOnlyOnce)232*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestSetModeMultiThreadCheckSupportedOnlyOnce) {
233*38e8c45fSAndroid Build Coastguard Worker {
234*38e8c45fSAndroid Build Coastguard Worker InSequence seq;
235*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), isModeSupported(Eq(Mode::LAUNCH), _))
236*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
237*38e8c45fSAndroid Build Coastguard Worker .WillOnce(DoAll(SetArgPointee<1>(true),
238*38e8c45fSAndroid Build Coastguard Worker Return(testing::ByMove(ndk::ScopedAStatus::ok()))));
239*38e8c45fSAndroid Build Coastguard Worker auto& exp = EXPECT_CALL(*mMockHal.get(), setMode(Eq(Mode::LAUNCH), Eq(false)))
240*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(10));
241*38e8c45fSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
242*38e8c45fSAndroid Build Coastguard Worker exp.WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
243*38e8c45fSAndroid Build Coastguard Worker }
244*38e8c45fSAndroid Build Coastguard Worker }
245*38e8c45fSAndroid Build Coastguard Worker
246*38e8c45fSAndroid Build Coastguard Worker std::vector<std::thread> threads;
247*38e8c45fSAndroid Build Coastguard Worker for (int i = 0; i < 10; i++) {
248*38e8c45fSAndroid Build Coastguard Worker threads.push_back(std::thread([&]() {
249*38e8c45fSAndroid Build Coastguard Worker auto result = mWrapper->setMode(Mode::LAUNCH, false);
250*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isOk());
251*38e8c45fSAndroid Build Coastguard Worker }));
252*38e8c45fSAndroid Build Coastguard Worker }
253*38e8c45fSAndroid Build Coastguard Worker std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); });
254*38e8c45fSAndroid Build Coastguard Worker }
255*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestCreateHintSessionSuccessful)256*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionSuccessful) {
257*38e8c45fSAndroid Build Coastguard Worker std::vector<int> threadIds{gettid()};
258*38e8c45fSAndroid Build Coastguard Worker int32_t tgid = 999;
259*38e8c45fSAndroid Build Coastguard Worker int32_t uid = 1001;
260*38e8c45fSAndroid Build Coastguard Worker int64_t durationNanos = 16666666L;
261*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(),
262*38e8c45fSAndroid Build Coastguard Worker createHintSession(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos), _))
263*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
264*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
265*38e8c45fSAndroid Build Coastguard Worker auto result = mWrapper->createHintSession(tgid, uid, threadIds, durationNanos);
266*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isOk());
267*38e8c45fSAndroid Build Coastguard Worker }
268*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestCreateHintSessionWithConfigSuccessful)269*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionWithConfigSuccessful) {
270*38e8c45fSAndroid Build Coastguard Worker std::vector<int> threadIds{gettid()};
271*38e8c45fSAndroid Build Coastguard Worker int32_t tgid = 999;
272*38e8c45fSAndroid Build Coastguard Worker int32_t uid = 1001;
273*38e8c45fSAndroid Build Coastguard Worker int64_t durationNanos = 16666666L;
274*38e8c45fSAndroid Build Coastguard Worker SessionTag tag = SessionTag::OTHER;
275*38e8c45fSAndroid Build Coastguard Worker SessionConfig out;
276*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(),
277*38e8c45fSAndroid Build Coastguard Worker createHintSessionWithConfig(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos),
278*38e8c45fSAndroid Build Coastguard Worker Eq(tag), _, _))
279*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
280*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
281*38e8c45fSAndroid Build Coastguard Worker auto result =
282*38e8c45fSAndroid Build Coastguard Worker mWrapper->createHintSessionWithConfig(tgid, uid, threadIds, durationNanos, tag, &out);
283*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isOk());
284*38e8c45fSAndroid Build Coastguard Worker }
285*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestCreateHintSessionFailed)286*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionFailed) {
287*38e8c45fSAndroid Build Coastguard Worker int32_t tgid = 999;
288*38e8c45fSAndroid Build Coastguard Worker int32_t uid = 1001;
289*38e8c45fSAndroid Build Coastguard Worker std::vector<int> threadIds{};
290*38e8c45fSAndroid Build Coastguard Worker int64_t durationNanos = 16666666L;
291*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(),
292*38e8c45fSAndroid Build Coastguard Worker createHintSession(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos), _))
293*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
294*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(
295*38e8c45fSAndroid Build Coastguard Worker ndk::ScopedAStatus::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT))));
296*38e8c45fSAndroid Build Coastguard Worker auto result = mWrapper->createHintSession(tgid, uid, threadIds, durationNanos);
297*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isFailed());
298*38e8c45fSAndroid Build Coastguard Worker }
299*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestGetHintSessionPreferredRate)300*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestGetHintSessionPreferredRate) {
301*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), getHintSessionPreferredRate(_))
302*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
303*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
304*38e8c45fSAndroid Build Coastguard Worker auto result = mWrapper->getHintSessionPreferredRate();
305*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isOk());
306*38e8c45fSAndroid Build Coastguard Worker int64_t rate = result.value();
307*38e8c45fSAndroid Build Coastguard Worker ASSERT_GE(0, rate);
308*38e8c45fSAndroid Build Coastguard Worker }
309*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestSessionChannel)310*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestSessionChannel) {
311*38e8c45fSAndroid Build Coastguard Worker int32_t tgid = 999;
312*38e8c45fSAndroid Build Coastguard Worker int32_t uid = 1001;
313*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), getSessionChannel(Eq(tgid), Eq(uid), _))
314*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
315*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
316*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(), closeSessionChannel(Eq(tgid), Eq(uid)))
317*38e8c45fSAndroid Build Coastguard Worker .Times(Exactly(1))
318*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(ndk::ScopedAStatus::ok())));
319*38e8c45fSAndroid Build Coastguard Worker auto createResult = mWrapper->getSessionChannel(tgid, uid);
320*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(createResult.isOk());
321*38e8c45fSAndroid Build Coastguard Worker auto closeResult = mWrapper->closeSessionChannel(tgid, uid);
322*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(closeResult.isOk());
323*38e8c45fSAndroid Build Coastguard Worker }
324*38e8c45fSAndroid Build Coastguard Worker
TEST_F(PowerHalWrapperAidlTest,TestCreateHintSessionWithConfigUnsupported)325*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionWithConfigUnsupported) {
326*38e8c45fSAndroid Build Coastguard Worker std::vector<int> threadIds{gettid()};
327*38e8c45fSAndroid Build Coastguard Worker int32_t tgid = 999;
328*38e8c45fSAndroid Build Coastguard Worker int32_t uid = 1001;
329*38e8c45fSAndroid Build Coastguard Worker int64_t durationNanos = 16666666L;
330*38e8c45fSAndroid Build Coastguard Worker SessionTag tag = SessionTag::OTHER;
331*38e8c45fSAndroid Build Coastguard Worker SessionConfig out;
332*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(),
333*38e8c45fSAndroid Build Coastguard Worker createHintSessionWithConfig(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos),
334*38e8c45fSAndroid Build Coastguard Worker Eq(tag), _, _))
335*38e8c45fSAndroid Build Coastguard Worker .Times(1)
336*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(testing::ByMove(
337*38e8c45fSAndroid Build Coastguard Worker ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))));
338*38e8c45fSAndroid Build Coastguard Worker auto result =
339*38e8c45fSAndroid Build Coastguard Worker mWrapper->createHintSessionWithConfig(tgid, uid, threadIds, durationNanos, tag, &out);
340*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isUnsupported());
341*38e8c45fSAndroid Build Coastguard Worker Mock::VerifyAndClearExpectations(mMockHal.get());
342*38e8c45fSAndroid Build Coastguard Worker EXPECT_CALL(*mMockHal.get(),
343*38e8c45fSAndroid Build Coastguard Worker createHintSessionWithConfig(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos),
344*38e8c45fSAndroid Build Coastguard Worker Eq(tag), _, _))
345*38e8c45fSAndroid Build Coastguard Worker .WillOnce(Return(
346*38e8c45fSAndroid Build Coastguard Worker testing::ByMove(ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION))));
347*38e8c45fSAndroid Build Coastguard Worker result = mWrapper->createHintSessionWithConfig(tgid, uid, threadIds, durationNanos, tag, &out);
348*38e8c45fSAndroid Build Coastguard Worker ASSERT_TRUE(result.isUnsupported());
349*38e8c45fSAndroid Build Coastguard Worker }
350