blob: 7743fa4363d58089073e51cd2661f5fb38eec38c [file] [log] [blame]
/*
* Copyright (C) 2024 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <aidl/android/hardware/power/IPowerHintSession.h>
#include <powermanager/PowerHintSessionWrapper.h>
#include <gmock/gmock.h>
#include <gtest/gtest.h>
using aidl::android::hardware::power::IPowerHintSession;
using android::power::PowerHintSessionWrapper;
using namespace android;
using namespace std::chrono_literals;
using namespace testing;
class MockIPowerHintSession : public IPowerHintSession {
public:
MockIPowerHintSession() = default;
MOCK_METHOD(::ndk::ScopedAStatus, updateTargetWorkDuration, (int64_t in_targetDurationNanos),
(override));
MOCK_METHOD(::ndk::ScopedAStatus, reportActualWorkDuration,
(const std::vector<::aidl::android::hardware::power::WorkDuration>& in_durations),
(override));
MOCK_METHOD(::ndk::ScopedAStatus, pause, (), (override));
MOCK_METHOD(::ndk::ScopedAStatus, resume, (), (override));
MOCK_METHOD(::ndk::ScopedAStatus, close, (), (override));
MOCK_METHOD(::ndk::ScopedAStatus, sendHint,
(::aidl::android::hardware::power::SessionHint in_hint), (override));
MOCK_METHOD(::ndk::ScopedAStatus, setThreads, (const std::vector<int32_t>& in_threadIds),
(override));
MOCK_METHOD(::ndk::ScopedAStatus, setMode,
(::aidl::android::hardware::power::SessionMode in_type, bool in_enabled),
(override));
MOCK_METHOD(::ndk::ScopedAStatus, getSessionConfig,
(::aidl::android::hardware::power::SessionConfig * _aidl_return), (override));
MOCK_METHOD(::ndk::ScopedAStatus, getInterfaceVersion, (int32_t * _aidl_return), (override));
MOCK_METHOD(::ndk::ScopedAStatus, getInterfaceHash, (std::string * _aidl_return), (override));
MOCK_METHOD(::ndk::SpAIBinder, asBinder, (), (override));
MOCK_METHOD(bool, isRemote, (), (override));
};
class PowerHintSessionWrapperTest : public Test {
public:
void SetUp() override;
protected:
std::shared_ptr<NiceMock<MockIPowerHintSession>> mMockSession = nullptr;
std::unique_ptr<PowerHintSessionWrapper> mSession = nullptr;
};
void PowerHintSessionWrapperTest::SetUp() {
mMockSession = ndk::SharedRefBase::make<NiceMock<MockIPowerHintSession>>();
EXPECT_CALL(*mMockSession, getInterfaceVersion(_)).WillRepeatedly(([](int32_t* ret) {
*ret = 5;
return ndk::ScopedAStatus::ok();
}));
mSession = std::make_unique<PowerHintSessionWrapper>(mMockSession);
ASSERT_NE(nullptr, mSession);
}
TEST_F(PowerHintSessionWrapperTest, updateTargetWorkDuration) {
EXPECT_CALL(*mMockSession.get(), updateTargetWorkDuration(1000000000))
.WillOnce(Return(ndk::ScopedAStatus::ok()));
auto status = mSession->updateTargetWorkDuration(1000000000);
ASSERT_TRUE(status.isOk());
}
TEST_F(PowerHintSessionWrapperTest, reportActualWorkDuration) {
EXPECT_CALL(*mMockSession.get(),
reportActualWorkDuration(
std::vector<::aidl::android::hardware::power::WorkDuration>()))
.WillOnce(Return(ndk::ScopedAStatus::ok()));
auto status = mSession->reportActualWorkDuration(
std::vector<::aidl::android::hardware::power::WorkDuration>());
ASSERT_TRUE(status.isOk());
}
TEST_F(PowerHintSessionWrapperTest, pause) {
EXPECT_CALL(*mMockSession.get(), pause()).WillOnce(Return(ndk::ScopedAStatus::ok()));
auto status = mSession->pause();
ASSERT_TRUE(status.isOk());
}
TEST_F(PowerHintSessionWrapperTest, resume) {
EXPECT_CALL(*mMockSession.get(), resume()).WillOnce(Return(ndk::ScopedAStatus::ok()));
auto status = mSession->resume();
ASSERT_TRUE(status.isOk());
}
TEST_F(PowerHintSessionWrapperTest, close) {
EXPECT_CALL(*mMockSession.get(), close()).WillOnce(Return(ndk::ScopedAStatus::ok()));
auto status = mSession->close();
ASSERT_TRUE(status.isOk());
}
TEST_F(PowerHintSessionWrapperTest, sendHint) {
EXPECT_CALL(*mMockSession.get(),
sendHint(::aidl::android::hardware::power::SessionHint::CPU_LOAD_UP))
.WillOnce(Return(ndk::ScopedAStatus::ok()));
auto status = mSession->sendHint(::aidl::android::hardware::power::SessionHint::CPU_LOAD_UP);
ASSERT_TRUE(status.isOk());
}
TEST_F(PowerHintSessionWrapperTest, setThreads) {
EXPECT_CALL(*mMockSession.get(), setThreads(_)).WillOnce(Return(ndk::ScopedAStatus::ok()));
auto status = mSession->setThreads(std::vector<int32_t>{gettid()});
ASSERT_TRUE(status.isOk());
}
TEST_F(PowerHintSessionWrapperTest, setMode) {
EXPECT_CALL(*mMockSession.get(),
setMode(::aidl::android::hardware::power::SessionMode::POWER_EFFICIENCY, true))
.WillOnce(Return(ndk::ScopedAStatus::ok()));
auto status = mSession->setMode(::aidl::android::hardware::power::SessionMode::POWER_EFFICIENCY,
true);
ASSERT_TRUE(status.isOk());
}
TEST_F(PowerHintSessionWrapperTest, getSessionConfig) {
EXPECT_CALL(*mMockSession.get(), getSessionConfig(_))
.WillOnce(DoAll(SetArgPointee<0>(
aidl::android::hardware::power::SessionConfig{.id = 12L}),
Return(ndk::ScopedAStatus::ok())));
auto status = mSession->getSessionConfig();
ASSERT_TRUE(status.isOk());
}