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