xref: /aosp_15_r20/frameworks/native/services/powermanager/tests/PowerHintSessionWrapperTest.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2024 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 #include <aidl/android/hardware/power/IPowerHintSession.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <powermanager/PowerHintSessionWrapper.h>
19*38e8c45fSAndroid Build Coastguard Worker 
20*38e8c45fSAndroid Build Coastguard Worker #include <gmock/gmock.h>
21*38e8c45fSAndroid Build Coastguard Worker #include <gtest/gtest.h>
22*38e8c45fSAndroid Build Coastguard Worker 
23*38e8c45fSAndroid Build Coastguard Worker using aidl::android::hardware::power::IPowerHintSession;
24*38e8c45fSAndroid Build Coastguard Worker using android::power::PowerHintSessionWrapper;
25*38e8c45fSAndroid Build Coastguard Worker 
26*38e8c45fSAndroid Build Coastguard Worker using namespace android;
27*38e8c45fSAndroid Build Coastguard Worker using namespace std::chrono_literals;
28*38e8c45fSAndroid Build Coastguard Worker using namespace testing;
29*38e8c45fSAndroid Build Coastguard Worker 
30*38e8c45fSAndroid Build Coastguard Worker class MockIPowerHintSession : public IPowerHintSession {
31*38e8c45fSAndroid Build Coastguard Worker public:
32*38e8c45fSAndroid Build Coastguard Worker     MockIPowerHintSession() = default;
33*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::ScopedAStatus, updateTargetWorkDuration, (int64_t in_targetDurationNanos),
34*38e8c45fSAndroid Build Coastguard Worker                 (override));
35*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::ScopedAStatus, reportActualWorkDuration,
36*38e8c45fSAndroid Build Coastguard Worker                 (const std::vector<::aidl::android::hardware::power::WorkDuration>& in_durations),
37*38e8c45fSAndroid Build Coastguard Worker                 (override));
38*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::ScopedAStatus, pause, (), (override));
39*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::ScopedAStatus, resume, (), (override));
40*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::ScopedAStatus, close, (), (override));
41*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::ScopedAStatus, sendHint,
42*38e8c45fSAndroid Build Coastguard Worker                 (::aidl::android::hardware::power::SessionHint in_hint), (override));
43*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::ScopedAStatus, setThreads, (const std::vector<int32_t>& in_threadIds),
44*38e8c45fSAndroid Build Coastguard Worker                 (override));
45*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::ScopedAStatus, setMode,
46*38e8c45fSAndroid Build Coastguard Worker                 (::aidl::android::hardware::power::SessionMode in_type, bool in_enabled),
47*38e8c45fSAndroid Build Coastguard Worker                 (override));
48*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::ScopedAStatus, getSessionConfig,
49*38e8c45fSAndroid Build Coastguard Worker                 (::aidl::android::hardware::power::SessionConfig * _aidl_return), (override));
50*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::ScopedAStatus, getInterfaceVersion, (int32_t * _aidl_return), (override));
51*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::ScopedAStatus, getInterfaceHash, (std::string * _aidl_return), (override));
52*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(::ndk::SpAIBinder, asBinder, (), (override));
53*38e8c45fSAndroid Build Coastguard Worker     MOCK_METHOD(bool, isRemote, (), (override));
54*38e8c45fSAndroid Build Coastguard Worker };
55*38e8c45fSAndroid Build Coastguard Worker 
56*38e8c45fSAndroid Build Coastguard Worker class PowerHintSessionWrapperTest : public Test {
57*38e8c45fSAndroid Build Coastguard Worker public:
58*38e8c45fSAndroid Build Coastguard Worker     void SetUp() override;
59*38e8c45fSAndroid Build Coastguard Worker 
60*38e8c45fSAndroid Build Coastguard Worker protected:
61*38e8c45fSAndroid Build Coastguard Worker     std::shared_ptr<NiceMock<MockIPowerHintSession>> mMockSession = nullptr;
62*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<PowerHintSessionWrapper> mSession = nullptr;
63*38e8c45fSAndroid Build Coastguard Worker };
64*38e8c45fSAndroid Build Coastguard Worker 
SetUp()65*38e8c45fSAndroid Build Coastguard Worker void PowerHintSessionWrapperTest::SetUp() {
66*38e8c45fSAndroid Build Coastguard Worker     mMockSession = ndk::SharedRefBase::make<NiceMock<MockIPowerHintSession>>();
67*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mMockSession, getInterfaceVersion(_)).WillRepeatedly(([](int32_t* ret) {
68*38e8c45fSAndroid Build Coastguard Worker         *ret = 5;
69*38e8c45fSAndroid Build Coastguard Worker         return ndk::ScopedAStatus::ok();
70*38e8c45fSAndroid Build Coastguard Worker     }));
71*38e8c45fSAndroid Build Coastguard Worker     mSession = std::make_unique<PowerHintSessionWrapper>(mMockSession);
72*38e8c45fSAndroid Build Coastguard Worker     ASSERT_NE(nullptr, mSession);
73*38e8c45fSAndroid Build Coastguard Worker }
74*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(PowerHintSessionWrapperTest,updateTargetWorkDuration)75*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHintSessionWrapperTest, updateTargetWorkDuration) {
76*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mMockSession.get(), updateTargetWorkDuration(1000000000))
77*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(Return(ndk::ScopedAStatus::ok()));
78*38e8c45fSAndroid Build Coastguard Worker     auto status = mSession->updateTargetWorkDuration(1000000000);
79*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(status.isOk());
80*38e8c45fSAndroid Build Coastguard Worker }
81*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(PowerHintSessionWrapperTest,reportActualWorkDuration)82*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHintSessionWrapperTest, reportActualWorkDuration) {
83*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mMockSession.get(),
84*38e8c45fSAndroid Build Coastguard Worker                 reportActualWorkDuration(
85*38e8c45fSAndroid Build Coastguard Worker                         std::vector<::aidl::android::hardware::power::WorkDuration>()))
86*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(Return(ndk::ScopedAStatus::ok()));
87*38e8c45fSAndroid Build Coastguard Worker     auto status = mSession->reportActualWorkDuration(
88*38e8c45fSAndroid Build Coastguard Worker             std::vector<::aidl::android::hardware::power::WorkDuration>());
89*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(status.isOk());
90*38e8c45fSAndroid Build Coastguard Worker }
91*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(PowerHintSessionWrapperTest,pause)92*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHintSessionWrapperTest, pause) {
93*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mMockSession.get(), pause()).WillOnce(Return(ndk::ScopedAStatus::ok()));
94*38e8c45fSAndroid Build Coastguard Worker     auto status = mSession->pause();
95*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(status.isOk());
96*38e8c45fSAndroid Build Coastguard Worker }
97*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(PowerHintSessionWrapperTest,resume)98*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHintSessionWrapperTest, resume) {
99*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mMockSession.get(), resume()).WillOnce(Return(ndk::ScopedAStatus::ok()));
100*38e8c45fSAndroid Build Coastguard Worker     auto status = mSession->resume();
101*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(status.isOk());
102*38e8c45fSAndroid Build Coastguard Worker }
103*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(PowerHintSessionWrapperTest,close)104*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHintSessionWrapperTest, close) {
105*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mMockSession.get(), close()).WillOnce(Return(ndk::ScopedAStatus::ok()));
106*38e8c45fSAndroid Build Coastguard Worker     auto status = mSession->close();
107*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(status.isOk());
108*38e8c45fSAndroid Build Coastguard Worker }
109*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(PowerHintSessionWrapperTest,sendHint)110*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHintSessionWrapperTest, sendHint) {
111*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mMockSession.get(),
112*38e8c45fSAndroid Build Coastguard Worker                 sendHint(::aidl::android::hardware::power::SessionHint::CPU_LOAD_UP))
113*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(Return(ndk::ScopedAStatus::ok()));
114*38e8c45fSAndroid Build Coastguard Worker     auto status = mSession->sendHint(::aidl::android::hardware::power::SessionHint::CPU_LOAD_UP);
115*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(status.isOk());
116*38e8c45fSAndroid Build Coastguard Worker }
117*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(PowerHintSessionWrapperTest,setThreads)118*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHintSessionWrapperTest, setThreads) {
119*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mMockSession.get(), setThreads(_)).WillOnce(Return(ndk::ScopedAStatus::ok()));
120*38e8c45fSAndroid Build Coastguard Worker     auto status = mSession->setThreads(std::vector<int32_t>{gettid()});
121*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(status.isOk());
122*38e8c45fSAndroid Build Coastguard Worker }
123*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(PowerHintSessionWrapperTest,setMode)124*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHintSessionWrapperTest, setMode) {
125*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mMockSession.get(),
126*38e8c45fSAndroid Build Coastguard Worker                 setMode(::aidl::android::hardware::power::SessionMode::POWER_EFFICIENCY, true))
127*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(Return(ndk::ScopedAStatus::ok()));
128*38e8c45fSAndroid Build Coastguard Worker     auto status = mSession->setMode(::aidl::android::hardware::power::SessionMode::POWER_EFFICIENCY,
129*38e8c45fSAndroid Build Coastguard Worker                                     true);
130*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(status.isOk());
131*38e8c45fSAndroid Build Coastguard Worker }
132*38e8c45fSAndroid Build Coastguard Worker 
TEST_F(PowerHintSessionWrapperTest,getSessionConfig)133*38e8c45fSAndroid Build Coastguard Worker TEST_F(PowerHintSessionWrapperTest, getSessionConfig) {
134*38e8c45fSAndroid Build Coastguard Worker     EXPECT_CALL(*mMockSession.get(), getSessionConfig(_))
135*38e8c45fSAndroid Build Coastguard Worker             .WillOnce(DoAll(SetArgPointee<0>(
136*38e8c45fSAndroid Build Coastguard Worker                                     aidl::android::hardware::power::SessionConfig{.id = 12L}),
137*38e8c45fSAndroid Build Coastguard Worker                             Return(ndk::ScopedAStatus::ok())));
138*38e8c45fSAndroid Build Coastguard Worker     auto status = mSession->getSessionConfig();
139*38e8c45fSAndroid Build Coastguard Worker     ASSERT_TRUE(status.isOk());
140*38e8c45fSAndroid Build Coastguard Worker }
141