diff options
author | 2021-03-03 00:30:50 +0800 | |
---|---|---|
committer | 2021-04-07 14:37:02 -0700 | |
commit | 0b264bb47731c140741e2e98927e41a512b5cc25 (patch) | |
tree | c34fa20287f4451e5f3e878f6b4b03565576235d | |
parent | b19cc001167bd3c7417330cb021539541e8e1d4f (diff) |
ADPF: Plumb getAppSession throughout PowerHal wrapping
Test: Manual test, run bouncy ball
Test: atest libpowermanager_test:PowerHalWrapperAidlTest
Test: atest libpowermanager_benchmarks
Bug: 158791282
Change-Id: I0cf3420f3cf79f107347a640e6f14c1eeac60f23
Signed-off-by: Wei Wang <wvw@google.com>
-rw-r--r-- | include/powermanager/PowerHalController.h | 12 | ||||
-rw-r--r-- | include/powermanager/PowerHalWrapper.h | 123 | ||||
-rw-r--r-- | services/powermanager/Android.bp | 2 | ||||
-rw-r--r-- | services/powermanager/PowerHalController.cpp | 25 | ||||
-rw-r--r-- | services/powermanager/PowerHalWrapper.cpp | 142 | ||||
-rw-r--r-- | services/powermanager/benchmarks/Android.bp | 2 | ||||
-rw-r--r-- | services/powermanager/benchmarks/PowerHalAidlBenchmarks.cpp | 106 | ||||
-rw-r--r-- | services/powermanager/benchmarks/PowerHalControllerBenchmarks.cpp | 16 | ||||
-rw-r--r-- | services/powermanager/tests/Android.bp | 2 | ||||
-rw-r--r-- | services/powermanager/tests/PowerHalControllerTest.cpp | 30 | ||||
-rw-r--r-- | services/powermanager/tests/PowerHalWrapperAidlTest.cpp | 67 | ||||
-rw-r--r-- | services/powermanager/tests/PowerHalWrapperHidlV1_0Test.cpp | 22 | ||||
-rw-r--r-- | services/powermanager/tests/PowerHalWrapperHidlV1_1Test.cpp | 22 |
13 files changed, 450 insertions, 121 deletions
diff --git a/include/powermanager/PowerHalController.h b/include/powermanager/PowerHalController.h index dd34c0a6c2..71a36d09e5 100644 --- a/include/powermanager/PowerHalController.h +++ b/include/powermanager/PowerHalController.h @@ -20,6 +20,7 @@ #include <android-base/thread_annotations.h> #include <android/hardware/power/Boost.h> #include <android/hardware/power/IPower.h> +#include <android/hardware/power/IPowerHintSession.h> #include <android/hardware/power/Mode.h> #include <powermanager/PowerHalWrapper.h> @@ -54,8 +55,12 @@ public: void init(); - virtual HalResult setBoost(hardware::power::Boost boost, int32_t durationMs) override; - virtual HalResult setMode(hardware::power::Mode mode, bool enabled) override; + virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; + virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; + virtual HalResult<sp<hardware::power::IPowerHintSession>> createHintSession( + int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, + int64_t durationNanos) override; + virtual HalResult<int64_t> getHintSessionPreferredRate() override; private: std::mutex mConnectedHalMutex; @@ -67,7 +72,8 @@ private: const std::shared_ptr<HalWrapper> mDefaultHal = std::make_shared<EmptyHalWrapper>(); std::shared_ptr<HalWrapper> initHal(); - HalResult processHalResult(HalResult result, const char* functionName); + template <typename T> + HalResult<T> processHalResult(HalResult<T> result, const char* functionName); }; // ------------------------------------------------------------------------------------------------- diff --git a/include/powermanager/PowerHalWrapper.h b/include/powermanager/PowerHalWrapper.h index c3e7601c29..2c6eacbfaa 100644 --- a/include/powermanager/PowerHalWrapper.h +++ b/include/powermanager/PowerHalWrapper.h @@ -21,6 +21,7 @@ #include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/Boost.h> #include <android/hardware/power/IPower.h> +#include <android/hardware/power/IPowerHintSession.h> #include <android/hardware/power/Mode.h> namespace android { @@ -34,11 +35,81 @@ enum class HalSupport { OFF = 2, }; -// State of the Power HAL api call result. -enum class HalResult { - SUCCESSFUL = 0, - FAILED = 1, - UNSUPPORTED = 2, +// Result of a call to the Power HAL wrapper, holding data if successful. +template <typename T> +class HalResult { +public: + static HalResult<T> ok(T value) { return HalResult(value); } + static HalResult<T> failed(std::string msg) { + return HalResult(std::move(msg), /* unsupported= */ false); + } + static HalResult<T> unsupported() { return HalResult("", /* unsupported= */ true); } + + static HalResult<T> fromStatus(binder::Status status, T data) { + if (status.exceptionCode() == binder::Status::EX_UNSUPPORTED_OPERATION) { + return HalResult<T>::unsupported(); + } + if (status.isOk()) { + return HalResult<T>::ok(data); + } + return HalResult<T>::failed(std::string(status.toString8().c_str())); + } + static HalResult<T> fromStatus(hardware::power::V1_0::Status status, T data); + + template <typename R> + static HalResult<T> fromReturn(hardware::Return<R>& ret, T data); + + template <typename R> + static HalResult<T> fromReturn(hardware::Return<R>& ret, hardware::power::V1_0::Status status, + T data); + + // This will throw std::bad_optional_access if this result is not ok. + const T& value() const { return mValue.value(); } + bool isOk() const { return !mUnsupported && mValue.has_value(); } + bool isFailed() const { return !mUnsupported && !mValue.has_value(); } + bool isUnsupported() const { return mUnsupported; } + const char* errorMessage() const { return mErrorMessage.c_str(); } + +private: + std::optional<T> mValue; + std::string mErrorMessage; + bool mUnsupported; + + explicit HalResult(T value) + : mValue(std::make_optional(value)), mErrorMessage(), mUnsupported(false) {} + explicit HalResult(std::string errorMessage, bool unsupported) + : mValue(), mErrorMessage(std::move(errorMessage)), mUnsupported(unsupported) {} +}; + +// Empty result of a call to the Power HAL wrapper. +template <> +class HalResult<void> { +public: + static HalResult<void> ok() { return HalResult(); } + static HalResult<void> failed(std::string msg) { return HalResult(std::move(msg)); } + static HalResult<void> unsupported() { return HalResult(/* unsupported= */ true); } + + static HalResult<void> fromStatus(status_t status); + static HalResult<void> fromStatus(binder::Status status); + static HalResult<void> fromStatus(hardware::power::V1_0::Status status); + + template <typename R> + static HalResult<void> fromReturn(hardware::Return<R>& ret); + + bool isOk() const { return !mUnsupported && !mFailed; } + bool isFailed() const { return !mUnsupported && mFailed; } + bool isUnsupported() const { return mUnsupported; } + const char* errorMessage() const { return mErrorMessage.c_str(); } + +private: + std::string mErrorMessage; + bool mFailed; + bool mUnsupported; + + explicit HalResult(bool unsupported = false) + : mErrorMessage(), mFailed(false), mUnsupported(unsupported) {} + explicit HalResult(std::string errorMessage) + : mErrorMessage(std::move(errorMessage)), mFailed(true), mUnsupported(false) {} }; // Wrapper for Power HAL handlers. @@ -46,8 +117,12 @@ class HalWrapper { public: virtual ~HalWrapper() = default; - virtual HalResult setBoost(hardware::power::Boost boost, int32_t durationMs) = 0; - virtual HalResult setMode(hardware::power::Mode mode, bool enabled) = 0; + virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) = 0; + virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) = 0; + virtual HalResult<sp<hardware::power::IPowerHintSession>> createHintSession( + int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, + int64_t durationNanos) = 0; + virtual HalResult<int64_t> getHintSessionPreferredRate() = 0; }; // Empty Power HAL wrapper that ignores all api calls. @@ -56,8 +131,12 @@ public: EmptyHalWrapper() = default; ~EmptyHalWrapper() = default; - virtual HalResult setBoost(hardware::power::Boost boost, int32_t durationMs) override; - virtual HalResult setMode(hardware::power::Mode mode, bool enabled) override; + virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; + virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; + virtual HalResult<sp<hardware::power::IPowerHintSession>> createHintSession( + int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, + int64_t durationNanos) override; + virtual HalResult<int64_t> getHintSessionPreferredRate() override; }; // Wrapper for the HIDL Power HAL v1.0. @@ -67,16 +146,20 @@ public: : mHandleV1_0(std::move(Hal)) {} virtual ~HidlHalWrapperV1_0() = default; - virtual HalResult setBoost(hardware::power::Boost boost, int32_t durationMs) override; - virtual HalResult setMode(hardware::power::Mode mode, bool enabled) override; + virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; + virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; + virtual HalResult<sp<hardware::power::IPowerHintSession>> createHintSession( + int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, + int64_t durationNanos) override; + virtual HalResult<int64_t> getHintSessionPreferredRate() override; protected: - virtual HalResult sendPowerHint(hardware::power::V1_0::PowerHint hintId, uint32_t data); + virtual HalResult<void> sendPowerHint(hardware::power::V1_0::PowerHint hintId, uint32_t data); private: sp<hardware::power::V1_0::IPower> mHandleV1_0; - HalResult setInteractive(bool enabled); - HalResult setFeature(hardware::power::V1_0::Feature feature, bool enabled); + HalResult<void> setInteractive(bool enabled); + HalResult<void> setFeature(hardware::power::V1_0::Feature feature, bool enabled); }; // Wrapper for the HIDL Power HAL v1.1. @@ -88,8 +171,8 @@ public: virtual ~HidlHalWrapperV1_1() = default; protected: - virtual HalResult sendPowerHint(hardware::power::V1_0::PowerHint hintId, - uint32_t data) override; + virtual HalResult<void> sendPowerHint(hardware::power::V1_0::PowerHint hintId, + uint32_t data) override; private: sp<hardware::power::V1_1::IPower> mHandleV1_1; @@ -101,8 +184,12 @@ public: explicit AidlHalWrapper(sp<hardware::power::IPower> handle) : mHandle(std::move(handle)) {} virtual ~AidlHalWrapper() = default; - virtual HalResult setBoost(hardware::power::Boost boost, int32_t durationMs) override; - virtual HalResult setMode(hardware::power::Mode mode, bool enabled) override; + virtual HalResult<void> setBoost(hardware::power::Boost boost, int32_t durationMs) override; + virtual HalResult<void> setMode(hardware::power::Mode mode, bool enabled) override; + virtual HalResult<sp<hardware::power::IPowerHintSession>> createHintSession( + int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, + int64_t durationNanos) override; + virtual HalResult<int64_t> getHintSessionPreferredRate() override; private: // Control access to the boost and mode supported arrays. diff --git a/services/powermanager/Android.bp b/services/powermanager/Android.bp index 1d3e5b53fa..d828aa97a0 100644 --- a/services/powermanager/Android.bp +++ b/services/powermanager/Android.bp @@ -38,7 +38,7 @@ cc_library_shared { "libutils", "android.hardware.power@1.0", "android.hardware.power@1.1", - "android.hardware.power-V1-cpp", + "android.hardware.power-V2-cpp", ], cflags: [ diff --git a/services/powermanager/PowerHalController.cpp b/services/powermanager/PowerHalController.cpp index 178f545b2e..8c225d5d02 100644 --- a/services/powermanager/PowerHalController.cpp +++ b/services/powermanager/PowerHalController.cpp @@ -18,6 +18,7 @@ #include <android/hardware/power/1.1/IPower.h> #include <android/hardware/power/Boost.h> #include <android/hardware/power/IPower.h> +#include <android/hardware/power/IPowerHintSession.h> #include <android/hardware/power/Mode.h> #include <powermanager/PowerHalController.h> #include <powermanager/PowerHalLoader.h> @@ -73,9 +74,10 @@ std::shared_ptr<HalWrapper> PowerHalController::initHal() { // Check if a call to Power HAL function failed; if so, log the failure and // invalidate the current Power HAL handle. -HalResult PowerHalController::processHalResult(HalResult result, const char* fnName) { - if (result == HalResult::FAILED) { - ALOGE("%s() failed: power HAL service not available.", fnName); +template <typename T> +HalResult<T> PowerHalController::processHalResult(HalResult<T> result, const char* fnName) { + if (result.isFailed()) { + ALOGE("%s failed: %s", fnName, result.errorMessage()); std::lock_guard<std::mutex> lock(mConnectedHalMutex); // Drop Power HAL handle. This will force future api calls to reconnect. mConnectedHal = nullptr; @@ -84,18 +86,31 @@ HalResult PowerHalController::processHalResult(HalResult result, const char* fnN return result; } -HalResult PowerHalController::setBoost(Boost boost, int32_t durationMs) { +HalResult<void> PowerHalController::setBoost(Boost boost, int32_t durationMs) { std::shared_ptr<HalWrapper> handle = initHal(); auto result = handle->setBoost(boost, durationMs); return processHalResult(result, "setBoost"); } -HalResult PowerHalController::setMode(Mode mode, bool enabled) { +HalResult<void> PowerHalController::setMode(Mode mode, bool enabled) { std::shared_ptr<HalWrapper> handle = initHal(); auto result = handle->setMode(mode, enabled); return processHalResult(result, "setMode"); } +HalResult<sp<IPowerHintSession>> PowerHalController::createHintSession( + int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) { + std::shared_ptr<HalWrapper> handle = initHal(); + auto result = handle->createHintSession(tgid, uid, threadIds, durationNanos); + return processHalResult(result, "createHintSession"); +} + +HalResult<int64_t> PowerHalController::getHintSessionPreferredRate() { + std::shared_ptr<HalWrapper> handle = initHal(); + auto result = handle->getHintSessionPreferredRate(); + return processHalResult(result, "getHintSessionPreferredRate"); +} + } // namespace power } // namespace android diff --git a/services/powermanager/PowerHalWrapper.cpp b/services/powermanager/PowerHalWrapper.cpp index 2f32827367..d74bd23a8d 100644 --- a/services/powermanager/PowerHalWrapper.cpp +++ b/services/powermanager/PowerHalWrapper.cpp @@ -16,11 +16,17 @@ #define LOG_TAG "HalWrapper" #include <android/hardware/power/Boost.h> +#include <android/hardware/power/IPowerHintSession.h> #include <android/hardware/power/Mode.h> #include <powermanager/PowerHalWrapper.h> #include <utils/Log.h> +#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 { @@ -28,49 +34,88 @@ namespace power { // ------------------------------------------------------------------------------------------------- -inline HalResult toHalResult(const binder::Status& result) { +inline HalResult<void> toHalResult(const binder::Status& result) { if (result.isOk()) { - return HalResult::SUCCESSFUL; + return HalResult<void>::ok(); } ALOGE("Power HAL request failed: %s", result.toString8().c_str()); - return HalResult::FAILED; + return HalResult<void>::fromStatus(result); } template <typename T> -inline HalResult toHalResult(const hardware::Return<T>& result) { - if (result.isOk()) { - return HalResult::SUCCESSFUL; +template <typename R> +HalResult<T> HalResult<T>::fromReturn(hardware::Return<R>& ret, T data) { + return ret.isOk() ? HalResult<T>::ok(data) : HalResult<T>::failed(ret.description()); +} + +template <typename T> +template <typename R> +HalResult<T> HalResult<T>::fromReturn(hardware::Return<R>& ret, V1_0::Status status, T data) { + return ret.isOk() ? HalResult<T>::fromStatus(status, data) + : HalResult<T>::failed(ret.description()); +} + +// ------------------------------------------------------------------------------------------------- + +HalResult<void> HalResult<void>::fromStatus(status_t status) { + if (status == android::OK) { + return HalResult<void>::ok(); + } + return HalResult<void>::failed(statusToString(status)); +} + +HalResult<void> HalResult<void>::fromStatus(binder::Status status) { + if (status.exceptionCode() == binder::Status::EX_UNSUPPORTED_OPERATION) { + return HalResult<void>::unsupported(); + } + if (status.isOk()) { + return HalResult<void>::ok(); } - ALOGE("Power HAL request failed: %s", result.description().c_str()); - return HalResult::FAILED; + return HalResult<void>::failed(std::string(status.toString8().c_str())); } +template <typename R> +HalResult<void> HalResult<void>::fromReturn(hardware::Return<R>& ret) { + return ret.isOk() ? HalResult<void>::ok() : HalResult<void>::failed(ret.description()); +} // ------------------------------------------------------------------------------------------------- -HalResult EmptyHalWrapper::setBoost(Boost boost, int32_t durationMs) { +HalResult<void> EmptyHalWrapper::setBoost(Boost boost, int32_t durationMs) { ALOGV("Skipped setBoost %s with duration %dms because Power HAL not available", toString(boost).c_str(), durationMs); - return HalResult::UNSUPPORTED; + return HalResult<void>::unsupported(); } -HalResult EmptyHalWrapper::setMode(Mode mode, bool enabled) { +HalResult<void> EmptyHalWrapper::setMode(Mode mode, bool enabled) { ALOGV("Skipped setMode %s to %s because Power HAL not available", toString(mode).c_str(), enabled ? "true" : "false"); - return HalResult::UNSUPPORTED; + return HalResult<void>::unsupported(); +} + +HalResult<sp<Aidl::IPowerHintSession>> EmptyHalWrapper::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()); + return HalResult<sp<Aidl::IPowerHintSession>>::unsupported(); +} + +HalResult<int64_t> EmptyHalWrapper::getHintSessionPreferredRate() { + ALOGV("Skipped getHintSessionPreferredRate because Power HAL not available"); + return HalResult<int64_t>::unsupported(); } // ------------------------------------------------------------------------------------------------- -HalResult HidlHalWrapperV1_0::setBoost(Boost boost, int32_t durationMs) { +HalResult<void> HidlHalWrapperV1_0::setBoost(Boost boost, int32_t durationMs) { if (boost == Boost::INTERACTION) { return sendPowerHint(V1_0::PowerHint::INTERACTION, durationMs); } else { ALOGV("Skipped setBoost %s because Power HAL AIDL not available", toString(boost).c_str()); - return HalResult::UNSUPPORTED; + return HalResult<void>::unsupported(); } } -HalResult HidlHalWrapperV1_0::setMode(Mode mode, bool enabled) { +HalResult<void> HidlHalWrapperV1_0::setMode(Mode mode, bool enabled) { uint32_t data = enabled ? 1 : 0; switch (mode) { case Mode::LAUNCH: @@ -88,38 +133,54 @@ HalResult HidlHalWrapperV1_0::setMode(Mode mode, bool enabled) { default: ALOGV("Skipped setMode %s because Power HAL AIDL not available", toString(mode).c_str()); - return HalResult::UNSUPPORTED; + return HalResult<void>::unsupported(); } } -HalResult HidlHalWrapperV1_0::sendPowerHint(V1_0::PowerHint hintId, uint32_t data) { - return toHalResult(mHandleV1_0->powerHint(hintId, data)); +HalResult<void> HidlHalWrapperV1_0::sendPowerHint(V1_0::PowerHint hintId, uint32_t data) { + auto ret = mHandleV1_0->powerHint(hintId, data); + return HalResult<void>::fromReturn(ret); +} + +HalResult<void> HidlHalWrapperV1_0::setInteractive(bool enabled) { + auto ret = mHandleV1_0->setInteractive(enabled); + return HalResult<void>::fromReturn(ret); } -HalResult HidlHalWrapperV1_0::setInteractive(bool enabled) { - return toHalResult(mHandleV1_0->setInteractive(enabled)); +HalResult<void> HidlHalWrapperV1_0::setFeature(V1_0::Feature feature, bool enabled) { + auto ret = mHandleV1_0->setFeature(feature, enabled); + return HalResult<void>::fromReturn(ret); } -HalResult HidlHalWrapperV1_0::setFeature(V1_0::Feature feature, bool enabled) { - return toHalResult(mHandleV1_0->setFeature(feature, enabled)); +HalResult<sp<Aidl::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()); + return HalResult<sp<Aidl::IPowerHintSession>>::unsupported(); +} + +HalResult<int64_t> HidlHalWrapperV1_0::getHintSessionPreferredRate() { + ALOGV("Skipped getHintSessionPreferredRate because Power HAL not available"); + return HalResult<int64_t>::unsupported(); } // ------------------------------------------------------------------------------------------------- -HalResult HidlHalWrapperV1_1::sendPowerHint(V1_0::PowerHint hintId, uint32_t data) { - return toHalResult(mHandleV1_1->powerHintAsync(hintId, data)); +HalResult<void> HidlHalWrapperV1_1::sendPowerHint(V1_0::PowerHint hintId, uint32_t data) { + auto ret = mHandleV1_1->powerHintAsync(hintId, data); + return HalResult<void>::fromReturn(ret); } // ------------------------------------------------------------------------------------------------- -HalResult AidlHalWrapper::setBoost(Boost boost, int32_t durationMs) { +HalResult<void> AidlHalWrapper::setBoost(Boost boost, int32_t durationMs) { std::unique_lock<std::mutex> lock(mBoostMutex); size_t idx = static_cast<size_t>(boost); // Quick return if boost is not supported by HAL if (idx >= mBoostSupportedArray.size() || mBoostSupportedArray[idx] == HalSupport::OFF) { ALOGV("Skipped setBoost %s because Power HAL doesn't support it", toString(boost).c_str()); - return HalResult::UNSUPPORTED; + return HalResult<void>::unsupported(); } if (mBoostSupportedArray[idx] == HalSupport::UNKNOWN) { @@ -128,14 +189,15 @@ HalResult AidlHalWrapper::setBoost(Boost boost, int32_t durationMs) { if (!isSupportedRet.isOk()) { ALOGE("Skipped setBoost %s because check support failed with: %s", toString(boost).c_str(), isSupportedRet.toString8().c_str()); - return HalResult::FAILED; + // return HalResult::FAILED; + return HalResult<void>::fromStatus(isSupportedRet); } mBoostSupportedArray[idx] = isSupported ? HalSupport::ON : HalSupport::OFF; if (!isSupported) { ALOGV("Skipped setBoost %s because Power HAL doesn't support it", toString(boost).c_str()); - return HalResult::UNSUPPORTED; + return HalResult<void>::unsupported(); } } lock.unlock(); @@ -143,30 +205,28 @@ HalResult AidlHalWrapper::setBoost(Boost boost, int32_t durationMs) { return toHalResult(mHandle->setBoost(boost, durationMs)); } -HalResult AidlHalWrapper::setMode(Mode mode, bool enabled) { +HalResult<void> AidlHalWrapper::setMode(Mode mode, bool enabled) { std::unique_lock<std::mutex> lock(mModeMutex); size_t idx = static_cast<size_t>(mode); // Quick return if mode is not supported by HAL if (idx >= mModeSupportedArray.size() || mModeSupportedArray[idx] == HalSupport::OFF) { ALOGV("Skipped setMode %s because Power HAL doesn't support it", toString(mode).c_str()); - return HalResult::UNSUPPORTED; + return HalResult<void>::unsupported(); } if (mModeSupportedArray[idx] == HalSupport::UNKNOWN) { bool isSupported = false; auto isSupportedRet = mHandle->isModeSupported(mode, &isSupported); if (!isSupportedRet.isOk()) { - ALOGE("Skipped setMode %s because check support failed with: %s", - toString(mode).c_str(), isSupportedRet.toString8().c_str()); - return HalResult::FAILED; + return HalResult<void>::failed(isSupportedRet.toString8().c_str()); } mModeSupportedArray[idx] = isSupported ? HalSupport::ON : HalSupport::OFF; if (!isSupported) { ALOGV("Skipped setMode %s because Power HAL doesn't support it", toString(mode).c_str()); - return HalResult::UNSUPPORTED; + return HalResult<void>::unsupported(); } } lock.unlock(); @@ -174,6 +234,20 @@ HalResult AidlHalWrapper::setMode(Mode mode, bool enabled) { return toHalResult(mHandle->setMode(mode, enabled)); } +HalResult<sp<Aidl::IPowerHintSession>> AidlHalWrapper::createHintSession( + int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, int64_t durationNanos) { + sp<IPowerHintSession> appSession; + return HalResult<sp<Aidl::IPowerHintSession>>:: + fromStatus(mHandle->createHintSession(tgid, uid, threadIds, durationNanos, &appSession), + appSession); +} + +HalResult<int64_t> AidlHalWrapper::getHintSessionPreferredRate() { + int64_t rate = -1; + auto result = mHandle->getHintSessionPreferredRate(&rate); + return HalResult<int64_t>::fromStatus(result, rate); +} + // ------------------------------------------------------------------------------------------------- } // namespace power diff --git a/services/powermanager/benchmarks/Android.bp b/services/powermanager/benchmarks/Android.bp index a489253207..3997929053 100644 --- a/services/powermanager/benchmarks/Android.bp +++ b/services/powermanager/benchmarks/Android.bp @@ -38,7 +38,7 @@ cc_benchmark { "libutils", "android.hardware.power@1.0", "android.hardware.power@1.1", - "android.hardware.power-V1-cpp", + "android.hardware.power-V2-cpp", ], static_libs: [ "libtestUtil", diff --git a/services/powermanager/benchmarks/PowerHalAidlBenchmarks.cpp b/services/powermanager/benchmarks/PowerHalAidlBenchmarks.cpp index 10048286b9..1100cad361 100644 --- a/services/powermanager/benchmarks/PowerHalAidlBenchmarks.cpp +++ b/services/powermanager/benchmarks/PowerHalAidlBenchmarks.cpp @@ -18,7 +18,9 @@ #include <android/hardware/power/Boost.h> #include <android/hardware/power/IPower.h> +#include <android/hardware/power/IPowerHintSession.h> #include <android/hardware/power/Mode.h> +#include <android/hardware/power/WorkDuration.h> #include <benchmark/benchmark.h> #include <binder/IServiceManager.h> #include <testUtil.h> @@ -26,7 +28,9 @@ using android::hardware::power::Boost; using android::hardware::power::IPower; +using android::hardware::power::IPowerHintSession; using android::hardware::power::Mode; +using android::hardware::power::WorkDuration; using std::chrono::microseconds; using namespace android; @@ -38,6 +42,21 @@ static constexpr int64_t LAST_BOOST = static_cast<int64_t>(Boost::CAMERA_SHOT); static constexpr int64_t FIRST_MODE = static_cast<int64_t>(Mode::DOUBLE_TAP_TO_WAKE); static constexpr int64_t LAST_MODE = static_cast<int64_t>(Mode::CAMERA_STREAMING_HIGH); +class DurationWrapper : public WorkDuration { +public: + DurationWrapper(int64_t dur, int64_t time) { + durationNanos = dur; + timeStampNanos = time; + } +}; + +static const std::vector<WorkDuration> DURATIONS = { + DurationWrapper(1L, 1L), + DurationWrapper(1000L, 2L), + DurationWrapper(1000000L, 3L), + DurationWrapper(1000000000L, 4L), +}; + // Delay between oneway method calls to avoid overflowing the binder buffers. static constexpr microseconds ONEWAY_API_DELAY = 100us; @@ -68,6 +87,47 @@ static void runBenchmark(benchmark::State& state, microseconds delay, R (IPower: } } +template <class R, class... Args0, class... Args1> +static void runSessionBenchmark(benchmark::State& state, R (IPowerHintSession::*fn)(Args0...), + Args1&&... args1) { + sp<IPower> pwHal = waitForVintfService<IPower>(); + + if (pwHal == nullptr) { + ALOGI("Power HAL not available, skipping test..."); + return; + } + + // do not use tid from the benchmark process, use 1 for init + std::vector<int32_t> threadIds{1}; + int64_t durationNanos = 16666666L; + sp<IPowerHintSession> hal; + + auto status = pwHal->createHintSession(1, 0, threadIds, durationNanos, &hal); + + if (hal == nullptr) { + ALOGI("Power HAL doesn't support session, skipping test..."); + return; + } + + binder::Status ret = (*hal.*fn)(std::forward<Args1>(args1)...); + if (ret.exceptionCode() == binder::Status::Exception::EX_UNSUPPORTED_OPERATION) { + ALOGI("Power HAL does not support this operation, skipping test..."); + return; + } + + while (state.KeepRunning()) { + ret = (*hal.*fn)(std::forward<Args1>(args1)...); + state.PauseTiming(); + if (!ret.isOk()) state.SkipWithError(ret.toString8().c_str()); + if (ONEWAY_API_DELAY > 0us) { + testDelaySpin(std::chrono::duration_cast<std::chrono::duration<float>>(ONEWAY_API_DELAY) + .count()); + } + state.ResumeTiming(); + } + hal->close(); +} + static void BM_PowerHalAidlBenchmarks_isBoostSupported(benchmark::State& state) { bool isSupported; Boost boost = static_cast<Boost>(state.range(0)); @@ -90,7 +150,53 @@ static void BM_PowerHalAidlBenchmarks_setMode(benchmark::State& state) { runBenchmark(state, ONEWAY_API_DELAY, &IPower::setMode, mode, false); } +static void BM_PowerHalAidlBenchmarks_createHintSession(benchmark::State& state) { + std::vector<int32_t> threadIds{static_cast<int32_t>(state.range(0))}; + int64_t durationNanos = 16666666L; + int32_t tgid = 999; + int32_t uid = 1001; + sp<IPowerHintSession> appSession; + sp<IPower> hal = waitForVintfService<IPower>(); + + if (hal == nullptr) { + ALOGI("Power HAL not available, skipping test..."); + return; + } + + binder::Status ret = hal->createHintSession(tgid, uid, threadIds, durationNanos, &appSession); + if (ret.exceptionCode() == binder::Status::Exception::EX_UNSUPPORTED_OPERATION) { + ALOGI("Power HAL does not support this operation, skipping test..."); + return; + } + + while (state.KeepRunning()) { + ret = hal->createHintSession(tgid, uid, threadIds, durationNanos, &appSession); + state.PauseTiming(); + if (!ret.isOk()) state.SkipWithError(ret.toString8().c_str()); + appSession->close(); + state.ResumeTiming(); + } +} + +static void BM_PowerHalAidlBenchmarks_getHintSessionPreferredRate(benchmark::State& state) { + int64_t rate; + runBenchmark(state, 0us, &IPower::getHintSessionPreferredRate, &rate); +} + +static void BM_PowerHalAidlBenchmarks_updateTargetWorkDuration(benchmark::State& state) { + int64_t duration = 1000; + runSessionBenchmark(state, &IPowerHintSession::updateTargetWorkDuration, duration); +} + +static void BM_PowerHalAidlBenchmarks_reportActualWorkDuration(benchmark::State& state) { + runSessionBenchmark(state, &IPowerHintSession::reportActualWorkDuration, DURATIONS); +} + BENCHMARK(BM_PowerHalAidlBenchmarks_isBoostSupported)->DenseRange(FIRST_BOOST, LAST_BOOST, 1); BENCHMARK(BM_PowerHalAidlBenchmarks_isModeSupported)->DenseRange(FIRST_MODE, LAST_MODE, 1); BENCHMARK(BM_PowerHalAidlBenchmarks_setBoost)->DenseRange(FIRST_BOOST, LAST_BOOST, 1); BENCHMARK(BM_PowerHalAidlBenchmarks_setMode)->DenseRange(FIRST_MODE, LAST_MODE, 1); +BENCHMARK(BM_PowerHalAidlBenchmarks_createHintSession)->Arg(1); +BENCHMARK(BM_PowerHalAidlBenchmarks_getHintSessionPreferredRate); +BENCHMARK(BM_PowerHalAidlBenchmarks_updateTargetWorkDuration); +BENCHMARK(BM_PowerHalAidlBenchmarks_reportActualWorkDuration); diff --git a/services/powermanager/benchmarks/PowerHalControllerBenchmarks.cpp b/services/powermanager/benchmarks/PowerHalControllerBenchmarks.cpp index 598080b5bc..f8abc7aba6 100644 --- a/services/powermanager/benchmarks/PowerHalControllerBenchmarks.cpp +++ b/services/powermanager/benchmarks/PowerHalControllerBenchmarks.cpp @@ -40,29 +40,29 @@ static constexpr int64_t LAST_MODE = static_cast<int64_t>(Mode::CAMERA_STREAMING // Delay between oneway method calls to avoid overflowing the binder buffers. static constexpr std::chrono::microseconds ONEWAY_API_DELAY = 100us; -template <class... Args0, class... Args1> -static void runBenchmark(benchmark::State& state, HalResult (PowerHalController::*fn)(Args0...), +template <typename T, class... Args0, class... Args1> +static void runBenchmark(benchmark::State& state, HalResult<T> (PowerHalController::*fn)(Args0...), Args1&&... args1) { while (state.KeepRunning()) { PowerHalController controller; - HalResult ret = (controller.*fn)(std::forward<Args1>(args1)...); + HalResult<T> ret = (controller.*fn)(std::forward<Args1>(args1)...); state.PauseTiming(); - if (ret == HalResult::FAILED) state.SkipWithError("Power HAL request failed"); + if (ret.isFailed()) state.SkipWithError("Power HAL request failed"); state.ResumeTiming(); } } -template <class... Args0, class... Args1> +template <typename T, class... Args0, class... Args1> static void runCachedBenchmark(benchmark::State& state, - HalResult (PowerHalController::*fn)(Args0...), Args1&&... args1) { + HalResult<T> (PowerHalController::*fn)(Args0...), Args1&&... args1) { PowerHalController controller; // First call out of test, to cache HAL service and isSupported result. (controller.*fn)(std::forward<Args1>(args1)...); while (state.KeepRunning()) { - HalResult ret = (controller.*fn)(std::forward<Args1>(args1)...); + HalResult<T> ret = (controller.*fn)(std::forward<Args1>(args1)...); state.PauseTiming(); - if (ret == HalResult::FAILED) { + if (ret.isFailed()) { state.SkipWithError("Power HAL request failed"); } testDelaySpin( diff --git a/services/powermanager/tests/Android.bp b/services/powermanager/tests/Android.bp index 69e4041aaa..659b2d273a 100644 --- a/services/powermanager/tests/Android.bp +++ b/services/powermanager/tests/Android.bp @@ -46,7 +46,7 @@ cc_test { "libutils", "android.hardware.power@1.0", "android.hardware.power@1.1", - "android.hardware.power-V1-cpp", + "android.hardware.power-V2-cpp", ], static_libs: [ "libgmock", diff --git a/services/powermanager/tests/PowerHalControllerTest.cpp b/services/powermanager/tests/PowerHalControllerTest.cpp index 141b2440b8..6cc7a6f3da 100644 --- a/services/powermanager/tests/PowerHalControllerTest.cpp +++ b/services/powermanager/tests/PowerHalControllerTest.cpp @@ -134,9 +134,9 @@ TEST_F(PowerHalControllerTest, TestUnableToConnectToPowerHalIgnoresAllApiCalls) // Still works with EmptyPowerHalWrapper as fallback ignoring every api call // and logging. auto result = halController.setBoost(Boost::INTERACTION, 1000); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); result = halController.setMode(Mode::LAUNCH, true); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); // PowerHalConnector was called every time to attempt to reconnect with // underlying service. @@ -159,9 +159,9 @@ TEST_F(PowerHalControllerTest, TestAllApiCallsDelegatedToConnectedPowerHal) { } auto result = mHalController->setBoost(Boost::INTERACTION, 100); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mHalController->setMode(Mode::LAUNCH, true); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); // PowerHalConnector was called only once and never reset. powerHalConnectCount = mHalConnector->getConnectCount(); @@ -182,13 +182,13 @@ TEST_F(PowerHalControllerTest, TestPowerHalRecoversFromFailureByRecreatingPowerH EXPECT_CALL(*mMockHal.get(), powerHint(_, _)).Times(Exactly(4)); auto result = mHalController->setBoost(Boost::INTERACTION, 1000); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mHalController->setMode(Mode::LAUNCH, true); - ASSERT_EQ(HalResult::FAILED, result); + ASSERT_TRUE(result.isFailed()); result = mHalController->setMode(Mode::VR, false); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mHalController->setMode(Mode::LOW_POWER, true); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); // PowerHalConnector was called only twice: on first api call and after failed // call. @@ -204,9 +204,9 @@ TEST_F(PowerHalControllerTest, TestPowerHalDoesNotTryToRecoverFromFailureOnUnsup EXPECT_EQ(powerHalConnectCount, 0); auto result = mHalController->setBoost(Boost::CAMERA_LAUNCH, 1000); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); result = mHalController->setMode(Mode::CAMERA_STREAMING_HIGH, true); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); // PowerHalConnector was called only once and never reset. powerHalConnectCount = mHalConnector->getConnectCount(); @@ -225,7 +225,7 @@ TEST_F(PowerHalControllerTest, TestMultiThreadConnectsOnlyOnce) { for (int i = 0; i < 10; i++) { threads.push_back(std::thread([&]() { auto result = mHalController->setBoost(Boost::INTERACTION, 1000); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); })); } std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); }); @@ -253,19 +253,19 @@ TEST_F(PowerHalControllerTest, TestMultiThreadWithFailureReconnectIsThreadSafe) for (int i = 0; i < 10; i++) { threads.push_back(std::thread([&]() { auto result = mHalController->setBoost(Boost::INTERACTION, 1000); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); })); threads.push_back(std::thread([&]() { auto result = mHalController->setMode(Mode::LAUNCH, true); - ASSERT_EQ(HalResult::FAILED, result); + ASSERT_TRUE(result.isFailed()); })); threads.push_back(std::thread([&]() { auto result = mHalController->setMode(Mode::LOW_POWER, false); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); })); threads.push_back(std::thread([&]() { auto result = mHalController->setMode(Mode::VR, true); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); })); } std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); }); diff --git a/services/powermanager/tests/PowerHalWrapperAidlTest.cpp b/services/powermanager/tests/PowerHalWrapperAidlTest.cpp index a7656598f0..d890f5c332 100644 --- a/services/powermanager/tests/PowerHalWrapperAidlTest.cpp +++ b/services/powermanager/tests/PowerHalWrapperAidlTest.cpp @@ -17,6 +17,7 @@ #define LOG_TAG "PowerHalWrapperAidlTest" #include <android/hardware/power/Boost.h> +#include <android/hardware/power/IPowerHintSession.h> #include <android/hardware/power/Mode.h> #include <binder/IServiceManager.h> #include <gmock/gmock.h> @@ -24,11 +25,13 @@ #include <powermanager/PowerHalWrapper.h> #include <utils/Log.h> +#include <unistd.h> #include <thread> using android::binder::Status; using android::hardware::power::Boost; using android::hardware::power::IPower; +using android::hardware::power::IPowerHintSession; using android::hardware::power::Mode; using namespace android; @@ -44,6 +47,11 @@ public: MOCK_METHOD(Status, setBoost, (Boost boost, int32_t durationMs), (override)); MOCK_METHOD(Status, isModeSupported, (Mode mode, bool* ret), (override)); MOCK_METHOD(Status, setMode, (Mode mode, bool enabled), (override)); + MOCK_METHOD(Status, createHintSession, + (int32_t tgid, int32_t uid, const std::vector<int32_t>& threadIds, + int64_t durationNanos, sp<IPowerHintSession>* session), + (override)); + MOCK_METHOD(Status, getHintSessionPreferredRate, (int64_t * rate), (override)); MOCK_METHOD(int32_t, getInterfaceVersion, (), (override)); MOCK_METHOD(std::string, getInterfaceHash, (), (override)); MOCK_METHOD(IBinder*, onAsBinder, (), (override)); @@ -65,7 +73,7 @@ protected: void PowerHalWrapperAidlTest::SetUp() { mMockHal = new StrictMock<MockIPower>(); mWrapper = std::make_unique<AidlHalWrapper>(mMockHal); - ASSERT_NE(mWrapper, nullptr); + ASSERT_NE(nullptr, mWrapper); } // ------------------------------------------------------------------------------------------------- @@ -81,7 +89,7 @@ TEST_F(PowerHalWrapperAidlTest, TestSetBoostSuccessful) { } auto result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 100); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); } TEST_F(PowerHalWrapperAidlTest, TestSetBoostFailed) { @@ -99,9 +107,9 @@ TEST_F(PowerHalWrapperAidlTest, TestSetBoostFailed) { } auto result = mWrapper->setBoost(Boost::INTERACTION, 100); - ASSERT_EQ(HalResult::FAILED, result); + ASSERT_TRUE(result.isFailed()); result = mWrapper->setBoost(Boost::DISPLAY_UPDATE_IMMINENT, 1000); - ASSERT_EQ(HalResult::FAILED, result); + ASSERT_TRUE(result.isFailed()); } TEST_F(PowerHalWrapperAidlTest, TestSetBoostUnsupported) { @@ -110,9 +118,9 @@ TEST_F(PowerHalWrapperAidlTest, TestSetBoostUnsupported) { .WillRepeatedly(DoAll(SetArgPointee<1>(false), Return(Status()))); auto result = mWrapper->setBoost(Boost::INTERACTION, 1000); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); result = mWrapper->setBoost(Boost::CAMERA_SHOT, 10); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); } TEST_F(PowerHalWrapperAidlTest, TestSetBoostMultiThreadCheckSupportedOnlyOnce) { @@ -128,7 +136,7 @@ TEST_F(PowerHalWrapperAidlTest, TestSetBoostMultiThreadCheckSupportedOnlyOnce) { for (int i = 0; i < 10; i++) { threads.push_back(std::thread([&]() { auto result = mWrapper->setBoost(Boost::INTERACTION, 100); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); })); } std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); }); @@ -145,7 +153,7 @@ TEST_F(PowerHalWrapperAidlTest, TestSetModeSuccessful) { } auto result = mWrapper->setMode(Mode::DISPLAY_INACTIVE, false); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); } TEST_F(PowerHalWrapperAidlTest, TestSetModeFailed) { @@ -163,9 +171,9 @@ TEST_F(PowerHalWrapperAidlTest, TestSetModeFailed) { } auto result = mWrapper->setMode(Mode::LAUNCH, true); - ASSERT_EQ(HalResult::FAILED, result); + ASSERT_TRUE(result.isFailed()); result = mWrapper->setMode(Mode::DISPLAY_INACTIVE, false); - ASSERT_EQ(HalResult::FAILED, result); + ASSERT_TRUE(result.isFailed()); } TEST_F(PowerHalWrapperAidlTest, TestSetModeUnsupported) { @@ -174,9 +182,9 @@ TEST_F(PowerHalWrapperAidlTest, TestSetModeUnsupported) { .WillRepeatedly(DoAll(SetArgPointee<1>(false), Return(Status()))); auto result = mWrapper->setMode(Mode::LAUNCH, true); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); result = mWrapper->setMode(Mode::CAMERA_STREAMING_HIGH, true); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); } TEST_F(PowerHalWrapperAidlTest, TestSetModeMultiThreadCheckSupportedOnlyOnce) { @@ -192,8 +200,41 @@ TEST_F(PowerHalWrapperAidlTest, TestSetModeMultiThreadCheckSupportedOnlyOnce) { for (int i = 0; i < 10; i++) { threads.push_back(std::thread([&]() { auto result = mWrapper->setMode(Mode::LAUNCH, false); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); })); } std::for_each(threads.begin(), threads.end(), [](std::thread& t) { t.join(); }); } + +TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionSuccessful) { + std::vector<int> threadIds{gettid()}; + int32_t tgid = 999; + int32_t uid = 1001; + int64_t durationNanos = 16666666L; + EXPECT_CALL(*mMockHal.get(), + createHintSession(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos), _)) + .Times(Exactly(1)); + auto result = mWrapper->createHintSession(tgid, uid, threadIds, durationNanos); + ASSERT_TRUE(result.isOk()); +} + +TEST_F(PowerHalWrapperAidlTest, TestCreateHintSessionFailed) { + int32_t tgid = 999; + int32_t uid = 1001; + std::vector<int> threadIds{}; + int64_t durationNanos = 16666666L; + EXPECT_CALL(*mMockHal.get(), + createHintSession(Eq(tgid), Eq(uid), Eq(threadIds), Eq(durationNanos), _)) + .Times(Exactly(1)) + .WillRepeatedly(Return(Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT))); + auto result = mWrapper->createHintSession(tgid, uid, threadIds, durationNanos); + ASSERT_TRUE(result.isFailed()); +} + +TEST_F(PowerHalWrapperAidlTest, TestGetHintSessionPreferredRate) { + EXPECT_CALL(*mMockHal.get(), getHintSessionPreferredRate(_)).Times(Exactly(1)); + auto result = mWrapper->getHintSessionPreferredRate(); + ASSERT_TRUE(result.isOk()); + int64_t rate = result.value(); + ASSERT_GE(0, rate); +} diff --git a/services/powermanager/tests/PowerHalWrapperHidlV1_0Test.cpp b/services/powermanager/tests/PowerHalWrapperHidlV1_0Test.cpp index 6693d0b070..b54762cf6d 100644 --- a/services/powermanager/tests/PowerHalWrapperHidlV1_0Test.cpp +++ b/services/powermanager/tests/PowerHalWrapperHidlV1_0Test.cpp @@ -72,7 +72,7 @@ TEST_F(PowerHalWrapperHidlV1_0Test, TestSetBoostSuccessful) { EXPECT_CALL(*mMockHal.get(), powerHint(Eq(PowerHint::INTERACTION), Eq(1000))).Times(Exactly(1)); auto result = mWrapper->setBoost(Boost::INTERACTION, 1000); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); } TEST_F(PowerHalWrapperHidlV1_0Test, TestSetBoostFailed) { @@ -83,12 +83,12 @@ TEST_F(PowerHalWrapperHidlV1_0Test, TestSetBoostFailed) { }); auto result = mWrapper->setBoost(Boost::INTERACTION, 1000); - ASSERT_EQ(HalResult::FAILED, result); + ASSERT_TRUE(result.isFailed()); } TEST_F(PowerHalWrapperHidlV1_0Test, TestSetBoostUnsupported) { auto result = mWrapper->setBoost(Boost::CAMERA_LAUNCH, 10); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); } TEST_F(PowerHalWrapperHidlV1_0Test, TestSetModeSuccessful) { @@ -106,17 +106,17 @@ TEST_F(PowerHalWrapperHidlV1_0Test, TestSetModeSuccessful) { } auto result = mWrapper->setMode(Mode::LAUNCH, true); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mWrapper->setMode(Mode::LOW_POWER, false); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mWrapper->setMode(Mode::SUSTAINED_PERFORMANCE, true); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mWrapper->setMode(Mode::VR, false); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mWrapper->setMode(Mode::INTERACTIVE, true); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mWrapper->setMode(Mode::DOUBLE_TAP_TO_WAKE, false); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); } TEST_F(PowerHalWrapperHidlV1_0Test, TestSetModeFailed) { @@ -127,10 +127,10 @@ TEST_F(PowerHalWrapperHidlV1_0Test, TestSetModeFailed) { }); auto result = mWrapper->setMode(Mode::LAUNCH, 1); - ASSERT_EQ(HalResult::FAILED, result); + ASSERT_TRUE(result.isFailed()); } TEST_F(PowerHalWrapperHidlV1_0Test, TestSetModeIgnored) { auto result = mWrapper->setMode(Mode::CAMERA_STREAMING_HIGH, true); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); } diff --git a/services/powermanager/tests/PowerHalWrapperHidlV1_1Test.cpp b/services/powermanager/tests/PowerHalWrapperHidlV1_1Test.cpp index 55bbd6df79..d30e8d2c49 100644 --- a/services/powermanager/tests/PowerHalWrapperHidlV1_1Test.cpp +++ b/services/powermanager/tests/PowerHalWrapperHidlV1_1Test.cpp @@ -89,7 +89,7 @@ TEST_F(PowerHalWrapperHidlV1_1Test, TestSetBoostSuccessful) { .Times(Exactly(1)); auto result = mWrapper->setBoost(Boost::INTERACTION, 1000); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); } TEST_F(PowerHalWrapperHidlV1_1Test, TestSetBoostFailed) { @@ -100,12 +100,12 @@ TEST_F(PowerHalWrapperHidlV1_1Test, TestSetBoostFailed) { }); auto result = mWrapper->setBoost(Boost::INTERACTION, 1000); - ASSERT_EQ(HalResult::FAILED, result); + ASSERT_TRUE(result.isFailed()); } TEST_F(PowerHalWrapperHidlV1_1Test, TestSetBoostUnsupported) { auto result = mWrapper->setBoost(Boost::CAMERA_LAUNCH, 10); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); } TEST_F(PowerHalWrapperHidlV1_1Test, TestSetMode) { @@ -127,17 +127,17 @@ TEST_F(PowerHalWrapperHidlV1_1Test, TestSetMode) { } auto result = mWrapper->setMode(Mode::LAUNCH, true); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mWrapper->setMode(Mode::LOW_POWER, false); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mWrapper->setMode(Mode::SUSTAINED_PERFORMANCE, true); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mWrapper->setMode(Mode::VR, false); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mWrapper->setMode(Mode::INTERACTIVE, true); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); result = mWrapper->setMode(Mode::DOUBLE_TAP_TO_WAKE, false); - ASSERT_EQ(HalResult::SUCCESSFUL, result); + ASSERT_TRUE(result.isOk()); } TEST_F(PowerHalWrapperHidlV1_1Test, TestSetModeFailed) { @@ -148,10 +148,10 @@ TEST_F(PowerHalWrapperHidlV1_1Test, TestSetModeFailed) { }); auto result = mWrapper->setMode(Mode::LAUNCH, 1); - ASSERT_EQ(HalResult::FAILED, result); + ASSERT_TRUE(result.isFailed()); } TEST_F(PowerHalWrapperHidlV1_1Test, TestSetModeIgnored) { auto result = mWrapper->setMode(Mode::CAMERA_STREAMING_HIGH, true); - ASSERT_EQ(HalResult::UNSUPPORTED, result); + ASSERT_TRUE(result.isUnsupported()); } |