diff options
author | 2022-09-01 21:17:15 +0000 | |
---|---|---|
committer | 2022-10-13 00:18:19 +0000 | |
commit | c3894a4df8d8362fe5b1ccb9ee0ddb6ead046003 (patch) | |
tree | 147006b58f8e2411d9251eac97201901a41bfd39 | |
parent | cf1fb689002563d03d3f72e434caa357f3a6dfff (diff) |
Extend PowerHalWrapper to support HIDL 1.2 and 1.3
* Added support for 1.2 and 1.3 HIDL calls to the PowerHalWrapper
* Expanded the wrapper and loader tests to cover these new versions
* Lightly tweaked the existing tests to make them more comprehensive
Bug: b/244631171
Test: atest libpowermanager_test
Change-Id: I5890106817b7cf243cdd21b3acf22ff7fcd8174e
-rw-r--r-- | include/powermanager/PowerHalLoader.h | 6 | ||||
-rw-r--r-- | include/powermanager/PowerHalWrapper.h | 45 | ||||
-rw-r--r-- | services/powermanager/Android.bp | 2 | ||||
-rw-r--r-- | services/powermanager/PowerHalController.cpp | 20 | ||||
-rw-r--r-- | services/powermanager/PowerHalLoader.cpp | 20 | ||||
-rw-r--r-- | services/powermanager/PowerHalWrapper.cpp | 73 | ||||
-rw-r--r-- | services/powermanager/benchmarks/Android.bp | 2 | ||||
-rw-r--r-- | services/powermanager/tests/Android.bp | 4 | ||||
-rw-r--r-- | services/powermanager/tests/PowerHalLoaderTest.cpp | 14 | ||||
-rw-r--r-- | services/powermanager/tests/PowerHalWrapperHidlV1_0Test.cpp | 28 | ||||
-rw-r--r-- | services/powermanager/tests/PowerHalWrapperHidlV1_1Test.cpp | 56 | ||||
-rw-r--r-- | services/powermanager/tests/PowerHalWrapperHidlV1_2Test.cpp | 200 | ||||
-rw-r--r-- | services/powermanager/tests/PowerHalWrapperHidlV1_3Test.cpp | 210 |
13 files changed, 620 insertions, 60 deletions
diff --git a/include/powermanager/PowerHalLoader.h b/include/powermanager/PowerHalLoader.h index ed6f6f35f5..e0384f31db 100644 --- a/include/powermanager/PowerHalLoader.h +++ b/include/powermanager/PowerHalLoader.h @@ -19,6 +19,8 @@ #include <android-base/thread_annotations.h> #include <android/hardware/power/1.1/IPower.h> +#include <android/hardware/power/1.2/IPower.h> +#include <android/hardware/power/1.3/IPower.h> #include <android/hardware/power/IPower.h> namespace android { @@ -32,12 +34,16 @@ public: static sp<hardware::power::IPower> loadAidl(); static sp<hardware::power::V1_0::IPower> loadHidlV1_0(); static sp<hardware::power::V1_1::IPower> loadHidlV1_1(); + static sp<hardware::power::V1_2::IPower> loadHidlV1_2(); + static sp<hardware::power::V1_3::IPower> loadHidlV1_3(); private: static std::mutex gHalMutex; static sp<hardware::power::IPower> gHalAidl GUARDED_BY(gHalMutex); static sp<hardware::power::V1_0::IPower> gHalHidlV1_0 GUARDED_BY(gHalMutex); static sp<hardware::power::V1_1::IPower> gHalHidlV1_1 GUARDED_BY(gHalMutex); + static sp<hardware::power::V1_2::IPower> gHalHidlV1_2 GUARDED_BY(gHalMutex); + static sp<hardware::power::V1_3::IPower> gHalHidlV1_3 GUARDED_BY(gHalMutex); static sp<hardware::power::V1_0::IPower> loadHidlV1_0Locked() EXCLUSIVE_LOCKS_REQUIRED(gHalMutex); diff --git a/include/powermanager/PowerHalWrapper.h b/include/powermanager/PowerHalWrapper.h index dfb0ff59a0..8028aa86e1 100644 --- a/include/powermanager/PowerHalWrapper.h +++ b/include/powermanager/PowerHalWrapper.h @@ -19,6 +19,8 @@ #include <android-base/thread_annotations.h> #include <android/hardware/power/1.1/IPower.h> +#include <android/hardware/power/1.2/IPower.h> +#include <android/hardware/power/1.3/IPower.h> #include <android/hardware/power/Boost.h> #include <android/hardware/power/IPower.h> #include <android/hardware/power/IPowerHintSession.h> @@ -142,8 +144,8 @@ public: // Wrapper for the HIDL Power HAL v1.0. class HidlHalWrapperV1_0 : public HalWrapper { public: - explicit HidlHalWrapperV1_0(sp<hardware::power::V1_0::IPower> Hal) - : mHandleV1_0(std::move(Hal)) {} + explicit HidlHalWrapperV1_0(sp<hardware::power::V1_0::IPower> handleV1_0) + : mHandleV1_0(std::move(handleV1_0)) {} virtual ~HidlHalWrapperV1_0() = default; virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; @@ -154,10 +156,10 @@ public: virtual HalResult<int64_t> getHintSessionPreferredRate() override; protected: - virtual HalResult<void> sendPowerHint(hardware::power::V1_0::PowerHint hintId, uint32_t data); + const sp<hardware::power::V1_0::IPower> mHandleV1_0; + virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data); private: - sp<hardware::power::V1_0::IPower> mHandleV1_0; HalResult<void> setInteractive(bool enabled); HalResult<void> setFeature(hardware::power::V1_0::Feature feature, bool enabled); }; @@ -165,17 +167,40 @@ private: // Wrapper for the HIDL Power HAL v1.1. class HidlHalWrapperV1_1 : public HidlHalWrapperV1_0 { public: - HidlHalWrapperV1_1(sp<hardware::power::V1_0::IPower> handleV1_0, - sp<hardware::power::V1_1::IPower> handleV1_1) - : HidlHalWrapperV1_0(std::move(handleV1_0)), mHandleV1_1(std::move(handleV1_1)) {} + HidlHalWrapperV1_1(sp<hardware::power::V1_1::IPower> handleV1_1) + : HidlHalWrapperV1_0(std::move(handleV1_1)) {} virtual ~HidlHalWrapperV1_1() = default; protected: - virtual HalResult<void> sendPowerHint(hardware::power::V1_0::PowerHint hintId, + virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, uint32_t data) override; +}; -private: - sp<hardware::power::V1_1::IPower> mHandleV1_1; +// Wrapper for the HIDL Power HAL v1.2. +class HidlHalWrapperV1_2 : public HidlHalWrapperV1_1 { +public: + virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; + virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; + HidlHalWrapperV1_2(sp<hardware::power::V1_2::IPower> handleV1_2) + : HidlHalWrapperV1_1(std::move(handleV1_2)) {} + virtual ~HidlHalWrapperV1_2() = default; + +protected: + virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, + uint32_t data) override; +}; + +// Wrapper for the HIDL Power HAL v1.3. +class HidlHalWrapperV1_3 : public HidlHalWrapperV1_2 { +public: + virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; + HidlHalWrapperV1_3(sp<hardware::power::V1_3::IPower> handleV1_3) + : HidlHalWrapperV1_2(std::move(handleV1_3)) {} + virtual ~HidlHalWrapperV1_3() = default; + +protected: + virtual HalResult<void> sendPowerHint(hardware::power::V1_3::PowerHint hintId, + uint32_t data) override; }; // Wrapper for the AIDL Power HAL. diff --git a/services/powermanager/Android.bp b/services/powermanager/Android.bp index 6fbba3f568..b7de61982e 100644 --- a/services/powermanager/Android.bp +++ b/services/powermanager/Android.bp @@ -38,6 +38,8 @@ cc_library_shared { "libutils", "android.hardware.power@1.0", "android.hardware.power@1.1", + "android.hardware.power@1.2", + "android.hardware.power@1.3", "android.hardware.power-V3-cpp", ], diff --git a/services/powermanager/PowerHalController.cpp b/services/powermanager/PowerHalController.cpp index 8c225d5d02..f89035fd1c 100644 --- a/services/powermanager/PowerHalController.cpp +++ b/services/powermanager/PowerHalController.cpp @@ -33,16 +33,20 @@ namespace power { // ------------------------------------------------------------------------------------------------- std::unique_ptr<HalWrapper> HalConnector::connect() { - sp<IPower> halAidl = PowerHalLoader::loadAidl(); - if (halAidl) { + if (sp<IPower> halAidl = PowerHalLoader::loadAidl()) { return std::make_unique<AidlHalWrapper>(halAidl); } - sp<V1_0::IPower> halHidlV1_0 = PowerHalLoader::loadHidlV1_0(); - sp<V1_1::IPower> halHidlV1_1 = PowerHalLoader::loadHidlV1_1(); - if (halHidlV1_1) { - return std::make_unique<HidlHalWrapperV1_1>(halHidlV1_0, halHidlV1_1); - } - if (halHidlV1_0) { + // If V1_0 isn't defined, none of them are + if (sp<V1_0::IPower> halHidlV1_0 = PowerHalLoader::loadHidlV1_0()) { + if (sp<V1_3::IPower> halHidlV1_3 = PowerHalLoader::loadHidlV1_3()) { + return std::make_unique<HidlHalWrapperV1_3>(halHidlV1_3); + } + if (sp<V1_2::IPower> halHidlV1_2 = PowerHalLoader::loadHidlV1_2()) { + return std::make_unique<HidlHalWrapperV1_2>(halHidlV1_2); + } + if (sp<V1_1::IPower> halHidlV1_1 = PowerHalLoader::loadHidlV1_1()) { + return std::make_unique<HidlHalWrapperV1_1>(halHidlV1_1); + } return std::make_unique<HidlHalWrapperV1_0>(halHidlV1_0); } return nullptr; diff --git a/services/powermanager/PowerHalLoader.cpp b/services/powermanager/PowerHalLoader.cpp index 1f1b43a607..6bd40f8ff2 100644 --- a/services/powermanager/PowerHalLoader.cpp +++ b/services/powermanager/PowerHalLoader.cpp @@ -17,6 +17,8 @@ #define LOG_TAG "PowerHalLoader" #include <android/hardware/power/1.1/IPower.h> +#include <android/hardware/power/1.2/IPower.h> +#include <android/hardware/power/1.3/IPower.h> #include <android/hardware/power/IPower.h> #include <binder/IServiceManager.h> #include <hardware/power.h> @@ -55,12 +57,16 @@ std::mutex PowerHalLoader::gHalMutex; sp<IPower> PowerHalLoader::gHalAidl = nullptr; sp<V1_0::IPower> PowerHalLoader::gHalHidlV1_0 = nullptr; sp<V1_1::IPower> PowerHalLoader::gHalHidlV1_1 = nullptr; +sp<V1_2::IPower> PowerHalLoader::gHalHidlV1_2 = nullptr; +sp<V1_3::IPower> PowerHalLoader::gHalHidlV1_3 = nullptr; void PowerHalLoader::unloadAll() { std::lock_guard<std::mutex> lock(gHalMutex); gHalAidl = nullptr; gHalHidlV1_0 = nullptr; gHalHidlV1_1 = nullptr; + gHalHidlV1_2 = nullptr; + gHalHidlV1_3 = nullptr; } sp<IPower> PowerHalLoader::loadAidl() { @@ -82,6 +88,20 @@ sp<V1_1::IPower> PowerHalLoader::loadHidlV1_1() { return loadHal<V1_1::IPower>(gHalExists, gHalHidlV1_1, loadFn, "HIDL v1.1"); } +sp<V1_2::IPower> PowerHalLoader::loadHidlV1_2() { + std::lock_guard<std::mutex> lock(gHalMutex); + static bool gHalExists = true; + static auto loadFn = []() { return V1_2::IPower::castFrom(loadHidlV1_0Locked()); }; + return loadHal<V1_2::IPower>(gHalExists, gHalHidlV1_2, loadFn, "HIDL v1.2"); +} + +sp<V1_3::IPower> PowerHalLoader::loadHidlV1_3() { + std::lock_guard<std::mutex> lock(gHalMutex); + static bool gHalExists = true; + static auto loadFn = []() { return V1_3::IPower::castFrom(loadHidlV1_0Locked()); }; + return loadHal<V1_3::IPower>(gHalExists, gHalHidlV1_3, loadFn, "HIDL v1.3"); +} + sp<V1_0::IPower> PowerHalLoader::loadHidlV1_0Locked() { static bool gHalExists = true; static auto loadFn = []() { return V1_0::IPower::getService(); }; diff --git a/services/powermanager/PowerHalWrapper.cpp b/services/powermanager/PowerHalWrapper.cpp index d74bd23a8d..9e7adf8e5c 100644 --- a/services/powermanager/PowerHalWrapper.cpp +++ b/services/powermanager/PowerHalWrapper.cpp @@ -24,8 +24,6 @@ #include <cinttypes> using namespace android::hardware::power; -namespace V1_0 = android::hardware::power::V1_0; -namespace V1_1 = android::hardware::power::V1_1; namespace Aidl = android::hardware::power; namespace android { @@ -108,7 +106,7 @@ HalResult<int64_t> EmptyHalWrapper::getHintSessionPreferredRate() { HalResult<void> HidlHalWrapperV1_0::setBoost(Boost boost, int32_t durationMs) { if (boost == Boost::INTERACTION) { - return sendPowerHint(V1_0::PowerHint::INTERACTION, durationMs); + return sendPowerHint(V1_3::PowerHint::INTERACTION, durationMs); } else { ALOGV("Skipped setBoost %s because Power HAL AIDL not available", toString(boost).c_str()); return HalResult<void>::unsupported(); @@ -119,13 +117,13 @@ HalResult<void> HidlHalWrapperV1_0::setMode(Mode mode, bool enabled) { uint32_t data = enabled ? 1 : 0; switch (mode) { case Mode::LAUNCH: - return sendPowerHint(V1_0::PowerHint::LAUNCH, data); + return sendPowerHint(V1_3::PowerHint::LAUNCH, data); case Mode::LOW_POWER: - return sendPowerHint(V1_0::PowerHint::LOW_POWER, data); + return sendPowerHint(V1_3::PowerHint::LOW_POWER, data); case Mode::SUSTAINED_PERFORMANCE: - return sendPowerHint(V1_0::PowerHint::SUSTAINED_PERFORMANCE, data); + return sendPowerHint(V1_3::PowerHint::SUSTAINED_PERFORMANCE, data); case Mode::VR: - return sendPowerHint(V1_0::PowerHint::VR_MODE, data); + return sendPowerHint(V1_3::PowerHint::VR_MODE, data); case Mode::INTERACTIVE: return setInteractive(enabled); case Mode::DOUBLE_TAP_TO_WAKE: @@ -137,8 +135,8 @@ HalResult<void> HidlHalWrapperV1_0::setMode(Mode mode, bool enabled) { } } -HalResult<void> HidlHalWrapperV1_0::sendPowerHint(V1_0::PowerHint hintId, uint32_t data) { - auto ret = mHandleV1_0->powerHint(hintId, data); +HalResult<void> HidlHalWrapperV1_0::sendPowerHint(V1_3::PowerHint hintId, uint32_t data) { + auto ret = mHandleV1_0->powerHint(static_cast<V1_0::PowerHint>(hintId), data); return HalResult<void>::fromReturn(ret); } @@ -152,7 +150,7 @@ HalResult<void> HidlHalWrapperV1_0::setFeature(V1_0::Feature feature, bool enabl return HalResult<void>::fromReturn(ret); } -HalResult<sp<Aidl::IPowerHintSession>> HidlHalWrapperV1_0::createHintSession( +HalResult<sp<hardware::power::IPowerHintSession>> HidlHalWrapperV1_0::createHintSession( int32_t, int32_t, const std::vector<int32_t>& threadIds, int64_t) { ALOGV("Skipped createHintSession(task num=%zu) because Power HAL not available", threadIds.size()); @@ -166,8 +164,59 @@ HalResult<int64_t> HidlHalWrapperV1_0::getHintSessionPreferredRate() { // ------------------------------------------------------------------------------------------------- -HalResult<void> HidlHalWrapperV1_1::sendPowerHint(V1_0::PowerHint hintId, uint32_t data) { - auto ret = mHandleV1_1->powerHintAsync(hintId, data); +HalResult<void> HidlHalWrapperV1_1::sendPowerHint(V1_3::PowerHint hintId, uint32_t data) { + auto handle = static_cast<V1_1::IPower*>(mHandleV1_0.get()); + auto ret = handle->powerHintAsync(static_cast<V1_0::PowerHint>(hintId), data); + return HalResult<void>::fromReturn(ret); +} + +// ------------------------------------------------------------------------------------------------- + +HalResult<void> HidlHalWrapperV1_2::sendPowerHint(V1_3::PowerHint hintId, uint32_t data) { + auto handle = static_cast<V1_2::IPower*>(mHandleV1_0.get()); + auto ret = handle->powerHintAsync_1_2(static_cast<V1_2::PowerHint>(hintId), data); + return HalResult<void>::fromReturn(ret); +} + +HalResult<void> HidlHalWrapperV1_2::setBoost(Boost boost, int32_t durationMs) { + switch (boost) { + case Boost::CAMERA_SHOT: + return sendPowerHint(V1_3::PowerHint::CAMERA_SHOT, durationMs); + case Boost::CAMERA_LAUNCH: + return sendPowerHint(V1_3::PowerHint::CAMERA_LAUNCH, durationMs); + default: + return HidlHalWrapperV1_1::setBoost(boost, durationMs); + } +} + +HalResult<void> HidlHalWrapperV1_2::setMode(Mode mode, bool enabled) { + uint32_t data = enabled ? 1 : 0; + switch (mode) { + case Mode::CAMERA_STREAMING_SECURE: + case Mode::CAMERA_STREAMING_LOW: + case Mode::CAMERA_STREAMING_MID: + case Mode::CAMERA_STREAMING_HIGH: + return sendPowerHint(V1_3::PowerHint::CAMERA_STREAMING, data); + case Mode::AUDIO_STREAMING_LOW_LATENCY: + return sendPowerHint(V1_3::PowerHint::AUDIO_LOW_LATENCY, data); + default: + return HidlHalWrapperV1_1::setMode(mode, enabled); + } +} + +// ------------------------------------------------------------------------------------------------- + +HalResult<void> HidlHalWrapperV1_3::setMode(Mode mode, bool enabled) { + uint32_t data = enabled ? 1 : 0; + if (mode == Mode::EXPENSIVE_RENDERING) { + return sendPowerHint(V1_3::PowerHint::EXPENSIVE_RENDERING, data); + } + return HidlHalWrapperV1_2::setMode(mode, enabled); +} + +HalResult<void> HidlHalWrapperV1_3::sendPowerHint(V1_3::PowerHint hintId, uint32_t data) { + auto handle = static_cast<V1_3::IPower*>(mHandleV1_0.get()); + auto ret = handle->powerHintAsync_1_3(hintId, data); return HalResult<void>::fromReturn(ret); } diff --git a/services/powermanager/benchmarks/Android.bp b/services/powermanager/benchmarks/Android.bp index fcb012fc75..0286a8160c 100644 --- a/services/powermanager/benchmarks/Android.bp +++ b/services/powermanager/benchmarks/Android.bp @@ -38,6 +38,8 @@ cc_benchmark { "libutils", "android.hardware.power@1.0", "android.hardware.power@1.1", + "android.hardware.power@1.2", + "android.hardware.power@1.3", "android.hardware.power-V3-cpp", ], static_libs: [ diff --git a/services/powermanager/tests/Android.bp b/services/powermanager/tests/Android.bp index 962784cbae..eec6801b1f 100644 --- a/services/powermanager/tests/Android.bp +++ b/services/powermanager/tests/Android.bp @@ -31,6 +31,8 @@ cc_test { "PowerHalWrapperAidlTest.cpp", "PowerHalWrapperHidlV1_0Test.cpp", "PowerHalWrapperHidlV1_1Test.cpp", + "PowerHalWrapperHidlV1_2Test.cpp", + "PowerHalWrapperHidlV1_3Test.cpp", "WorkSourceTest.cpp", ], cflags: [ @@ -47,6 +49,8 @@ cc_test { "libutils", "android.hardware.power@1.0", "android.hardware.power@1.1", + "android.hardware.power@1.2", + "android.hardware.power@1.3", "android.hardware.power-V3-cpp", ], static_libs: [ diff --git a/services/powermanager/tests/PowerHalLoaderTest.cpp b/services/powermanager/tests/PowerHalLoaderTest.cpp index 058e1b5ca8..e36deed042 100644 --- a/services/powermanager/tests/PowerHalLoaderTest.cpp +++ b/services/powermanager/tests/PowerHalLoaderTest.cpp @@ -26,6 +26,8 @@ using IPowerV1_0 = android::hardware::power::V1_0::IPower; using IPowerV1_1 = android::hardware::power::V1_1::IPower; +using IPowerV1_2 = android::hardware::power::V1_2::IPower; +using IPowerV1_3 = android::hardware::power::V1_3::IPower; using IPowerAidl = android::hardware::power::IPower; using namespace android; @@ -52,6 +54,16 @@ sp<IPowerV1_1> loadHal<IPowerV1_1>() { return PowerHalLoader::loadHidlV1_1(); } +template <> +sp<IPowerV1_2> loadHal<IPowerV1_2>() { + return PowerHalLoader::loadHidlV1_2(); +} + +template <> +sp<IPowerV1_3> loadHal<IPowerV1_3>() { + return PowerHalLoader::loadHidlV1_3(); +} + // ------------------------------------------------------------------------------------------------- template <typename T> @@ -63,7 +75,7 @@ public: // ------------------------------------------------------------------------------------------------- -typedef ::testing::Types<IPowerAidl, IPowerV1_0, IPowerV1_1> PowerHalTypes; +typedef ::testing::Types<IPowerAidl, IPowerV1_0, IPowerV1_1, IPowerV1_2, IPowerV1_3> PowerHalTypes; TYPED_TEST_SUITE(PowerHalLoaderTest, PowerHalTypes); TYPED_TEST(PowerHalLoaderTest, TestLoadsOnlyOnce) { diff --git a/services/powermanager/tests/PowerHalWrapperHidlV1_0Test.cpp b/services/powermanager/tests/PowerHalWrapperHidlV1_0Test.cpp index b54762cf6d..0cd2e22e7e 100644 --- a/services/powermanager/tests/PowerHalWrapperHidlV1_0Test.cpp +++ b/services/powermanager/tests/PowerHalWrapperHidlV1_0Test.cpp @@ -87,18 +87,28 @@ TEST_F(PowerHalWrapperHidlV1_0Test, TestSetBoostFailed) { } TEST_F(PowerHalWrapperHidlV1_0Test, TestSetBoostUnsupported) { + EXPECT_CALL(*mMockHal.get(), powerHint(_, _)).Times(0); + EXPECT_CALL(*mMockHal.get(), setInteractive(_)).Times(0); + EXPECT_CALL(*mMockHal.get(), setFeature(_, _)).Times(0); + auto result = mWrapper->setBoost(Boost::CAMERA_LAUNCH, 10); ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setBoost(Boost::ML_ACC, 10); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 10); + ASSERT_TRUE(result.isUnsupported()); } TEST_F(PowerHalWrapperHidlV1_0Test, TestSetModeSuccessful) { { InSequence seq; - EXPECT_CALL(*mMockHal.get(), powerHint(Eq(PowerHint::LAUNCH), Eq(1))).Times(Exactly(1)); - EXPECT_CALL(*mMockHal.get(), powerHint(Eq(PowerHint::LOW_POWER), Eq(0))).Times(Exactly(1)); - EXPECT_CALL(*mMockHal.get(), powerHint(Eq(PowerHint::SUSTAINED_PERFORMANCE), Eq(1))) + EXPECT_CALL(*mMockHal.get(), powerHint(Eq(PowerHint::LAUNCH), Eq(true))).Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), powerHint(Eq(PowerHint::LOW_POWER), Eq(false))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), powerHint(Eq(PowerHint::SUSTAINED_PERFORMANCE), Eq(true))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), powerHint(Eq(PowerHint::VR_MODE), Eq(false))) .Times(Exactly(1)); - EXPECT_CALL(*mMockHal.get(), powerHint(Eq(PowerHint::VR_MODE), Eq(0))).Times(Exactly(1)); EXPECT_CALL(*mMockHal.get(), setInteractive(Eq(true))).Times(Exactly(1)); EXPECT_CALL(*mMockHal.get(), setFeature(Eq(Feature::POWER_FEATURE_DOUBLE_TAP_TO_WAKE), Eq(false))) @@ -131,6 +141,16 @@ TEST_F(PowerHalWrapperHidlV1_0Test, TestSetModeFailed) { } TEST_F(PowerHalWrapperHidlV1_0Test, TestSetModeIgnored) { + EXPECT_CALL(*mMockHal.get(), powerHint(_, _)).Times(0); + EXPECT_CALL(*mMockHal.get(), setInteractive(_)).Times(0); + EXPECT_CALL(*mMockHal.get(), setFeature(_, _)).Times(0); + auto result = mWrapper->setMode(Mode::CAMERA_STREAMING_HIGH, true); ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::EXPENSIVE_RENDERING, false); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::FIXED_PERFORMANCE, true); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::GAME_LOADING, false); + ASSERT_TRUE(result.isUnsupported()); } diff --git a/services/powermanager/tests/PowerHalWrapperHidlV1_1Test.cpp b/services/powermanager/tests/PowerHalWrapperHidlV1_1Test.cpp index d30e8d2c49..32f84e20b6 100644 --- a/services/powermanager/tests/PowerHalWrapperHidlV1_1Test.cpp +++ b/services/powermanager/tests/PowerHalWrapperHidlV1_1Test.cpp @@ -31,7 +31,6 @@ using android::hardware::power::Mode; using android::hardware::power::V1_0::Feature; using android::hardware::power::V1_0::PowerHint; using IPowerV1_1 = android::hardware::power::V1_1::IPower; -using IPowerV1_0 = android::hardware::power::V1_0::IPower; using namespace android; using namespace android::power; @@ -40,15 +39,6 @@ using namespace testing; // ------------------------------------------------------------------------------------------------- -class MockIPowerV1_0 : public IPowerV1_0 { -public: - MOCK_METHOD(hardware::Return<void>, setInteractive, (bool interactive), (override)); - MOCK_METHOD(hardware::Return<void>, powerHint, (PowerHint hint, int32_t data), (override)); - MOCK_METHOD(hardware::Return<void>, setFeature, (Feature feature, bool activate), (override)); - MOCK_METHOD(hardware::Return<void>, getPlatformLowPowerStats, - (getPlatformLowPowerStats_cb _hidl_cb), (override)); -}; - class MockIPowerV1_1 : public IPowerV1_1 { public: MOCK_METHOD(hardware::Return<void>, setInteractive, (bool interactive), (override)); @@ -69,23 +59,22 @@ public: protected: std::unique_ptr<HalWrapper> mWrapper = nullptr; - sp<StrictMock<MockIPowerV1_0>> mMockHalV1_0 = nullptr; - sp<StrictMock<MockIPowerV1_1>> mMockHalV1_1 = nullptr; + sp<StrictMock<MockIPowerV1_1>> mMockHal = nullptr; }; // ------------------------------------------------------------------------------------------------- void PowerHalWrapperHidlV1_1Test::SetUp() { - mMockHalV1_0 = new StrictMock<MockIPowerV1_0>(); - mMockHalV1_1 = new StrictMock<MockIPowerV1_1>(); - mWrapper = std::make_unique<HidlHalWrapperV1_1>(mMockHalV1_0, mMockHalV1_1); + mMockHal = new StrictMock<MockIPowerV1_1>(); + mWrapper = std::make_unique<HidlHalWrapperV1_1>(mMockHal); ASSERT_NE(mWrapper, nullptr); + EXPECT_CALL(*mMockHal.get(), powerHint(_, _)).Times(0); } // ------------------------------------------------------------------------------------------------- TEST_F(PowerHalWrapperHidlV1_1Test, TestSetBoostSuccessful) { - EXPECT_CALL(*mMockHalV1_1.get(), powerHintAsync(Eq(PowerHint::INTERACTION), Eq(1000))) + EXPECT_CALL(*mMockHal.get(), powerHintAsync(Eq(PowerHint::INTERACTION), Eq(1000))) .Times(Exactly(1)); auto result = mWrapper->setBoost(Boost::INTERACTION, 1000); @@ -93,7 +82,7 @@ TEST_F(PowerHalWrapperHidlV1_1Test, TestSetBoostSuccessful) { } TEST_F(PowerHalWrapperHidlV1_1Test, TestSetBoostFailed) { - EXPECT_CALL(*mMockHalV1_1.get(), powerHintAsync(Eq(PowerHint::INTERACTION), Eq(1000))) + EXPECT_CALL(*mMockHal.get(), powerHintAsync(Eq(PowerHint::INTERACTION), Eq(1000))) .Times(Exactly(1)) .WillRepeatedly([](PowerHint, int32_t) { return hardware::Return<void>(hardware::Status::fromExceptionCode(-1)); @@ -104,24 +93,31 @@ TEST_F(PowerHalWrapperHidlV1_1Test, TestSetBoostFailed) { } TEST_F(PowerHalWrapperHidlV1_1Test, TestSetBoostUnsupported) { + EXPECT_CALL(*mMockHal.get(), powerHintAsync(_, _)).Times(0); + EXPECT_CALL(*mMockHal.get(), setInteractive(_)).Times(0); + EXPECT_CALL(*mMockHal.get(), setFeature(_, _)).Times(0); + auto result = mWrapper->setBoost(Boost::CAMERA_LAUNCH, 10); ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setBoost(Boost::ML_ACC, 10); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 10); + ASSERT_TRUE(result.isUnsupported()); } TEST_F(PowerHalWrapperHidlV1_1Test, TestSetMode) { { InSequence seq; - EXPECT_CALL(*mMockHalV1_1.get(), powerHintAsync(Eq(PowerHint::LAUNCH), Eq(1))) + EXPECT_CALL(*mMockHal.get(), powerHintAsync(Eq(PowerHint::LAUNCH), Eq(true))) .Times(Exactly(1)); - EXPECT_CALL(*mMockHalV1_1.get(), powerHintAsync(Eq(PowerHint::LOW_POWER), Eq(0))) + EXPECT_CALL(*mMockHal.get(), powerHintAsync(Eq(PowerHint::LOW_POWER), Eq(false))) .Times(Exactly(1)); - EXPECT_CALL(*mMockHalV1_1.get(), - powerHintAsync(Eq(PowerHint::SUSTAINED_PERFORMANCE), Eq(1))) + EXPECT_CALL(*mMockHal.get(), powerHintAsync(Eq(PowerHint::SUSTAINED_PERFORMANCE), Eq(true))) .Times(Exactly(1)); - EXPECT_CALL(*mMockHalV1_1.get(), powerHintAsync(Eq(PowerHint::VR_MODE), Eq(0))) + EXPECT_CALL(*mMockHal.get(), powerHintAsync(Eq(PowerHint::VR_MODE), Eq(false))) .Times(Exactly(1)); - EXPECT_CALL(*mMockHalV1_0.get(), setInteractive(Eq(true))).Times(Exactly(1)); - EXPECT_CALL(*mMockHalV1_0.get(), + EXPECT_CALL(*mMockHal.get(), setInteractive(Eq(true))).Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), setFeature(Eq(Feature::POWER_FEATURE_DOUBLE_TAP_TO_WAKE), Eq(false))) .Times(Exactly(1)); } @@ -141,7 +137,7 @@ TEST_F(PowerHalWrapperHidlV1_1Test, TestSetMode) { } TEST_F(PowerHalWrapperHidlV1_1Test, TestSetModeFailed) { - EXPECT_CALL(*mMockHalV1_1.get(), powerHintAsync(Eq(PowerHint::LAUNCH), Eq(1))) + EXPECT_CALL(*mMockHal.get(), powerHintAsync(Eq(PowerHint::LAUNCH), Eq(true))) .Times(Exactly(1)) .WillRepeatedly([](PowerHint, int32_t) { return hardware::Return<void>(hardware::Status::fromExceptionCode(-1)); @@ -152,6 +148,16 @@ TEST_F(PowerHalWrapperHidlV1_1Test, TestSetModeFailed) { } TEST_F(PowerHalWrapperHidlV1_1Test, TestSetModeIgnored) { + EXPECT_CALL(*mMockHal.get(), powerHintAsync(_, _)).Times(0); + EXPECT_CALL(*mMockHal.get(), setInteractive(_)).Times(0); + EXPECT_CALL(*mMockHal.get(), setFeature(_, _)).Times(0); + auto result = mWrapper->setMode(Mode::CAMERA_STREAMING_HIGH, true); ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::EXPENSIVE_RENDERING, false); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::FIXED_PERFORMANCE, true); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::GAME_LOADING, false); + ASSERT_TRUE(result.isUnsupported()); } diff --git a/services/powermanager/tests/PowerHalWrapperHidlV1_2Test.cpp b/services/powermanager/tests/PowerHalWrapperHidlV1_2Test.cpp new file mode 100644 index 0000000000..cf48409f5f --- /dev/null +++ b/services/powermanager/tests/PowerHalWrapperHidlV1_2Test.cpp @@ -0,0 +1,200 @@ +/* + * Copyright (C) 2022 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. + */ + +#define LOG_TAG "PowerHalWrapperHidlV1_2Test" + +#include <android/hardware/power/1.2/IPower.h> +#include <android/hardware/power/Boost.h> +#include <android/hardware/power/IPower.h> +#include <android/hardware/power/Mode.h> +#include <binder/IServiceManager.h> +#include <gmock/gmock.h> +#include <gtest/gtest.h> +#include <powermanager/PowerHalWrapper.h> +#include <utils/Log.h> + +using android::hardware::power::Boost; +using android::hardware::power::Mode; +using android::hardware::power::V1_0::Feature; +using PowerHintV1_0 = android::hardware::power::V1_0::PowerHint; +using PowerHintV1_2 = android::hardware::power::V1_2::PowerHint; + +using IPowerV1_2 = android::hardware::power::V1_2::IPower; + +using namespace android; +using namespace android::power; +using namespace std::chrono_literals; +using namespace testing; + +// ------------------------------------------------------------------------------------------------- + +class MockIPowerV1_2 : public IPowerV1_2 { +public: + MOCK_METHOD(hardware::Return<void>, setInteractive, (bool interactive), (override)); + MOCK_METHOD(hardware::Return<void>, powerHint, (PowerHintV1_0 hint, int32_t data), (override)); + MOCK_METHOD(hardware::Return<void>, setFeature, (Feature feature, bool activate), (override)); + MOCK_METHOD(hardware::Return<void>, getPlatformLowPowerStats, + (getPlatformLowPowerStats_cb _hidl_cb), (override)); + MOCK_METHOD(hardware::Return<void>, powerHintAsync, (PowerHintV1_0 hint, int32_t data), + (override)); + MOCK_METHOD(hardware::Return<void>, powerHintAsync_1_2, (PowerHintV1_2 hint, int32_t data), + (override)); + MOCK_METHOD(hardware::Return<void>, getSubsystemLowPowerStats, + (getSubsystemLowPowerStats_cb _hidl_cb), (override)); +}; + +// ------------------------------------------------------------------------------------------------- + +class PowerHalWrapperHidlV1_2Test : public Test { +public: + void SetUp() override; + +protected: + std::unique_ptr<HalWrapper> mWrapper = nullptr; + sp<StrictMock<MockIPowerV1_2>> mMockHal = nullptr; +}; + +// ------------------------------------------------------------------------------------------------- + +void PowerHalWrapperHidlV1_2Test::SetUp() { + mMockHal = new StrictMock<MockIPowerV1_2>(); + mWrapper = std::make_unique<HidlHalWrapperV1_2>(mMockHal); + ASSERT_NE(mWrapper, nullptr); + EXPECT_CALL(*mMockHal.get(), powerHint(_, _)).Times(0); + EXPECT_CALL(*mMockHal.get(), powerHintAsync(_, _)).Times(0); +} + +// ------------------------------------------------------------------------------------------------- + +TEST_F(PowerHalWrapperHidlV1_2Test, TestSetBoostSuccessful) { + { + InSequence seq; + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_2(Eq(PowerHintV1_2::INTERACTION), Eq(1000))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_2(Eq(PowerHintV1_2::CAMERA_SHOT), Eq(500))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_2(Eq(PowerHintV1_2::CAMERA_LAUNCH), Eq(300))) + .Times(Exactly(1)); + } + + auto result = mWrapper->setBoost(Boost::INTERACTION, 1000); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setBoost(Boost::CAMERA_SHOT, 500); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setBoost(Boost::CAMERA_LAUNCH, 300); + ASSERT_TRUE(result.isOk()); +} + +TEST_F(PowerHalWrapperHidlV1_2Test, TestSetBoostFailed) { + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_2(Eq(PowerHintV1_2::INTERACTION), Eq(1000))) + .Times(Exactly(1)) + .WillRepeatedly([](PowerHintV1_2, int32_t) { + return hardware::Return<void>(hardware::Status::fromExceptionCode(-1)); + }); + + auto result = mWrapper->setBoost(Boost::INTERACTION, 1000); + ASSERT_TRUE(result.isFailed()); +} + +TEST_F(PowerHalWrapperHidlV1_2Test, TestSetBoostUnsupported) { + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_2(_, _)).Times(0); + EXPECT_CALL(*mMockHal.get(), setInteractive(_)).Times(0); + EXPECT_CALL(*mMockHal.get(), setFeature(_, _)).Times(0); + + auto result = mWrapper->setBoost(Boost::ML_ACC, 10); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 10); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setBoost(Boost::AUDIO_LAUNCH, 10); + ASSERT_TRUE(result.isUnsupported()); +} + +TEST_F(PowerHalWrapperHidlV1_2Test, TestSetMode) { + { + InSequence seq; + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_2(Eq(PowerHintV1_2::LAUNCH), Eq(true))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_2(Eq(PowerHintV1_2::LOW_POWER), Eq(false))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), + powerHintAsync_1_2(Eq(PowerHintV1_2::SUSTAINED_PERFORMANCE), Eq(true))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_2(Eq(PowerHintV1_2::VR_MODE), Eq(false))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), setInteractive(Eq(true))).Times(Exactly(true)); + EXPECT_CALL(*mMockHal.get(), + setFeature(Eq(Feature::POWER_FEATURE_DOUBLE_TAP_TO_WAKE), Eq(false))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), + powerHintAsync_1_2(Eq(PowerHintV1_2::CAMERA_STREAMING), Eq(true))) + .Times(Exactly(2)); + EXPECT_CALL(*mMockHal.get(), + powerHintAsync_1_2(Eq(PowerHintV1_2::CAMERA_STREAMING), Eq(false))) + .Times(Exactly(2)); + EXPECT_CALL(*mMockHal.get(), + powerHintAsync_1_2(Eq(PowerHintV1_2::AUDIO_LOW_LATENCY), Eq(true))) + .Times(Exactly(1)); + } + + auto result = mWrapper->setMode(Mode::LAUNCH, true); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::LOW_POWER, false); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::SUSTAINED_PERFORMANCE, true); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::VR, false); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::INTERACTIVE, true); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::DOUBLE_TAP_TO_WAKE, false); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::CAMERA_STREAMING_SECURE, true); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::CAMERA_STREAMING_LOW, true); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::CAMERA_STREAMING_MID, false); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::CAMERA_STREAMING_HIGH, false); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::AUDIO_STREAMING_LOW_LATENCY, true); + ASSERT_TRUE(result.isOk()); +} + +TEST_F(PowerHalWrapperHidlV1_2Test, TestSetModeFailed) { + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_2(Eq(PowerHintV1_2::LAUNCH), Eq(1))) + .Times(Exactly(1)) + .WillRepeatedly([](PowerHintV1_2, int32_t) { + return hardware::Return<void>(hardware::Status::fromExceptionCode(-1)); + }); + + auto result = mWrapper->setMode(Mode::LAUNCH, 1); + ASSERT_TRUE(result.isFailed()); +} + +TEST_F(PowerHalWrapperHidlV1_2Test, TestSetModeIgnored) { + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_2(_, _)).Times(0); + EXPECT_CALL(*mMockHal.get(), setInteractive(_)).Times(0); + EXPECT_CALL(*mMockHal.get(), setFeature(_, _)).Times(0); + + auto result = mWrapper->setMode(Mode::EXPENSIVE_RENDERING, true); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::DISPLAY_INACTIVE, true); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::FIXED_PERFORMANCE, true); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::GAME_LOADING, false); + ASSERT_TRUE(result.isUnsupported()); +} diff --git a/services/powermanager/tests/PowerHalWrapperHidlV1_3Test.cpp b/services/powermanager/tests/PowerHalWrapperHidlV1_3Test.cpp new file mode 100644 index 0000000000..2c48537edc --- /dev/null +++ b/services/powermanager/tests/PowerHalWrapperHidlV1_3Test.cpp @@ -0,0 +1,210 @@ +/* + * Copyright (C) 2022 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. + */ + +#define LOG_TAG "PowerHalWrapperHidlV1_3Test" + +#include <android/hardware/power/1.3/IPower.h> +#include <android/hardware/power/Boost.h> +#include <android/hardware/power/IPower.h> +#include <android/hardware/power/Mode.h> +#include <binder/IServiceManager.h> +#include <gmock/gmock.h> +#include <gtest/gtest.h> +#include <powermanager/PowerHalWrapper.h> +#include <utils/Log.h> + +using android::hardware::power::Boost; +using android::hardware::power::Mode; +using android::hardware::power::V1_0::Feature; +using PowerHintV1_0 = android::hardware::power::V1_0::PowerHint; +using PowerHintV1_2 = android::hardware::power::V1_2::PowerHint; +using PowerHintV1_3 = android::hardware::power::V1_3::PowerHint; + +using IPowerV1_3 = android::hardware::power::V1_3::IPower; + +using namespace android; +using namespace android::power; +using namespace std::chrono_literals; +using namespace testing; + +// ------------------------------------------------------------------------------------------------- + +class MockIPowerV1_3 : public IPowerV1_3 { +public: + MOCK_METHOD(hardware::Return<void>, setInteractive, (bool interactive), (override)); + MOCK_METHOD(hardware::Return<void>, powerHint, (PowerHintV1_0 hint, int32_t data), (override)); + MOCK_METHOD(hardware::Return<void>, setFeature, (Feature feature, bool activate), (override)); + MOCK_METHOD(hardware::Return<void>, getPlatformLowPowerStats, + (getPlatformLowPowerStats_cb _hidl_cb), (override)); + MOCK_METHOD(hardware::Return<void>, powerHintAsync, (PowerHintV1_0 hint, int32_t data), + (override)); + MOCK_METHOD(hardware::Return<void>, powerHintAsync_1_2, (PowerHintV1_2 hint, int32_t data), + (override)); + MOCK_METHOD(hardware::Return<void>, powerHintAsync_1_3, (PowerHintV1_3 hint, int32_t data), + (override)); + + MOCK_METHOD(hardware::Return<void>, getSubsystemLowPowerStats, + (getSubsystemLowPowerStats_cb _hidl_cb), (override)); +}; + +// ------------------------------------------------------------------------------------------------- + +class PowerHalWrapperHidlV1_3Test : public Test { +public: + void SetUp() override; + +protected: + std::unique_ptr<HalWrapper> mWrapper = nullptr; + sp<StrictMock<MockIPowerV1_3>> mMockHal = nullptr; +}; + +// ------------------------------------------------------------------------------------------------- + +void PowerHalWrapperHidlV1_3Test::SetUp() { + mMockHal = new StrictMock<MockIPowerV1_3>(); + mWrapper = std::make_unique<HidlHalWrapperV1_3>(mMockHal); + ASSERT_NE(mWrapper, nullptr); + EXPECT_CALL(*mMockHal.get(), powerHint(_, _)).Times(0); + EXPECT_CALL(*mMockHal.get(), powerHintAsync(_, _)).Times(0); + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_2(_, _)).Times(0); +} + +// ------------------------------------------------------------------------------------------------- + +TEST_F(PowerHalWrapperHidlV1_3Test, TestSetBoostSuccessful) { + { + InSequence seq; + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_3(Eq(PowerHintV1_3::INTERACTION), Eq(1000))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_3(Eq(PowerHintV1_3::CAMERA_SHOT), Eq(500))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_3(Eq(PowerHintV1_3::CAMERA_LAUNCH), Eq(300))) + .Times(Exactly(1)); + } + + auto result = mWrapper->setBoost(Boost::INTERACTION, 1000); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setBoost(Boost::CAMERA_SHOT, 500); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setBoost(Boost::CAMERA_LAUNCH, 300); + ASSERT_TRUE(result.isOk()); +} + +TEST_F(PowerHalWrapperHidlV1_3Test, TestSetBoostFailed) { + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_3(Eq(PowerHintV1_3::INTERACTION), Eq(1000))) + .Times(Exactly(1)) + .WillRepeatedly([](PowerHintV1_3, int32_t) { + return hardware::Return<void>(hardware::Status::fromExceptionCode(-1)); + }); + + auto result = mWrapper->setBoost(Boost::INTERACTION, 1000); + ASSERT_TRUE(result.isFailed()); +} + +TEST_F(PowerHalWrapperHidlV1_3Test, TestSetBoostUnsupported) { + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_3(_, _)).Times(0); + EXPECT_CALL(*mMockHal.get(), setInteractive(_)).Times(0); + EXPECT_CALL(*mMockHal.get(), setFeature(_, _)).Times(0); + + auto result = mWrapper->setBoost(Boost::ML_ACC, 10); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 10); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setBoost(Boost::AUDIO_LAUNCH, 10); + ASSERT_TRUE(result.isUnsupported()); +} + +TEST_F(PowerHalWrapperHidlV1_3Test, TestSetMode) { + { + InSequence seq; + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_3(Eq(PowerHintV1_3::LAUNCH), Eq(true))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_3(Eq(PowerHintV1_3::LOW_POWER), Eq(false))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), + powerHintAsync_1_3(Eq(PowerHintV1_3::SUSTAINED_PERFORMANCE), Eq(true))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_3(Eq(PowerHintV1_3::VR_MODE), Eq(false))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), setInteractive(Eq(true))).Times(Exactly(true)); + EXPECT_CALL(*mMockHal.get(), + setFeature(Eq(Feature::POWER_FEATURE_DOUBLE_TAP_TO_WAKE), Eq(false))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), + powerHintAsync_1_3(Eq(PowerHintV1_3::CAMERA_STREAMING), Eq(true))) + .Times(Exactly(2)); + EXPECT_CALL(*mMockHal.get(), + powerHintAsync_1_3(Eq(PowerHintV1_3::CAMERA_STREAMING), Eq(false))) + .Times(Exactly(2)); + EXPECT_CALL(*mMockHal.get(), + powerHintAsync_1_3(Eq(PowerHintV1_3::AUDIO_LOW_LATENCY), Eq(true))) + .Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), + powerHintAsync_1_3(Eq(PowerHintV1_3::EXPENSIVE_RENDERING), Eq(false))) + .Times(Exactly(1)); + } + + auto result = mWrapper->setMode(Mode::LAUNCH, true); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::LOW_POWER, false); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::SUSTAINED_PERFORMANCE, true); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::VR, false); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::INTERACTIVE, true); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::DOUBLE_TAP_TO_WAKE, false); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::CAMERA_STREAMING_SECURE, true); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::CAMERA_STREAMING_LOW, true); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::CAMERA_STREAMING_MID, false); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::CAMERA_STREAMING_HIGH, false); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::AUDIO_STREAMING_LOW_LATENCY, true); + ASSERT_TRUE(result.isOk()); + result = mWrapper->setMode(Mode::EXPENSIVE_RENDERING, false); + ASSERT_TRUE(result.isOk()); +} + +TEST_F(PowerHalWrapperHidlV1_3Test, TestSetModeFailed) { + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_3(Eq(PowerHintV1_3::LAUNCH), Eq(1))) + .Times(Exactly(1)) + .WillRepeatedly([](PowerHintV1_3, int32_t) { + return hardware::Return<void>(hardware::Status::fromExceptionCode(-1)); + }); + + auto result = mWrapper->setMode(Mode::LAUNCH, 1); + ASSERT_TRUE(result.isFailed()); +} + +TEST_F(PowerHalWrapperHidlV1_3Test, TestSetModeIgnored) { + EXPECT_CALL(*mMockHal.get(), powerHintAsync_1_3(_, _)).Times(0); + EXPECT_CALL(*mMockHal.get(), setInteractive(_)).Times(0); + EXPECT_CALL(*mMockHal.get(), setFeature(_, _)).Times(0); + + auto result = mWrapper->setMode(Mode::GAME, true); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::DISPLAY_INACTIVE, true); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::FIXED_PERFORMANCE, true); + ASSERT_TRUE(result.isUnsupported()); + result = mWrapper->setMode(Mode::GAME_LOADING, false); + ASSERT_TRUE(result.isUnsupported()); +} |