diff options
author | 2024-06-24 14:48:14 +0100 | |
---|---|---|
committer | 2024-07-01 17:01:23 +0100 | |
commit | 818a2257151b862f1e1378dcc53a8601753f15fa (patch) | |
tree | 5f0b508ef0808c13489088951f3dc8070c731257 /services/vibratorservice | |
parent | 0bab92863cc46faca56c31eeec9edf69a9c65346 (diff) |
Use android.hardware.vibrator NDK backend
Update vibrator HAL dependency to use the NDK backend.
Bug: 349595412
Test: libvibratorservice_test
Flag: EXEMPT mechanical refactor
Change-Id: I1eee7ea86d0535f93ed09d5295b3efbb4d5a1870
Diffstat (limited to 'services/vibratorservice')
23 files changed, 680 insertions, 634 deletions
diff --git a/services/vibratorservice/Android.bp b/services/vibratorservice/Android.bp index 2002bdf628..503587f8ac 100644 --- a/services/vibratorservice/Android.bp +++ b/services/vibratorservice/Android.bp @@ -33,19 +33,19 @@ cc_library_shared { ], aidl: { - local_include_dirs: ["include"], - include_dirs: [ - "hardware/interfaces/vibrator/aidl/android/hardware/vibrator", - ], - export_aidl_headers: true + local_include_dirs: ["include"], + include_dirs: [ + "hardware/interfaces/vibrator/aidl/android/hardware/vibrator", + ], + export_aidl_headers: true, }, shared_libs: [ - "libbinder", + "libbinder_ndk", "libhidlbase", "liblog", "libutils", - "android.hardware.vibrator-V2-cpp", + "android.hardware.vibrator-V2-ndk", "android.hardware.vibrator@1.0", "android.hardware.vibrator@1.1", "android.hardware.vibrator@1.2", diff --git a/services/vibratorservice/VibratorHalController.cpp b/services/vibratorservice/VibratorHalController.cpp index c1795f5c32..283a5f0301 100644 --- a/services/vibratorservice/VibratorHalController.cpp +++ b/services/vibratorservice/VibratorHalController.cpp @@ -16,9 +16,9 @@ #define LOG_TAG "VibratorHalController" +#include <aidl/android/hardware/vibrator/IVibrator.h> +#include <android/binder_manager.h> #include <android/hardware/vibrator/1.3/IVibrator.h> -#include <android/hardware/vibrator/IVibrator.h> -#include <binder/IServiceManager.h> #include <hardware/vibrator.h> #include <utils/Log.h> @@ -27,10 +27,10 @@ #include <vibratorservice/VibratorHalController.h> #include <vibratorservice/VibratorHalWrapper.h> -using android::hardware::vibrator::CompositeEffect; -using android::hardware::vibrator::CompositePrimitive; -using android::hardware::vibrator::Effect; -using android::hardware::vibrator::EffectStrength; +using aidl::android::hardware::vibrator::CompositeEffect; +using aidl::android::hardware::vibrator::CompositePrimitive; +using aidl::android::hardware::vibrator::Effect; +using aidl::android::hardware::vibrator::EffectStrength; using std::chrono::milliseconds; @@ -38,7 +38,7 @@ namespace V1_0 = android::hardware::vibrator::V1_0; namespace V1_1 = android::hardware::vibrator::V1_1; namespace V1_2 = android::hardware::vibrator::V1_2; namespace V1_3 = android::hardware::vibrator::V1_3; -namespace Aidl = android::hardware::vibrator; +namespace Aidl = aidl::android::hardware::vibrator; namespace android { @@ -53,10 +53,14 @@ std::shared_ptr<HalWrapper> connectHal(std::shared_ptr<CallbackScheduler> schedu return nullptr; } - sp<Aidl::IVibrator> aidlHal = waitForVintfService<Aidl::IVibrator>(); - if (aidlHal) { - ALOGV("Successfully connected to Vibrator HAL AIDL service."); - return std::make_shared<AidlHalWrapper>(std::move(scheduler), aidlHal); + auto serviceName = std::string(Aidl::IVibrator::descriptor) + "/default"; + if (AServiceManager_isDeclared(serviceName.c_str())) { + std::shared_ptr<Aidl::IVibrator> hal = Aidl::IVibrator::fromBinder( + ndk::SpAIBinder(AServiceManager_waitForService(serviceName.c_str()))); + if (hal) { + ALOGV("Successfully connected to Vibrator HAL AIDL service."); + return std::make_shared<AidlHalWrapper>(std::move(scheduler), std::move(hal)); + } } sp<V1_0::IVibrator> halV1_0 = V1_0::IVibrator::getService(); diff --git a/services/vibratorservice/VibratorHalWrapper.cpp b/services/vibratorservice/VibratorHalWrapper.cpp index f10ba44d74..abe78f0ef0 100644 --- a/services/vibratorservice/VibratorHalWrapper.cpp +++ b/services/vibratorservice/VibratorHalWrapper.cpp @@ -16,8 +16,8 @@ #define LOG_TAG "VibratorHalWrapper" +#include <aidl/android/hardware/vibrator/IVibrator.h> #include <android/hardware/vibrator/1.3/IVibrator.h> -#include <android/hardware/vibrator/IVibrator.h> #include <hardware/vibrator.h> #include <cmath> @@ -26,12 +26,12 @@ #include <vibratorservice/VibratorCallbackScheduler.h> #include <vibratorservice/VibratorHalWrapper.h> -using android::hardware::vibrator::Braking; -using android::hardware::vibrator::CompositeEffect; -using android::hardware::vibrator::CompositePrimitive; -using android::hardware::vibrator::Effect; -using android::hardware::vibrator::EffectStrength; -using android::hardware::vibrator::PrimitivePwle; +using aidl::android::hardware::vibrator::Braking; +using aidl::android::hardware::vibrator::CompositeEffect; +using aidl::android::hardware::vibrator::CompositePrimitive; +using aidl::android::hardware::vibrator::Effect; +using aidl::android::hardware::vibrator::EffectStrength; +using aidl::android::hardware::vibrator::PrimitivePwle; using std::chrono::milliseconds; @@ -39,7 +39,7 @@ namespace V1_0 = android::hardware::vibrator::V1_0; namespace V1_1 = android::hardware::vibrator::V1_1; namespace V1_2 = android::hardware::vibrator::V1_2; namespace V1_3 = android::hardware::vibrator::V1_3; -namespace Aidl = android::hardware::vibrator; +namespace Aidl = aidl::android::hardware::vibrator; namespace android { @@ -200,7 +200,7 @@ HalResult<std::vector<float>> HalWrapper::getMaxAmplitudesInternal() { // ------------------------------------------------------------------------------------------------- HalResult<void> AidlHalWrapper::ping() { - return HalResultFactory::fromStatus(IInterface::asBinder(getHal())->pingBinder()); + return HalResultFactory::fromStatus(AIBinder_ping(getHal()->asBinder().get())); } void AidlHalWrapper::tryReconnect() { @@ -208,7 +208,7 @@ void AidlHalWrapper::tryReconnect() { if (!result.isOk()) { return; } - sp<Aidl::IVibrator> newHandle = result.value(); + std::shared_ptr<Aidl::IVibrator> newHandle = result.value(); if (newHandle) { std::lock_guard<std::mutex> lock(mHandleMutex); mHandle = std::move(newHandle); @@ -220,7 +220,8 @@ HalResult<void> AidlHalWrapper::on(milliseconds timeout, HalResult<Capabilities> capabilities = getCapabilities(); bool supportsCallback = capabilities.isOk() && static_cast<int32_t>(capabilities.value() & Capabilities::ON_CALLBACK); - auto cb = supportsCallback ? new HalCallbackWrapper(completionCallback) : nullptr; + auto cb = supportsCallback ? ndk::SharedRefBase::make<HalCallbackWrapper>(completionCallback) + : nullptr; auto ret = HalResultFactory::fromStatus(getHal()->on(timeout.count(), cb)); if (!supportsCallback && ret.isOk()) { @@ -255,13 +256,14 @@ HalResult<milliseconds> AidlHalWrapper::performEffect( HalResult<Capabilities> capabilities = getCapabilities(); bool supportsCallback = capabilities.isOk() && static_cast<int32_t>(capabilities.value() & Capabilities::PERFORM_CALLBACK); - auto cb = supportsCallback ? new HalCallbackWrapper(completionCallback) : nullptr; + auto cb = supportsCallback ? ndk::SharedRefBase::make<HalCallbackWrapper>(completionCallback) + : nullptr; int32_t lengthMs; - auto result = getHal()->perform(effect, strength, cb, &lengthMs); + auto status = getHal()->perform(effect, strength, cb, &lengthMs); milliseconds length = milliseconds(lengthMs); - auto ret = HalResultFactory::fromStatus<milliseconds>(result, length); + auto ret = HalResultFactory::fromStatus<milliseconds>(std::move(status), length); if (!supportsCallback && ret.isOk()) { mCallbackScheduler->schedule(completionCallback, length); } @@ -273,7 +275,7 @@ HalResult<milliseconds> AidlHalWrapper::performComposedEffect( const std::vector<CompositeEffect>& primitives, const std::function<void()>& completionCallback) { // This method should always support callbacks, so no need to double check. - auto cb = new HalCallbackWrapper(completionCallback); + auto cb = ndk::SharedRefBase::make<HalCallbackWrapper>(completionCallback); auto durations = getPrimitiveDurations().valueOr({}); milliseconds duration(0); @@ -294,40 +296,40 @@ HalResult<milliseconds> AidlHalWrapper::performComposedEffect( HalResult<void> AidlHalWrapper::performPwleEffect(const std::vector<PrimitivePwle>& primitives, const std::function<void()>& completionCallback) { // This method should always support callbacks, so no need to double check. - auto cb = new HalCallbackWrapper(completionCallback); + auto cb = ndk::SharedRefBase::make<HalCallbackWrapper>(completionCallback); return HalResultFactory::fromStatus(getHal()->composePwle(primitives, cb)); } HalResult<Capabilities> AidlHalWrapper::getCapabilitiesInternal() { - int32_t capabilities = 0; - auto result = getHal()->getCapabilities(&capabilities); - return HalResultFactory::fromStatus<Capabilities>(result, - static_cast<Capabilities>(capabilities)); + int32_t cap = 0; + auto status = getHal()->getCapabilities(&cap); + auto capabilities = static_cast<Capabilities>(cap); + return HalResultFactory::fromStatus<Capabilities>(std::move(status), capabilities); } HalResult<std::vector<Effect>> AidlHalWrapper::getSupportedEffectsInternal() { std::vector<Effect> supportedEffects; - auto result = getHal()->getSupportedEffects(&supportedEffects); - return HalResultFactory::fromStatus<std::vector<Effect>>(result, supportedEffects); + auto status = getHal()->getSupportedEffects(&supportedEffects); + return HalResultFactory::fromStatus<std::vector<Effect>>(std::move(status), supportedEffects); } HalResult<std::vector<Braking>> AidlHalWrapper::getSupportedBrakingInternal() { std::vector<Braking> supportedBraking; - auto result = getHal()->getSupportedBraking(&supportedBraking); - return HalResultFactory::fromStatus<std::vector<Braking>>(result, supportedBraking); + auto status = getHal()->getSupportedBraking(&supportedBraking); + return HalResultFactory::fromStatus<std::vector<Braking>>(std::move(status), supportedBraking); } HalResult<std::vector<CompositePrimitive>> AidlHalWrapper::getSupportedPrimitivesInternal() { std::vector<CompositePrimitive> supportedPrimitives; - auto result = getHal()->getSupportedPrimitives(&supportedPrimitives); - return HalResultFactory::fromStatus<std::vector<CompositePrimitive>>(result, + auto status = getHal()->getSupportedPrimitives(&supportedPrimitives); + return HalResultFactory::fromStatus<std::vector<CompositePrimitive>>(std::move(status), supportedPrimitives); } HalResult<std::vector<milliseconds>> AidlHalWrapper::getPrimitiveDurationsInternal( const std::vector<CompositePrimitive>& supportedPrimitives) { std::vector<milliseconds> durations; - constexpr auto primitiveRange = enum_range<CompositePrimitive>(); + constexpr auto primitiveRange = ndk::enum_range<CompositePrimitive>(); constexpr auto primitiveCount = std::distance(primitiveRange.begin(), primitiveRange.end()); durations.resize(primitiveCount); @@ -340,8 +342,8 @@ HalResult<std::vector<milliseconds>> AidlHalWrapper::getPrimitiveDurationsIntern continue; } int32_t duration = 0; - auto result = getHal()->getPrimitiveDuration(primitive, &duration); - auto halResult = HalResultFactory::fromStatus<int32_t>(result, duration); + auto status = getHal()->getPrimitiveDuration(primitive, &duration); + auto halResult = HalResultFactory::fromStatus<int32_t>(std::move(status), duration); if (halResult.isUnsupported()) { // Should not happen, supported primitives should always support requesting duration. ALOGE("Supported primitive %zu returned unsupported for getPrimitiveDuration", @@ -349,7 +351,7 @@ HalResult<std::vector<milliseconds>> AidlHalWrapper::getPrimitiveDurationsIntern } if (halResult.isFailed()) { // Fail entire request if one request has failed. - return HalResult<std::vector<milliseconds>>::failed(result.toString8().c_str()); + return HalResult<std::vector<milliseconds>>::failed(status.getMessage()); } durations[primitiveIdx] = milliseconds(duration); } @@ -359,59 +361,59 @@ HalResult<std::vector<milliseconds>> AidlHalWrapper::getPrimitiveDurationsIntern HalResult<milliseconds> AidlHalWrapper::getPrimitiveDelayMaxInternal() { int32_t delay = 0; - auto result = getHal()->getCompositionDelayMax(&delay); - return HalResultFactory::fromStatus<milliseconds>(result, milliseconds(delay)); + auto status = getHal()->getCompositionDelayMax(&delay); + return HalResultFactory::fromStatus<milliseconds>(std::move(status), milliseconds(delay)); } HalResult<milliseconds> AidlHalWrapper::getPrimitiveDurationMaxInternal() { int32_t delay = 0; - auto result = getHal()->getPwlePrimitiveDurationMax(&delay); - return HalResultFactory::fromStatus<milliseconds>(result, milliseconds(delay)); + auto status = getHal()->getPwlePrimitiveDurationMax(&delay); + return HalResultFactory::fromStatus<milliseconds>(std::move(status), milliseconds(delay)); } HalResult<int32_t> AidlHalWrapper::getCompositionSizeMaxInternal() { int32_t size = 0; - auto result = getHal()->getCompositionSizeMax(&size); - return HalResultFactory::fromStatus<int32_t>(result, size); + auto status = getHal()->getCompositionSizeMax(&size); + return HalResultFactory::fromStatus<int32_t>(std::move(status), size); } HalResult<int32_t> AidlHalWrapper::getPwleSizeMaxInternal() { int32_t size = 0; - auto result = getHal()->getPwleCompositionSizeMax(&size); - return HalResultFactory::fromStatus<int32_t>(result, size); + auto status = getHal()->getPwleCompositionSizeMax(&size); + return HalResultFactory::fromStatus<int32_t>(std::move(status), size); } HalResult<float> AidlHalWrapper::getMinFrequencyInternal() { float minFrequency = 0; - auto result = getHal()->getFrequencyMinimum(&minFrequency); - return HalResultFactory::fromStatus<float>(result, minFrequency); + auto status = getHal()->getFrequencyMinimum(&minFrequency); + return HalResultFactory::fromStatus<float>(std::move(status), minFrequency); } HalResult<float> AidlHalWrapper::getResonantFrequencyInternal() { float f0 = 0; - auto result = getHal()->getResonantFrequency(&f0); - return HalResultFactory::fromStatus<float>(result, f0); + auto status = getHal()->getResonantFrequency(&f0); + return HalResultFactory::fromStatus<float>(std::move(status), f0); } HalResult<float> AidlHalWrapper::getFrequencyResolutionInternal() { float frequencyResolution = 0; - auto result = getHal()->getFrequencyResolution(&frequencyResolution); - return HalResultFactory::fromStatus<float>(result, frequencyResolution); + auto status = getHal()->getFrequencyResolution(&frequencyResolution); + return HalResultFactory::fromStatus<float>(std::move(status), frequencyResolution); } HalResult<float> AidlHalWrapper::getQFactorInternal() { float qFactor = 0; - auto result = getHal()->getQFactor(&qFactor); - return HalResultFactory::fromStatus<float>(result, qFactor); + auto status = getHal()->getQFactor(&qFactor); + return HalResultFactory::fromStatus<float>(std::move(status), qFactor); } HalResult<std::vector<float>> AidlHalWrapper::getMaxAmplitudesInternal() { std::vector<float> amplitudes; - auto result = getHal()->getBandwidthAmplitudeMap(&litudes); - return HalResultFactory::fromStatus<std::vector<float>>(result, amplitudes); + auto status = getHal()->getBandwidthAmplitudeMap(&litudes); + return HalResultFactory::fromStatus<std::vector<float>>(std::move(status), amplitudes); } -sp<Aidl::IVibrator> AidlHalWrapper::getHal() { +std::shared_ptr<Aidl::IVibrator> AidlHalWrapper::getHal() { std::lock_guard<std::mutex> lock(mHandleMutex); return mHandle; } @@ -420,8 +422,7 @@ sp<Aidl::IVibrator> AidlHalWrapper::getHal() { template <typename I> HalResult<void> HidlHalWrapper<I>::ping() { - auto result = getHal()->ping(); - return HalResultFactory::fromReturn(result); + return HalResultFactory::fromReturn(getHal()->ping()); } template <typename I> @@ -436,8 +437,8 @@ void HidlHalWrapper<I>::tryReconnect() { template <typename I> HalResult<void> HidlHalWrapper<I>::on(milliseconds timeout, const std::function<void()>& completionCallback) { - auto result = getHal()->on(timeout.count()); - auto ret = HalResultFactory::fromStatus(result.withDefault(V1_0::Status::UNKNOWN_ERROR)); + auto status = getHal()->on(timeout.count()); + auto ret = HalResultFactory::fromStatus(status.withDefault(V1_0::Status::UNKNOWN_ERROR)); if (ret.isOk()) { mCallbackScheduler->schedule(completionCallback, timeout); } @@ -446,15 +447,15 @@ HalResult<void> HidlHalWrapper<I>::on(milliseconds timeout, template <typename I> HalResult<void> HidlHalWrapper<I>::off() { - auto result = getHal()->off(); - return HalResultFactory::fromStatus(result.withDefault(V1_0::Status::UNKNOWN_ERROR)); + auto status = getHal()->off(); + return HalResultFactory::fromStatus(status.withDefault(V1_0::Status::UNKNOWN_ERROR)); } template <typename I> HalResult<void> HidlHalWrapper<I>::setAmplitude(float amplitude) { uint8_t amp = static_cast<uint8_t>(amplitude * std::numeric_limits<uint8_t>::max()); - auto result = getHal()->setAmplitude(amp); - return HalResultFactory::fromStatus(result.withDefault(V1_0::Status::UNKNOWN_ERROR)); + auto status = getHal()->setAmplitude(amp); + return HalResultFactory::fromStatus(status.withDefault(V1_0::Status::UNKNOWN_ERROR)); } template <typename I> @@ -480,7 +481,7 @@ HalResult<Capabilities> HidlHalWrapper<I>::getCapabilitiesInternal() { hardware::Return<bool> result = getHal()->supportsAmplitudeControl(); Capabilities capabilities = result.withDefault(false) ? Capabilities::AMPLITUDE_CONTROL : Capabilities::NONE; - return HalResultFactory::fromReturn<Capabilities>(result, capabilities); + return HalResultFactory::fromReturn<Capabilities>(std::move(result), capabilities); } template <typename I> @@ -499,7 +500,7 @@ HalResult<milliseconds> HidlHalWrapper<I>::performInternal( auto result = std::invoke(performFn, handle, effect, effectStrength, effectCallback); milliseconds length = milliseconds(lengthMs); - auto ret = HalResultFactory::fromReturn<milliseconds>(result, status, length); + auto ret = HalResultFactory::fromReturn<milliseconds>(std::move(result), status, length); if (ret.isOk()) { mCallbackScheduler->schedule(completionCallback, length); } @@ -604,7 +605,7 @@ HalResult<Capabilities> HidlHalWrapperV1_3::getCapabilitiesInternal() { sp<V1_3::IVibrator> hal = getHal(); auto amplitudeResult = hal->supportsAmplitudeControl(); if (!amplitudeResult.isOk()) { - return HalResultFactory::fromReturn<Capabilities>(amplitudeResult, capabilities); + return HalResultFactory::fromReturn<Capabilities>(std::move(amplitudeResult), capabilities); } auto externalControlResult = hal->supportsExternalControl(); @@ -619,7 +620,8 @@ HalResult<Capabilities> HidlHalWrapperV1_3::getCapabilitiesInternal() { } } - return HalResultFactory::fromReturn<Capabilities>(externalControlResult, capabilities); + return HalResultFactory::fromReturn<Capabilities>(std::move(externalControlResult), + capabilities); } // ------------------------------------------------------------------------------------------------- diff --git a/services/vibratorservice/VibratorManagerHalController.cpp b/services/vibratorservice/VibratorManagerHalController.cpp index aa5b7fc86f..ba35d15bf2 100644 --- a/services/vibratorservice/VibratorManagerHalController.cpp +++ b/services/vibratorservice/VibratorManagerHalController.cpp @@ -20,7 +20,7 @@ #include <vibratorservice/VibratorManagerHalController.h> -namespace Aidl = android::hardware::vibrator; +namespace Aidl = aidl::android::hardware::vibrator; namespace android { @@ -29,10 +29,15 @@ namespace vibrator { std::shared_ptr<ManagerHalWrapper> connectManagerHal(std::shared_ptr<CallbackScheduler> scheduler) { static bool gHalExists = true; if (gHalExists) { - sp<Aidl::IVibratorManager> hal = waitForVintfService<Aidl::IVibratorManager>(); - if (hal) { - ALOGV("Successfully connected to VibratorManager HAL AIDL service."); - return std::make_shared<AidlManagerHalWrapper>(std::move(scheduler), hal); + auto serviceName = std::string(Aidl::IVibratorManager::descriptor) + "/default"; + if (AServiceManager_isDeclared(serviceName.c_str())) { + std::shared_ptr<Aidl::IVibratorManager> hal = Aidl::IVibratorManager::fromBinder( + ndk::SpAIBinder(AServiceManager_checkService(serviceName.c_str()))); + if (hal) { + ALOGV("Successfully connected to VibratorManager HAL AIDL service."); + return std::make_shared<AidlManagerHalWrapper>(std::move(scheduler), + std::move(hal)); + } } } diff --git a/services/vibratorservice/VibratorManagerHalWrapper.cpp b/services/vibratorservice/VibratorManagerHalWrapper.cpp index 13412667e0..93ec781b21 100644 --- a/services/vibratorservice/VibratorManagerHalWrapper.cpp +++ b/services/vibratorservice/VibratorManagerHalWrapper.cpp @@ -20,7 +20,7 @@ #include <vibratorservice/VibratorManagerHalWrapper.h> -namespace Aidl = android::hardware::vibrator; +namespace Aidl = aidl::android::hardware::vibrator; namespace android { @@ -75,10 +75,11 @@ HalResult<void> LegacyManagerHalWrapper::cancelSynced() { std::shared_ptr<HalWrapper> AidlManagerHalWrapper::connectToVibrator( int32_t vibratorId, std::shared_ptr<CallbackScheduler> callbackScheduler) { - std::function<HalResult<sp<Aidl::IVibrator>>()> reconnectFn = [=, this]() { - sp<Aidl::IVibrator> vibrator; - auto result = this->getHal()->getVibrator(vibratorId, &vibrator); - return HalResultFactory::fromStatus<sp<Aidl::IVibrator>>(result, vibrator); + std::function<HalResult<std::shared_ptr<Aidl::IVibrator>>()> reconnectFn = [=, this]() { + std::shared_ptr<Aidl::IVibrator> vibrator; + auto status = this->getHal()->getVibrator(vibratorId, &vibrator); + return HalResultFactory::fromStatus<std::shared_ptr<Aidl::IVibrator>>(std::move(status), + vibrator); }; auto result = reconnectFn(); if (!result.isOk()) { @@ -93,11 +94,13 @@ std::shared_ptr<HalWrapper> AidlManagerHalWrapper::connectToVibrator( } HalResult<void> AidlManagerHalWrapper::ping() { - return HalResultFactory::fromStatus(IInterface::asBinder(getHal())->pingBinder()); + return HalResultFactory::fromStatus(AIBinder_ping(getHal()->asBinder().get())); } void AidlManagerHalWrapper::tryReconnect() { - sp<Aidl::IVibratorManager> newHandle = checkVintfService<Aidl::IVibratorManager>(); + auto aidlServiceName = std::string(Aidl::IVibratorManager::descriptor) + "/default"; + std::shared_ptr<Aidl::IVibratorManager> newHandle = Aidl::IVibratorManager::fromBinder( + ndk::SpAIBinder(AServiceManager_checkService(aidlServiceName.c_str()))); if (newHandle) { std::lock_guard<std::mutex> lock(mHandleMutex); mHandle = std::move(newHandle); @@ -111,9 +114,9 @@ HalResult<ManagerCapabilities> AidlManagerHalWrapper::getCapabilities() { return HalResult<ManagerCapabilities>::ok(*mCapabilities); } int32_t cap = 0; - auto result = getHal()->getCapabilities(&cap); + auto status = getHal()->getCapabilities(&cap); auto capabilities = static_cast<ManagerCapabilities>(cap); - auto ret = HalResultFactory::fromStatus<ManagerCapabilities>(result, capabilities); + auto ret = HalResultFactory::fromStatus<ManagerCapabilities>(std::move(status), capabilities); if (ret.isOk()) { // Cache copy of returned value. mCapabilities.emplace(ret.value()); @@ -128,8 +131,8 @@ HalResult<std::vector<int32_t>> AidlManagerHalWrapper::getVibratorIds() { return HalResult<std::vector<int32_t>>::ok(*mVibratorIds); } std::vector<int32_t> ids; - auto result = getHal()->getVibratorIds(&ids); - auto ret = HalResultFactory::fromStatus<std::vector<int32_t>>(result, ids); + auto status = getHal()->getVibratorIds(&ids); + auto ret = HalResultFactory::fromStatus<std::vector<int32_t>>(std::move(status), ids); if (ret.isOk()) { // Cache copy of returned value and the individual controllers. mVibratorIds.emplace(ret.value()); @@ -178,7 +181,8 @@ HalResult<void> AidlManagerHalWrapper::triggerSynced( HalResult<ManagerCapabilities> capabilities = getCapabilities(); bool supportsCallback = capabilities.isOk() && static_cast<int32_t>(capabilities.value() & ManagerCapabilities::TRIGGER_CALLBACK); - auto cb = supportsCallback ? new HalCallbackWrapper(completionCallback) : nullptr; + auto cb = supportsCallback ? ndk::SharedRefBase::make<HalCallbackWrapper>(completionCallback) + : nullptr; return HalResultFactory::fromStatus(getHal()->triggerSynced(cb)); } @@ -196,7 +200,7 @@ HalResult<void> AidlManagerHalWrapper::cancelSynced() { return ret; } -sp<Aidl::IVibratorManager> AidlManagerHalWrapper::getHal() { +std::shared_ptr<Aidl::IVibratorManager> AidlManagerHalWrapper::getHal() { std::lock_guard<std::mutex> lock(mHandleMutex); return mHandle; } diff --git a/services/vibratorservice/benchmarks/Android.bp b/services/vibratorservice/benchmarks/Android.bp index 5437995899..5bb8cebe49 100644 --- a/services/vibratorservice/benchmarks/Android.bp +++ b/services/vibratorservice/benchmarks/Android.bp @@ -28,12 +28,12 @@ cc_benchmark { "VibratorHalControllerBenchmarks.cpp", ], shared_libs: [ - "libbinder", + "libbinder_ndk", "libhidlbase", "liblog", "libutils", "libvibratorservice", - "android.hardware.vibrator-V2-cpp", + "android.hardware.vibrator-V2-ndk", "android.hardware.vibrator@1.0", "android.hardware.vibrator@1.1", "android.hardware.vibrator@1.2", diff --git a/services/vibratorservice/benchmarks/VibratorHalControllerBenchmarks.cpp b/services/vibratorservice/benchmarks/VibratorHalControllerBenchmarks.cpp index 9b30337885..5c7c9f46c1 100644 --- a/services/vibratorservice/benchmarks/VibratorHalControllerBenchmarks.cpp +++ b/services/vibratorservice/benchmarks/VibratorHalControllerBenchmarks.cpp @@ -16,16 +16,15 @@ #define LOG_TAG "VibratorHalControllerBenchmarks" +#include <android/binder_process.h> #include <benchmark/benchmark.h> -#include <binder/ProcessState.h> #include <vibratorservice/VibratorHalController.h> #include <future> -using ::android::enum_range; -using ::android::hardware::vibrator::CompositeEffect; -using ::android::hardware::vibrator::CompositePrimitive; -using ::android::hardware::vibrator::Effect; -using ::android::hardware::vibrator::EffectStrength; +using ::aidl::android::hardware::vibrator::CompositeEffect; +using ::aidl::android::hardware::vibrator::CompositePrimitive; +using ::aidl::android::hardware::vibrator::Effect; +using ::aidl::android::hardware::vibrator::EffectStrength; using ::benchmark::Counter; using ::benchmark::Fixture; using ::benchmark::kMicrosecond; @@ -115,8 +114,8 @@ private: class VibratorBench : public Fixture { public: void SetUp(State& /*state*/) override { - android::ProcessState::self()->setThreadPoolMaxThreadCount(1); - android::ProcessState::self()->startThreadPool(); + ABinderProcess_setThreadPoolMaxThreadCount(1); + ABinderProcess_startThreadPool(); mController.init(); } @@ -388,11 +387,11 @@ public: return; } - for (const auto& effect : enum_range<Effect>()) { + for (const auto& effect : ndk::enum_range<Effect>()) { if (std::find(supported.begin(), supported.end(), effect) == supported.end()) { continue; } - for (const auto& strength : enum_range<EffectStrength>()) { + for (const auto& strength : ndk::enum_range<EffectStrength>()) { b->Args({static_cast<long>(effect), static_cast<long>(strength)}); } } @@ -533,7 +532,7 @@ public: return; } - for (const auto& primitive : enum_range<CompositePrimitive>()) { + for (const auto& primitive : ndk::enum_range<CompositePrimitive>()) { if (std::find(supported.begin(), supported.end(), primitive) == supported.end()) { continue; } diff --git a/services/vibratorservice/include/vibratorservice/VibratorHalController.h b/services/vibratorservice/include/vibratorservice/VibratorHalController.h index f97442ddee..a1cb3fad35 100644 --- a/services/vibratorservice/include/vibratorservice/VibratorHalController.h +++ b/services/vibratorservice/include/vibratorservice/VibratorHalController.h @@ -17,8 +17,8 @@ #ifndef ANDROID_OS_VIBRATORHALCONTROLLER_H #define ANDROID_OS_VIBRATORHALCONTROLLER_H +#include <aidl/android/hardware/vibrator/IVibrator.h> #include <android-base/thread_annotations.h> -#include <android/hardware/vibrator/IVibrator.h> #include <vibratorservice/VibratorCallbackScheduler.h> #include <vibratorservice/VibratorHalWrapper.h> diff --git a/services/vibratorservice/include/vibratorservice/VibratorHalWrapper.h b/services/vibratorservice/include/vibratorservice/VibratorHalWrapper.h index 39c4eb441e..d4f7f1d387 100644 --- a/services/vibratorservice/include/vibratorservice/VibratorHalWrapper.h +++ b/services/vibratorservice/include/vibratorservice/VibratorHalWrapper.h @@ -17,10 +17,12 @@ #ifndef ANDROID_OS_VIBRATORHALWRAPPER_H #define ANDROID_OS_VIBRATORHALWRAPPER_H +#include <aidl/android/hardware/vibrator/BnVibratorCallback.h> +#include <aidl/android/hardware/vibrator/IVibrator.h> + #include <android-base/thread_annotations.h> +#include <android/binder_manager.h> #include <android/hardware/vibrator/1.3/IVibrator.h> -#include <android/hardware/vibrator/BnVibratorCallback.h> -#include <android/hardware/vibrator/IVibrator.h> #include <binder/IServiceManager.h> #include <vibratorservice/VibratorCallbackScheduler.h> @@ -98,43 +100,49 @@ private: class HalResultFactory { public: template <typename T> - static HalResult<T> fromStatus(binder::Status status, T data) { - return status.isOk() ? HalResult<T>::ok(data) : fromFailedStatus<T>(status); + static HalResult<T> fromStatus(ndk::ScopedAStatus&& status, T data) { + return status.isOk() ? HalResult<T>::ok(std::move(data)) + : fromFailedStatus<T>(std::move(status)); } template <typename T> - static HalResult<T> fromStatus(hardware::vibrator::V1_0::Status status, T data) { - return (status == hardware::vibrator::V1_0::Status::OK) ? HalResult<T>::ok(data) - : fromFailedStatus<T>(status); + static HalResult<T> fromStatus(hardware::vibrator::V1_0::Status&& status, T data) { + return (status == hardware::vibrator::V1_0::Status::OK) + ? HalResult<T>::ok(std::move(data)) + : fromFailedStatus<T>(std::move(status)); } template <typename T, typename R> - static HalResult<T> fromReturn(hardware::Return<R>& ret, T data) { - return ret.isOk() ? HalResult<T>::ok(data) : fromFailedReturn<T, R>(ret); + static HalResult<T> fromReturn(hardware::Return<R>&& ret, T data) { + return ret.isOk() ? HalResult<T>::ok(std::move(data)) + : fromFailedReturn<T, R>(std::move(ret)); } template <typename T, typename R> - static HalResult<T> fromReturn(hardware::Return<R>& ret, + static HalResult<T> fromReturn(hardware::Return<R>&& ret, hardware::vibrator::V1_0::Status status, T data) { - return ret.isOk() ? fromStatus<T>(status, data) : fromFailedReturn<T, R>(ret); + return ret.isOk() ? fromStatus<T>(std::move(status), std::move(data)) + : fromFailedReturn<T, R>(std::move(ret)); } static HalResult<void> fromStatus(status_t status) { - return (status == android::OK) ? HalResult<void>::ok() : fromFailedStatus<void>(status); + return (status == android::OK) ? HalResult<void>::ok() + : fromFailedStatus<void>(std::move(status)); } - static HalResult<void> fromStatus(binder::Status status) { - return status.isOk() ? HalResult<void>::ok() : fromFailedStatus<void>(status); + static HalResult<void> fromStatus(ndk::ScopedAStatus&& status) { + return status.isOk() ? HalResult<void>::ok() : fromFailedStatus<void>(std::move(status)); } - static HalResult<void> fromStatus(hardware::vibrator::V1_0::Status status) { - return (status == hardware::vibrator::V1_0::Status::OK) ? HalResult<void>::ok() - : fromFailedStatus<void>(status); + static HalResult<void> fromStatus(hardware::vibrator::V1_0::Status&& status) { + return (status == hardware::vibrator::V1_0::Status::OK) + ? HalResult<void>::ok() + : fromFailedStatus<void>(std::move(status)); } template <typename R> - static HalResult<void> fromReturn(hardware::Return<R>& ret) { - return ret.isOk() ? HalResult<void>::ok() : fromFailedReturn<void, R>(ret); + static HalResult<void> fromReturn(hardware::Return<R>&& ret) { + return ret.isOk() ? HalResult<void>::ok() : fromFailedReturn<void, R>(std::move(ret)); } private: @@ -146,21 +154,21 @@ private: } template <typename T> - static HalResult<T> fromFailedStatus(binder::Status status) { - if (status.exceptionCode() == binder::Status::EX_UNSUPPORTED_OPERATION || - status.transactionError() == android::UNKNOWN_TRANSACTION) { - // UNKNOWN_TRANSACTION means the HAL implementation is an older version, so this is - // the same as the operation being unsupported by this HAL. Should not retry. + static HalResult<T> fromFailedStatus(ndk::ScopedAStatus&& status) { + if (status.getExceptionCode() == EX_UNSUPPORTED_OPERATION || + status.getStatus() == STATUS_UNKNOWN_TRANSACTION) { + // STATUS_UNKNOWN_TRANSACTION means the HAL implementation is an older version, so this + // is the same as the operation being unsupported by this HAL. Should not retry. return HalResult<T>::unsupported(); } - if (status.exceptionCode() == binder::Status::EX_TRANSACTION_FAILED) { - return HalResult<T>::transactionFailed(status.toString8().c_str()); + if (status.getExceptionCode() == EX_TRANSACTION_FAILED) { + return HalResult<T>::transactionFailed(status.getMessage()); } - return HalResult<T>::failed(status.toString8().c_str()); + return HalResult<T>::failed(status.getMessage()); } template <typename T> - static HalResult<T> fromFailedStatus(hardware::vibrator::V1_0::Status status) { + static HalResult<T> fromFailedStatus(hardware::vibrator::V1_0::Status&& status) { switch (status) { case hardware::vibrator::V1_0::Status::UNSUPPORTED_OPERATION: return HalResult<T>::unsupported(); @@ -171,7 +179,7 @@ private: } template <typename T, typename R> - static HalResult<T> fromFailedReturn(hardware::Return<R>& ret) { + static HalResult<T> fromFailedReturn(hardware::Return<R>&& ret) { return ret.isDeadObject() ? HalResult<T>::transactionFailed(ret.description().c_str()) : HalResult<T>::failed(ret.description().c_str()); } @@ -179,14 +187,14 @@ private: // ------------------------------------------------------------------------------------------------- -class HalCallbackWrapper : public hardware::vibrator::BnVibratorCallback { +class HalCallbackWrapper : public aidl::android::hardware::vibrator::BnVibratorCallback { public: HalCallbackWrapper(std::function<void()> completionCallback) : mCompletionCallback(completionCallback) {} - binder::Status onComplete() override { + ndk::ScopedAStatus onComplete() override { mCompletionCallback(); - return binder::Status::ok(); + return ndk::ScopedAStatus::ok(); } private: @@ -198,14 +206,15 @@ private: // Vibrator HAL capabilities. enum class Capabilities : int32_t { NONE = 0, - ON_CALLBACK = hardware::vibrator::IVibrator::CAP_ON_CALLBACK, - PERFORM_CALLBACK = hardware::vibrator::IVibrator::CAP_PERFORM_CALLBACK, - AMPLITUDE_CONTROL = hardware::vibrator::IVibrator::CAP_AMPLITUDE_CONTROL, - EXTERNAL_CONTROL = hardware::vibrator::IVibrator::CAP_EXTERNAL_CONTROL, - EXTERNAL_AMPLITUDE_CONTROL = hardware::vibrator::IVibrator::CAP_EXTERNAL_AMPLITUDE_CONTROL, - COMPOSE_EFFECTS = hardware::vibrator::IVibrator::CAP_COMPOSE_EFFECTS, - COMPOSE_PWLE_EFFECTS = hardware::vibrator::IVibrator::CAP_COMPOSE_PWLE_EFFECTS, - ALWAYS_ON_CONTROL = hardware::vibrator::IVibrator::CAP_ALWAYS_ON_CONTROL, + ON_CALLBACK = aidl::android::hardware::vibrator::IVibrator::CAP_ON_CALLBACK, + PERFORM_CALLBACK = aidl::android::hardware::vibrator::IVibrator::CAP_PERFORM_CALLBACK, + AMPLITUDE_CONTROL = aidl::android::hardware::vibrator::IVibrator::CAP_AMPLITUDE_CONTROL, + EXTERNAL_CONTROL = aidl::android::hardware::vibrator::IVibrator::CAP_EXTERNAL_CONTROL, + EXTERNAL_AMPLITUDE_CONTROL = + aidl::android::hardware::vibrator::IVibrator::CAP_EXTERNAL_AMPLITUDE_CONTROL, + COMPOSE_EFFECTS = aidl::android::hardware::vibrator::IVibrator::CAP_COMPOSE_EFFECTS, + COMPOSE_PWLE_EFFECTS = aidl::android::hardware::vibrator::IVibrator::CAP_COMPOSE_PWLE_EFFECTS, + ALWAYS_ON_CONTROL = aidl::android::hardware::vibrator::IVibrator::CAP_ALWAYS_ON_CONTROL, }; inline Capabilities operator|(Capabilities lhs, Capabilities rhs) { @@ -230,10 +239,15 @@ inline Capabilities& operator&=(Capabilities& lhs, Capabilities rhs) { class Info { public: + using Effect = aidl::android::hardware::vibrator::Effect; + using EffectStrength = aidl::android::hardware::vibrator::EffectStrength; + using CompositePrimitive = aidl::android::hardware::vibrator::CompositePrimitive; + using Braking = aidl::android::hardware::vibrator::Braking; + const HalResult<Capabilities> capabilities; - const HalResult<std::vector<hardware::vibrator::Effect>> supportedEffects; - const HalResult<std::vector<hardware::vibrator::Braking>> supportedBraking; - const HalResult<std::vector<hardware::vibrator::CompositePrimitive>> supportedPrimitives; + const HalResult<std::vector<Effect>> supportedEffects; + const HalResult<std::vector<Braking>> supportedBraking; + const HalResult<std::vector<CompositePrimitive>> supportedPrimitives; const HalResult<std::vector<std::chrono::milliseconds>> primitiveDurations; const HalResult<std::chrono::milliseconds> primitiveDelayMax; const HalResult<std::chrono::milliseconds> pwlePrimitiveDurationMax; @@ -247,12 +261,9 @@ public: void logFailures() const { logFailure<Capabilities>(capabilities, "getCapabilities"); - logFailure<std::vector<hardware::vibrator::Effect>>(supportedEffects, - "getSupportedEffects"); - logFailure<std::vector<hardware::vibrator::Braking>>(supportedBraking, - "getSupportedBraking"); - logFailure<std::vector<hardware::vibrator::CompositePrimitive>>(supportedPrimitives, - "getSupportedPrimitives"); + logFailure<std::vector<Effect>>(supportedEffects, "getSupportedEffects"); + logFailure<std::vector<Braking>>(supportedBraking, "getSupportedBraking"); + logFailure<std::vector<CompositePrimitive>>(supportedPrimitives, "getSupportedPrimitives"); logFailure<std::vector<std::chrono::milliseconds>>(primitiveDurations, "getPrimitiveDuration"); logFailure<std::chrono::milliseconds>(primitiveDelayMax, "getPrimitiveDelayMax"); @@ -309,12 +320,12 @@ private: // Create a transaction failed results as default so we can retry on the first time we get them. static const constexpr char* MSG = "never loaded"; HalResult<Capabilities> mCapabilities = HalResult<Capabilities>::transactionFailed(MSG); - HalResult<std::vector<hardware::vibrator::Effect>> mSupportedEffects = - HalResult<std::vector<hardware::vibrator::Effect>>::transactionFailed(MSG); - HalResult<std::vector<hardware::vibrator::Braking>> mSupportedBraking = - HalResult<std::vector<hardware::vibrator::Braking>>::transactionFailed(MSG); - HalResult<std::vector<hardware::vibrator::CompositePrimitive>> mSupportedPrimitives = - HalResult<std::vector<hardware::vibrator::CompositePrimitive>>::transactionFailed(MSG); + HalResult<std::vector<Info::Effect>> mSupportedEffects = + HalResult<std::vector<Info::Effect>>::transactionFailed(MSG); + HalResult<std::vector<Info::Braking>> mSupportedBraking = + HalResult<std::vector<Info::Braking>>::transactionFailed(MSG); + HalResult<std::vector<Info::CompositePrimitive>> mSupportedPrimitives = + HalResult<std::vector<Info::CompositePrimitive>>::transactionFailed(MSG); HalResult<std::vector<std::chrono::milliseconds>> mPrimitiveDurations = HalResult<std::vector<std::chrono::milliseconds>>::transactionFailed(MSG); HalResult<std::chrono::milliseconds> mPrimitiveDelayMax = @@ -336,6 +347,13 @@ private: // Wrapper for Vibrator HAL handlers. class HalWrapper { public: + using Effect = aidl::android::hardware::vibrator::Effect; + using EffectStrength = aidl::android::hardware::vibrator::EffectStrength; + using CompositePrimitive = aidl::android::hardware::vibrator::CompositePrimitive; + using CompositeEffect = aidl::android::hardware::vibrator::CompositeEffect; + using Braking = aidl::android::hardware::vibrator::Braking; + using PrimitivePwle = aidl::android::hardware::vibrator::PrimitivePwle; + explicit HalWrapper(std::shared_ptr<CallbackScheduler> scheduler) : mCallbackScheduler(std::move(scheduler)) {} virtual ~HalWrapper() = default; @@ -355,21 +373,19 @@ public: virtual HalResult<void> setAmplitude(float amplitude) = 0; virtual HalResult<void> setExternalControl(bool enabled) = 0; - virtual HalResult<void> alwaysOnEnable(int32_t id, hardware::vibrator::Effect effect, - hardware::vibrator::EffectStrength strength) = 0; + virtual HalResult<void> alwaysOnEnable(int32_t id, Effect effect, EffectStrength strength) = 0; virtual HalResult<void> alwaysOnDisable(int32_t id) = 0; virtual HalResult<std::chrono::milliseconds> performEffect( - hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, + Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) = 0; virtual HalResult<std::chrono::milliseconds> performComposedEffect( - const std::vector<hardware::vibrator::CompositeEffect>& primitives, + const std::vector<CompositeEffect>& primitives, const std::function<void()>& completionCallback); - virtual HalResult<void> performPwleEffect( - const std::vector<hardware::vibrator::PrimitivePwle>& primitives, - const std::function<void()>& completionCallback); + virtual HalResult<void> performPwleEffect(const std::vector<PrimitivePwle>& primitives, + const std::function<void()>& completionCallback); protected: // Shared pointer to allow CallbackScheduler to outlive this wrapper. @@ -381,12 +397,11 @@ protected: // Request vibrator info to HAL skipping cache. virtual HalResult<Capabilities> getCapabilitiesInternal() = 0; - virtual HalResult<std::vector<hardware::vibrator::Effect>> getSupportedEffectsInternal(); - virtual HalResult<std::vector<hardware::vibrator::Braking>> getSupportedBrakingInternal(); - virtual HalResult<std::vector<hardware::vibrator::CompositePrimitive>> - getSupportedPrimitivesInternal(); + virtual HalResult<std::vector<Effect>> getSupportedEffectsInternal(); + virtual HalResult<std::vector<Braking>> getSupportedBrakingInternal(); + virtual HalResult<std::vector<CompositePrimitive>> getSupportedPrimitivesInternal(); virtual HalResult<std::vector<std::chrono::milliseconds>> getPrimitiveDurationsInternal( - const std::vector<hardware::vibrator::CompositePrimitive>& supportedPrimitives); + const std::vector<CompositePrimitive>& supportedPrimitives); virtual HalResult<std::chrono::milliseconds> getPrimitiveDelayMaxInternal(); virtual HalResult<std::chrono::milliseconds> getPrimitiveDurationMaxInternal(); virtual HalResult<int32_t> getCompositionSizeMaxInternal(); @@ -405,12 +420,17 @@ private: // Wrapper for the AIDL Vibrator HAL. class AidlHalWrapper : public HalWrapper { public: + using IVibrator = aidl::android::hardware::vibrator::IVibrator; + using reconnect_fn = std::function<HalResult<std::shared_ptr<IVibrator>>()>; + AidlHalWrapper( - std::shared_ptr<CallbackScheduler> scheduler, sp<hardware::vibrator::IVibrator> handle, - std::function<HalResult<sp<hardware::vibrator::IVibrator>>()> reconnectFn = + std::shared_ptr<CallbackScheduler> scheduler, std::shared_ptr<IVibrator> handle, + reconnect_fn reconnectFn = []() { - return HalResult<sp<hardware::vibrator::IVibrator>>::ok( - checkVintfService<hardware::vibrator::IVibrator>()); + auto serviceName = std::string(IVibrator::descriptor) + "/default"; + auto hal = IVibrator::fromBinder( + ndk::SpAIBinder(AServiceManager_checkService(serviceName.c_str()))); + return HalResult<std::shared_ptr<IVibrator>>::ok(std::move(hal)); }) : HalWrapper(std::move(scheduler)), mReconnectFn(reconnectFn), @@ -427,32 +447,29 @@ public: HalResult<void> setAmplitude(float amplitude) override final; HalResult<void> setExternalControl(bool enabled) override final; - HalResult<void> alwaysOnEnable(int32_t id, hardware::vibrator::Effect effect, - hardware::vibrator::EffectStrength strength) override final; + HalResult<void> alwaysOnEnable(int32_t id, Effect effect, + EffectStrength strength) override final; HalResult<void> alwaysOnDisable(int32_t id) override final; HalResult<std::chrono::milliseconds> performEffect( - hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, + Effect effect, EffectStrength strength, const std::function<void()>& completionCallback) override final; HalResult<std::chrono::milliseconds> performComposedEffect( - const std::vector<hardware::vibrator::CompositeEffect>& primitives, + const std::vector<CompositeEffect>& primitives, const std::function<void()>& completionCallback) override final; HalResult<void> performPwleEffect( - const std::vector<hardware::vibrator::PrimitivePwle>& primitives, + const std::vector<PrimitivePwle>& primitives, const std::function<void()>& completionCallback) override final; protected: HalResult<Capabilities> getCapabilitiesInternal() override final; - HalResult<std::vector<hardware::vibrator::Effect>> getSupportedEffectsInternal() override final; - HalResult<std::vector<hardware::vibrator::Braking>> getSupportedBrakingInternal() - override final; - HalResult<std::vector<hardware::vibrator::CompositePrimitive>> getSupportedPrimitivesInternal() - override final; + HalResult<std::vector<Effect>> getSupportedEffectsInternal() override final; + HalResult<std::vector<Braking>> getSupportedBrakingInternal() override final; + HalResult<std::vector<CompositePrimitive>> getSupportedPrimitivesInternal() override final; HalResult<std::vector<std::chrono::milliseconds>> getPrimitiveDurationsInternal( - const std::vector<hardware::vibrator::CompositePrimitive>& supportedPrimitives) - override final; + const std::vector<CompositePrimitive>& supportedPrimitives) override final; HalResult<std::chrono::milliseconds> getPrimitiveDelayMaxInternal() override final; HalResult<std::chrono::milliseconds> getPrimitiveDurationMaxInternal() override final; HalResult<int32_t> getCompositionSizeMaxInternal() override final; @@ -464,11 +481,11 @@ protected: HalResult<std::vector<float>> getMaxAmplitudesInternal() override final; private: - const std::function<HalResult<sp<hardware::vibrator::IVibrator>>()> mReconnectFn; + const reconnect_fn mReconnectFn; std::mutex mHandleMutex; - sp<hardware::vibrator::IVibrator> mHandle GUARDED_BY(mHandleMutex); + std::shared_ptr<IVibrator> mHandle GUARDED_BY(mHandleMutex); - sp<hardware::vibrator::IVibrator> getHal(); + std::shared_ptr<IVibrator> getHal(); }; // Wrapper for the HDIL Vibrator HALs. @@ -489,8 +506,8 @@ public: HalResult<void> setAmplitude(float amplitude) override final; virtual HalResult<void> setExternalControl(bool enabled) override; - HalResult<void> alwaysOnEnable(int32_t id, hardware::vibrator::Effect effect, - hardware::vibrator::EffectStrength strength) override final; + HalResult<void> alwaysOnEnable(int32_t id, HalWrapper::Effect effect, + HalWrapper::EffectStrength strength) override final; HalResult<void> alwaysOnDisable(int32_t id) override final; protected: @@ -506,8 +523,7 @@ protected: template <class T> HalResult<std::chrono::milliseconds> performInternal( - perform_fn<T> performFn, sp<I> handle, T effect, - hardware::vibrator::EffectStrength strength, + perform_fn<T> performFn, sp<I> handle, T effect, HalWrapper::EffectStrength strength, const std::function<void()>& completionCallback); sp<I> getHal(); @@ -523,7 +539,7 @@ public: virtual ~HidlHalWrapperV1_0() = default; HalResult<std::chrono::milliseconds> performEffect( - hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, + HalWrapper::Effect effect, HalWrapper::EffectStrength strength, const std::function<void()>& completionCallback) override final; }; @@ -537,7 +553,7 @@ public: virtual ~HidlHalWrapperV1_1() = default; HalResult<std::chrono::milliseconds> performEffect( - hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, + HalWrapper::Effect effect, HalWrapper::EffectStrength strength, const std::function<void()>& completionCallback) override final; }; @@ -551,7 +567,7 @@ public: virtual ~HidlHalWrapperV1_2() = default; HalResult<std::chrono::milliseconds> performEffect( - hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, + HalWrapper::Effect effect, HalWrapper::EffectStrength strength, const std::function<void()>& completionCallback) override final; }; @@ -567,7 +583,7 @@ public: HalResult<void> setExternalControl(bool enabled) override final; HalResult<std::chrono::milliseconds> performEffect( - hardware::vibrator::Effect effect, hardware::vibrator::EffectStrength strength, + HalWrapper::Effect effect, HalWrapper::EffectStrength strength, const std::function<void()>& completionCallback) override final; protected: diff --git a/services/vibratorservice/include/vibratorservice/VibratorManagerHalController.h b/services/vibratorservice/include/vibratorservice/VibratorManagerHalController.h index 9168565ca0..70c846b4ae 100644 --- a/services/vibratorservice/include/vibratorservice/VibratorManagerHalController.h +++ b/services/vibratorservice/include/vibratorservice/VibratorManagerHalController.h @@ -17,7 +17,7 @@ #ifndef ANDROID_OS_VIBRATOR_MANAGER_HAL_CONTROLLER_H #define ANDROID_OS_VIBRATOR_MANAGER_HAL_CONTROLLER_H -#include <android/hardware/vibrator/IVibratorManager.h> +#include <aidl/android/hardware/vibrator/IVibratorManager.h> #include <vibratorservice/VibratorHalController.h> #include <vibratorservice/VibratorManagerHalWrapper.h> #include <unordered_map> diff --git a/services/vibratorservice/include/vibratorservice/VibratorManagerHalWrapper.h b/services/vibratorservice/include/vibratorservice/VibratorManagerHalWrapper.h index 563f55e9f3..9e3f221fa7 100644 --- a/services/vibratorservice/include/vibratorservice/VibratorManagerHalWrapper.h +++ b/services/vibratorservice/include/vibratorservice/VibratorManagerHalWrapper.h @@ -17,7 +17,7 @@ #ifndef ANDROID_OS_VIBRATOR_MANAGER_HAL_WRAPPER_H #define ANDROID_OS_VIBRATOR_MANAGER_HAL_WRAPPER_H -#include <android/hardware/vibrator/IVibratorManager.h> +#include <aidl/android/hardware/vibrator/IVibratorManager.h> #include <vibratorservice/VibratorHalController.h> #include <unordered_map> @@ -28,14 +28,17 @@ namespace vibrator { // VibratorManager HAL capabilities. enum class ManagerCapabilities : int32_t { NONE = 0, - SYNC = hardware::vibrator::IVibratorManager::CAP_SYNC, - PREPARE_ON = hardware::vibrator::IVibratorManager::CAP_PREPARE_ON, - PREPARE_PERFORM = hardware::vibrator::IVibratorManager::CAP_PREPARE_PERFORM, - PREPARE_COMPOSE = hardware::vibrator::IVibratorManager::CAP_PREPARE_COMPOSE, - MIXED_TRIGGER_ON = hardware::vibrator::IVibratorManager::IVibratorManager::CAP_MIXED_TRIGGER_ON, - MIXED_TRIGGER_PERFORM = hardware::vibrator::IVibratorManager::CAP_MIXED_TRIGGER_PERFORM, - MIXED_TRIGGER_COMPOSE = hardware::vibrator::IVibratorManager::CAP_MIXED_TRIGGER_COMPOSE, - TRIGGER_CALLBACK = hardware::vibrator::IVibratorManager::CAP_TRIGGER_CALLBACK + SYNC = aidl::android::hardware::vibrator::IVibratorManager::CAP_SYNC, + PREPARE_ON = aidl::android::hardware::vibrator::IVibratorManager::CAP_PREPARE_ON, + PREPARE_PERFORM = aidl::android::hardware::vibrator::IVibratorManager::CAP_PREPARE_PERFORM, + PREPARE_COMPOSE = aidl::android::hardware::vibrator::IVibratorManager::CAP_PREPARE_COMPOSE, + MIXED_TRIGGER_ON = aidl::android::hardware::vibrator::IVibratorManager::IVibratorManager:: + CAP_MIXED_TRIGGER_ON, + MIXED_TRIGGER_PERFORM = + aidl::android::hardware::vibrator::IVibratorManager::CAP_MIXED_TRIGGER_PERFORM, + MIXED_TRIGGER_COMPOSE = + aidl::android::hardware::vibrator::IVibratorManager::CAP_MIXED_TRIGGER_COMPOSE, + TRIGGER_CALLBACK = aidl::android::hardware::vibrator::IVibratorManager::CAP_TRIGGER_CALLBACK }; inline ManagerCapabilities operator|(ManagerCapabilities lhs, ManagerCapabilities rhs) { @@ -106,8 +109,10 @@ private: // Wrapper for the AIDL VibratorManager HAL. class AidlManagerHalWrapper : public ManagerHalWrapper { public: + using VibratorManager = aidl::android::hardware::vibrator::IVibratorManager; + explicit AidlManagerHalWrapper(std::shared_ptr<CallbackScheduler> callbackScheduler, - sp<hardware::vibrator::IVibratorManager> handle) + std::shared_ptr<VibratorManager> handle) : mHandle(std::move(handle)), mCallbackScheduler(callbackScheduler) {} virtual ~AidlManagerHalWrapper() = default; @@ -126,14 +131,14 @@ private: std::mutex mHandleMutex; std::mutex mCapabilitiesMutex; std::mutex mVibratorsMutex; - sp<hardware::vibrator::IVibratorManager> mHandle GUARDED_BY(mHandleMutex); + std::shared_ptr<VibratorManager> mHandle GUARDED_BY(mHandleMutex); std::optional<ManagerCapabilities> mCapabilities GUARDED_BY(mCapabilitiesMutex); std::optional<std::vector<int32_t>> mVibratorIds GUARDED_BY(mVibratorsMutex); std::unordered_map<int32_t, std::shared_ptr<HalController>> mVibrators GUARDED_BY(mVibratorsMutex); std::shared_ptr<CallbackScheduler> mCallbackScheduler; - sp<hardware::vibrator::IVibratorManager> getHal(); + std::shared_ptr<VibratorManager> getHal(); std::shared_ptr<HalWrapper> connectToVibrator(int32_t vibratorId, std::shared_ptr<CallbackScheduler> scheduler); }; diff --git a/services/vibratorservice/test/Android.bp b/services/vibratorservice/test/Android.bp index be71dc2ce3..cd051232cc 100644 --- a/services/vibratorservice/test/Android.bp +++ b/services/vibratorservice/test/Android.bp @@ -44,12 +44,12 @@ cc_test { ], shared_libs: [ "libbase", - "libbinder", + "libbinder_ndk", "libhidlbase", "liblog", "libvibratorservice", "libutils", - "android.hardware.vibrator-V2-cpp", + "android.hardware.vibrator-V2-ndk", "android.hardware.vibrator@1.0", "android.hardware.vibrator@1.1", "android.hardware.vibrator@1.2", diff --git a/services/vibratorservice/test/VibratorHalControllerTest.cpp b/services/vibratorservice/test/VibratorHalControllerTest.cpp index 15fde914f6..f4c28981aa 100644 --- a/services/vibratorservice/test/VibratorHalControllerTest.cpp +++ b/services/vibratorservice/test/VibratorHalControllerTest.cpp @@ -16,7 +16,7 @@ #define LOG_TAG "VibratorHalControllerTest" -#include <android/hardware/vibrator/IVibrator.h> +#include <aidl/android/hardware/vibrator/IVibrator.h> #include <cutils/atomic.h> #include <gmock/gmock.h> @@ -29,10 +29,11 @@ #include <vibratorservice/VibratorHalController.h> #include <vibratorservice/VibratorHalWrapper.h> +#include "test_mocks.h" #include "test_utils.h" -using android::hardware::vibrator::Effect; -using android::hardware::vibrator::EffectStrength; +using aidl::android::hardware::vibrator::Effect; +using aidl::android::hardware::vibrator::EffectStrength; using std::chrono::milliseconds; @@ -46,41 +47,12 @@ static const auto PING_FN = [](vibrator::HalWrapper* hal) { return hal->ping(); // ------------------------------------------------------------------------------------------------- -class MockHalWrapper : public vibrator::HalWrapper { -public: - MockHalWrapper(std::shared_ptr<vibrator::CallbackScheduler> scheduler) - : HalWrapper(scheduler) {} - virtual ~MockHalWrapper() = default; - - MOCK_METHOD(vibrator::HalResult<void>, ping, (), (override)); - MOCK_METHOD(void, tryReconnect, (), (override)); - MOCK_METHOD(vibrator::HalResult<void>, on, - (milliseconds timeout, const std::function<void()>& completionCallback), - (override)); - MOCK_METHOD(vibrator::HalResult<void>, off, (), (override)); - MOCK_METHOD(vibrator::HalResult<void>, setAmplitude, (float amplitude), (override)); - MOCK_METHOD(vibrator::HalResult<void>, setExternalControl, (bool enabled), (override)); - MOCK_METHOD(vibrator::HalResult<void>, alwaysOnEnable, - (int32_t id, Effect effect, EffectStrength strength), (override)); - MOCK_METHOD(vibrator::HalResult<void>, alwaysOnDisable, (int32_t id), (override)); - MOCK_METHOD(vibrator::HalResult<milliseconds>, performEffect, - (Effect effect, EffectStrength strength, - const std::function<void()>& completionCallback), - (override)); - MOCK_METHOD(vibrator::HalResult<vibrator::Capabilities>, getCapabilitiesInternal, (), - (override)); - - vibrator::CallbackScheduler* getCallbackScheduler() { return mCallbackScheduler.get(); } -}; - -// ------------------------------------------------------------------------------------------------- - class VibratorHalControllerTest : public Test { public: void SetUp() override { mConnectCounter = 0; auto callbackScheduler = std::make_shared<vibrator::CallbackScheduler>(); - mMockHal = std::make_shared<StrictMock<MockHalWrapper>>(callbackScheduler); + mMockHal = std::make_shared<StrictMock<vibrator::MockHalWrapper>>(callbackScheduler); mController = std::make_unique< vibrator::HalController>(std::move(callbackScheduler), [&](std::shared_ptr<vibrator::CallbackScheduler>) { @@ -92,7 +64,7 @@ public: protected: int32_t mConnectCounter; - std::shared_ptr<MockHalWrapper> mMockHal; + std::shared_ptr<vibrator::MockHalWrapper> mMockHal; std::unique_ptr<vibrator::HalController> mController; }; diff --git a/services/vibratorservice/test/VibratorHalWrapperAidlTest.cpp b/services/vibratorservice/test/VibratorHalWrapperAidlTest.cpp index 03c9e77f3e..91717f635d 100644 --- a/services/vibratorservice/test/VibratorHalWrapperAidlTest.cpp +++ b/services/vibratorservice/test/VibratorHalWrapperAidlTest.cpp @@ -16,7 +16,7 @@ #define LOG_TAG "VibratorHalWrapperAidlTest" -#include <android/hardware/vibrator/IVibrator.h> +#include <aidl/android/hardware/vibrator/IVibrator.h> #include <gmock/gmock.h> #include <gtest/gtest.h> @@ -27,18 +27,17 @@ #include <vibratorservice/VibratorCallbackScheduler.h> #include <vibratorservice/VibratorHalWrapper.h> +#include "test_mocks.h" #include "test_utils.h" -using android::binder::Status; - -using android::hardware::vibrator::Braking; -using android::hardware::vibrator::CompositeEffect; -using android::hardware::vibrator::CompositePrimitive; -using android::hardware::vibrator::Effect; -using android::hardware::vibrator::EffectStrength; -using android::hardware::vibrator::IVibrator; -using android::hardware::vibrator::IVibratorCallback; -using android::hardware::vibrator::PrimitivePwle; +using aidl::android::hardware::vibrator::Braking; +using aidl::android::hardware::vibrator::CompositeEffect; +using aidl::android::hardware::vibrator::CompositePrimitive; +using aidl::android::hardware::vibrator::Effect; +using aidl::android::hardware::vibrator::EffectStrength; +using aidl::android::hardware::vibrator::IVibrator; +using aidl::android::hardware::vibrator::IVibratorCallback; +using aidl::android::hardware::vibrator::PrimitivePwle; using namespace android; using namespace std::chrono_literals; @@ -46,61 +45,10 @@ using namespace testing; // ------------------------------------------------------------------------------------------------- -class MockBinder : public BBinder { -public: - MOCK_METHOD(status_t, linkToDeath, - (const sp<DeathRecipient>& recipient, void* cookie, uint32_t flags), (override)); - MOCK_METHOD(status_t, unlinkToDeath, - (const wp<DeathRecipient>& recipient, void* cookie, uint32_t flags, - wp<DeathRecipient>* outRecipient), - (override)); - MOCK_METHOD(status_t, pingBinder, (), (override)); -}; - -class MockIVibrator : public IVibrator { -public: - MOCK_METHOD(Status, getCapabilities, (int32_t * ret), (override)); - MOCK_METHOD(Status, off, (), (override)); - MOCK_METHOD(Status, on, (int32_t timeout, const sp<IVibratorCallback>& cb), (override)); - MOCK_METHOD(Status, perform, - (Effect e, EffectStrength s, const sp<IVibratorCallback>& cb, int32_t* ret), - (override)); - MOCK_METHOD(Status, getSupportedEffects, (std::vector<Effect> * ret), (override)); - MOCK_METHOD(Status, setAmplitude, (float amplitude), (override)); - MOCK_METHOD(Status, setExternalControl, (bool enabled), (override)); - MOCK_METHOD(Status, getCompositionDelayMax, (int32_t * ret), (override)); - MOCK_METHOD(Status, getCompositionSizeMax, (int32_t * ret), (override)); - MOCK_METHOD(Status, getSupportedPrimitives, (std::vector<CompositePrimitive> * ret), - (override)); - MOCK_METHOD(Status, getPrimitiveDuration, (CompositePrimitive p, int32_t* ret), (override)); - MOCK_METHOD(Status, compose, - (const std::vector<CompositeEffect>& e, const sp<IVibratorCallback>& cb), - (override)); - MOCK_METHOD(Status, composePwle, - (const std::vector<PrimitivePwle>& e, const sp<IVibratorCallback>& cb), (override)); - MOCK_METHOD(Status, getSupportedAlwaysOnEffects, (std::vector<Effect> * ret), (override)); - MOCK_METHOD(Status, alwaysOnEnable, (int32_t id, Effect e, EffectStrength s), (override)); - MOCK_METHOD(Status, alwaysOnDisable, (int32_t id), (override)); - MOCK_METHOD(Status, getQFactor, (float * ret), (override)); - MOCK_METHOD(Status, getResonantFrequency, (float * ret), (override)); - MOCK_METHOD(Status, getFrequencyResolution, (float* ret), (override)); - MOCK_METHOD(Status, getFrequencyMinimum, (float* ret), (override)); - MOCK_METHOD(Status, getBandwidthAmplitudeMap, (std::vector<float> * ret), (override)); - MOCK_METHOD(Status, getPwlePrimitiveDurationMax, (int32_t * ret), (override)); - MOCK_METHOD(Status, getPwleCompositionSizeMax, (int32_t * ret), (override)); - MOCK_METHOD(Status, getSupportedBraking, (std::vector<Braking> * ret), (override)); - MOCK_METHOD(int32_t, getInterfaceVersion, (), (override)); - MOCK_METHOD(std::string, getInterfaceHash, (), (override)); - MOCK_METHOD(IBinder*, onAsBinder, (), (override)); -}; - -// ------------------------------------------------------------------------------------------------- - class VibratorHalWrapperAidlTest : public Test { public: void SetUp() override { - mMockBinder = new StrictMock<MockBinder>(); - mMockHal = new StrictMock<MockIVibrator>(); + mMockHal = ndk::SharedRefBase::make<StrictMock<vibrator::MockIVibrator>>(); mMockScheduler = std::make_shared<StrictMock<vibrator::MockCallbackScheduler>>(); mWrapper = std::make_unique<vibrator::AidlHalWrapper>(mMockScheduler, mMockHal); ASSERT_NE(mWrapper, nullptr); @@ -109,54 +57,28 @@ public: protected: std::shared_ptr<StrictMock<vibrator::MockCallbackScheduler>> mMockScheduler = nullptr; std::unique_ptr<vibrator::HalWrapper> mWrapper = nullptr; - sp<StrictMock<MockIVibrator>> mMockHal = nullptr; - sp<StrictMock<MockBinder>> mMockBinder = nullptr; + std::shared_ptr<StrictMock<vibrator::MockIVibrator>> mMockHal = nullptr; }; // ------------------------------------------------------------------------------------------------- -ACTION(TriggerCallbackInArg1) { - if (arg1 != nullptr) { - arg1->onComplete(); - } -} - -ACTION(TriggerCallbackInArg2) { - if (arg2 != nullptr) { - arg2->onComplete(); - } -} - -TEST_F(VibratorHalWrapperAidlTest, TestPing) { - EXPECT_CALL(*mMockHal.get(), onAsBinder()) - .Times(Exactly(2)) - .WillRepeatedly(Return(mMockBinder.get())); - EXPECT_CALL(*mMockBinder.get(), pingBinder()) - .Times(Exactly(2)) - .WillOnce(Return(android::OK)) - .WillRepeatedly(Return(android::DEAD_OBJECT)); - - ASSERT_TRUE(mWrapper->ping().isOk()); - ASSERT_TRUE(mWrapper->ping().isFailed()); -} - TEST_F(VibratorHalWrapperAidlTest, TestOnWithCallbackSupport) { { InSequence seq; EXPECT_CALL(*mMockHal.get(), getCapabilities(_)) .Times(Exactly(1)) - .WillRepeatedly( - DoAll(SetArgPointee<0>(IVibrator::CAP_ON_CALLBACK), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(IVibrator::CAP_ON_CALLBACK), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), on(Eq(10), _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(TriggerCallbackInArg1(), Return(Status()))); + .WillOnce(DoAll(WithArg<1>(vibrator::TriggerCallback()), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), on(Eq(100), _)) .Times(Exactly(1)) - .WillRepeatedly(Return( - Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))); EXPECT_CALL(*mMockHal.get(), on(Eq(1000), _)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))); } std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); @@ -179,20 +101,20 @@ TEST_F(VibratorHalWrapperAidlTest, TestOnWithoutCallbackSupport) { InSequence seq; EXPECT_CALL(*mMockHal.get(), getCapabilities(_)) .Times(Exactly(1)) - .WillRepeatedly( - DoAll(SetArgPointee<0>(IVibrator::CAP_COMPOSE_EFFECTS), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(IVibrator::CAP_COMPOSE_EFFECTS), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), on(Eq(10), _)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status())); + .WillOnce(Return(ndk::ScopedAStatus::ok())); EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); + .WillOnce(vibrator::TriggerSchedulerCallback()); EXPECT_CALL(*mMockHal.get(), on(Eq(11), _)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromStatusT(UNKNOWN_TRANSACTION))); + .WillOnce(Return(ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION))); EXPECT_CALL(*mMockHal.get(), on(Eq(12), _)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))); } std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); @@ -211,10 +133,9 @@ TEST_F(VibratorHalWrapperAidlTest, TestOnWithoutCallbackSupport) { TEST_F(VibratorHalWrapperAidlTest, TestOff) { EXPECT_CALL(*mMockHal.get(), off()) .Times(Exactly(3)) - .WillOnce(Return(Status())) - .WillOnce( - Return(Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))) - .WillRepeatedly(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))); + .WillOnce(Return(ndk::ScopedAStatus::ok())) + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))) + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))); ASSERT_TRUE(mWrapper->off().isOk()); ASSERT_TRUE(mWrapper->off().isUnsupported()); @@ -224,13 +145,15 @@ TEST_F(VibratorHalWrapperAidlTest, TestOff) { TEST_F(VibratorHalWrapperAidlTest, TestSetAmplitude) { { InSequence seq; - EXPECT_CALL(*mMockHal.get(), setAmplitude(Eq(0.1f))).Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), setAmplitude(Eq(0.1f))) + .Times(Exactly(1)) + .WillOnce(Return(ndk::ScopedAStatus::ok())); EXPECT_CALL(*mMockHal.get(), setAmplitude(Eq(0.2f))) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromStatusT(UNKNOWN_TRANSACTION))); + .WillOnce(Return(ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION))); EXPECT_CALL(*mMockHal.get(), setAmplitude(Eq(0.5f))) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))); } ASSERT_TRUE(mWrapper->setAmplitude(0.1f).isOk()); @@ -241,12 +164,13 @@ TEST_F(VibratorHalWrapperAidlTest, TestSetAmplitude) { TEST_F(VibratorHalWrapperAidlTest, TestSetExternalControl) { { InSequence seq; - EXPECT_CALL(*mMockHal.get(), setExternalControl(Eq(true))).Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), setExternalControl(Eq(true))) + .Times(Exactly(1)) + .WillOnce(Return(ndk::ScopedAStatus::ok())); EXPECT_CALL(*mMockHal.get(), setExternalControl(Eq(false))) .Times(Exactly(2)) - .WillOnce(Return( - Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))) - .WillRepeatedly(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))) + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))); } ASSERT_TRUE(mWrapper->setExternalControl(true).isOk()); @@ -259,15 +183,16 @@ TEST_F(VibratorHalWrapperAidlTest, TestAlwaysOnEnable) { InSequence seq; EXPECT_CALL(*mMockHal.get(), alwaysOnEnable(Eq(1), Eq(Effect::CLICK), Eq(EffectStrength::LIGHT))) - .Times(Exactly(1)); + .Times(Exactly(1)) + .WillOnce(Return(ndk::ScopedAStatus::ok())); EXPECT_CALL(*mMockHal.get(), alwaysOnEnable(Eq(2), Eq(Effect::TICK), Eq(EffectStrength::MEDIUM))) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromStatusT(UNKNOWN_TRANSACTION))); + .WillOnce(Return(ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION))); EXPECT_CALL(*mMockHal.get(), alwaysOnEnable(Eq(3), Eq(Effect::POP), Eq(EffectStrength::STRONG))) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))); } auto result = mWrapper->alwaysOnEnable(1, Effect::CLICK, EffectStrength::LIGHT); @@ -281,14 +206,15 @@ TEST_F(VibratorHalWrapperAidlTest, TestAlwaysOnEnable) { TEST_F(VibratorHalWrapperAidlTest, TestAlwaysOnDisable) { { InSequence seq; - EXPECT_CALL(*mMockHal.get(), alwaysOnDisable(Eq(1))).Times(Exactly(1)); + EXPECT_CALL(*mMockHal.get(), alwaysOnDisable(Eq(1))) + .Times(Exactly(1)) + .WillOnce(Return(ndk::ScopedAStatus::ok())); EXPECT_CALL(*mMockHal.get(), alwaysOnDisable(Eq(2))) .Times(Exactly(1)) - .WillRepeatedly(Return( - Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))); EXPECT_CALL(*mMockHal.get(), alwaysOnDisable(Eq(3))) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))); } ASSERT_TRUE(mWrapper->alwaysOnDisable(1).isOk()); @@ -311,66 +237,70 @@ TEST_F(VibratorHalWrapperAidlTest, TestGetInfoDoesNotCacheFailedResult) { std::vector<float> amplitudes = {0.f, 1.f, 0.f}; std::vector<std::chrono::milliseconds> primitiveDurations; - constexpr auto primitiveRange = enum_range<CompositePrimitive>(); + constexpr auto primitiveRange = ndk::enum_range<CompositePrimitive>(); constexpr auto primitiveCount = std::distance(primitiveRange.begin(), primitiveRange.end()); primitiveDurations.resize(primitiveCount); primitiveDurations[static_cast<size_t>(CompositePrimitive::CLICK)] = 10ms; EXPECT_CALL(*mMockHal.get(), getCapabilities(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(IVibrator::CAP_ON_CALLBACK), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(IVibrator::CAP_ON_CALLBACK), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getSupportedEffects(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(supportedEffects), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(supportedEffects), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getSupportedBraking(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(supportedBraking), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(supportedBraking), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getSupportedPrimitives(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(supportedPrimitives), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce( + DoAll(SetArgPointee<0>(supportedPrimitives), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPrimitiveDuration(Eq(CompositePrimitive::CLICK), _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<1>(10), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<1>(10), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getCompositionSizeMax(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(COMPOSITION_SIZE_MAX), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(COMPOSITION_SIZE_MAX), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getCompositionDelayMax(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(PRIMITIVE_DELAY_MAX), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce( + DoAll(SetArgPointee<0>(PRIMITIVE_DELAY_MAX), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPwlePrimitiveDurationMax(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(PWLE_DURATION_MAX), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(PWLE_DURATION_MAX), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPwleCompositionSizeMax(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(PWLE_SIZE_MAX), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(PWLE_SIZE_MAX), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getFrequencyMinimum(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(F_MIN), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(F_MIN), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getResonantFrequency(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(F0), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(F0), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getFrequencyResolution(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(F_RESOLUTION), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(F_RESOLUTION), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getQFactor(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(Q_FACTOR), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(Q_FACTOR), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getBandwidthAmplitudeMap(_)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(amplitudes), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(amplitudes), Return(ndk::ScopedAStatus::ok()))); vibrator::Info failed = mWrapper->getInfo(); ASSERT_TRUE(failed.capabilities.isFailed()); @@ -417,46 +347,46 @@ TEST_F(VibratorHalWrapperAidlTest, TestGetInfoCachesResult) { EXPECT_CALL(*mMockHal.get(), getCapabilities(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(IVibrator::CAP_ON_CALLBACK), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(IVibrator::CAP_ON_CALLBACK), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getSupportedEffects(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(supportedEffects), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(supportedEffects), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getQFactor(_)) .Times(Exactly(1)) - .WillRepeatedly( - Return(Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))); EXPECT_CALL(*mMockHal.get(), getSupportedPrimitives(_)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromStatusT(UNKNOWN_TRANSACTION))); + .WillOnce(Return(ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION))); EXPECT_CALL(*mMockHal.get(), getCompositionSizeMax(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(COMPOSITION_SIZE_MAX), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(COMPOSITION_SIZE_MAX), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getCompositionDelayMax(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(PRIMITIVE_DELAY_MAX), Return(Status()))); + .WillOnce( + DoAll(SetArgPointee<0>(PRIMITIVE_DELAY_MAX), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPwlePrimitiveDurationMax(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(PWLE_DURATION_MAX), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(PWLE_DURATION_MAX), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPwleCompositionSizeMax(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(PWLE_SIZE_MAX), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(PWLE_SIZE_MAX), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getFrequencyMinimum(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(F_MIN), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(F_MIN), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getResonantFrequency(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(F0), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(F0), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getFrequencyResolution(_)) .Times(Exactly(1)) - .WillRepeatedly( - Return(Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))); EXPECT_CALL(*mMockHal.get(), getBandwidthAmplitudeMap(_)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromStatusT(UNKNOWN_TRANSACTION))); + .WillOnce(Return(ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION))); EXPECT_CALL(*mMockHal.get(), getSupportedBraking(_)) .Times(Exactly(1)) - .WillRepeatedly( - Return(Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))); std::vector<std::thread> threads; for (int i = 0; i < 10; i++) { @@ -487,18 +417,18 @@ TEST_F(VibratorHalWrapperAidlTest, TestPerformEffectWithCallbackSupport) { InSequence seq; EXPECT_CALL(*mMockHal.get(), getCapabilities(_)) .Times(Exactly(1)) - .WillRepeatedly( - DoAll(SetArgPointee<0>(IVibrator::CAP_PERFORM_CALLBACK), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(IVibrator::CAP_PERFORM_CALLBACK), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), perform(Eq(Effect::CLICK), Eq(EffectStrength::LIGHT), _, _)) .Times(Exactly(1)) - .WillRepeatedly( - DoAll(SetArgPointee<3>(1000), TriggerCallbackInArg2(), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<3>(1000), WithArg<2>(vibrator::TriggerCallback()), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), perform(Eq(Effect::POP), Eq(EffectStrength::MEDIUM), _, _)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromStatusT(UNKNOWN_TRANSACTION))); + .WillOnce(Return(ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION))); EXPECT_CALL(*mMockHal.get(), perform(Eq(Effect::THUD), Eq(EffectStrength::STRONG), _, _)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))); } std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); @@ -525,21 +455,20 @@ TEST_F(VibratorHalWrapperAidlTest, TestPerformEffectWithoutCallbackSupport) { InSequence seq; EXPECT_CALL(*mMockHal.get(), getCapabilities(_)) .Times(Exactly(1)) - .WillRepeatedly( - DoAll(SetArgPointee<0>(IVibrator::CAP_ON_CALLBACK), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(IVibrator::CAP_ON_CALLBACK), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), perform(Eq(Effect::CLICK), Eq(EffectStrength::LIGHT), _, _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<3>(10), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<3>(10), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockScheduler.get(), schedule(_, Eq(10ms))) .Times(Exactly(1)) - .WillRepeatedly(vibrator::TriggerSchedulerCallback()); + .WillOnce(vibrator::TriggerSchedulerCallback()); EXPECT_CALL(*mMockHal.get(), perform(Eq(Effect::POP), Eq(EffectStrength::MEDIUM), _, _)) .Times(Exactly(1)) - .WillRepeatedly(Return( - Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))); EXPECT_CALL(*mMockHal.get(), perform(Eq(Effect::THUD), Eq(EffectStrength::STRONG), _, _)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))); } std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); @@ -576,26 +505,28 @@ TEST_F(VibratorHalWrapperAidlTest, TestPerformComposedEffect) { InSequence seq; EXPECT_CALL(*mMockHal.get(), getSupportedPrimitives(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(supportedPrimitives), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(supportedPrimitives), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPrimitiveDuration(Eq(CompositePrimitive::CLICK), _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<1>(1), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<1>(1), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPrimitiveDuration(Eq(CompositePrimitive::SPIN), _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<1>(2), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<1>(2), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPrimitiveDuration(Eq(CompositePrimitive::THUD), _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<1>(3), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<1>(3), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), compose(Eq(emptyEffects), _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(TriggerCallbackInArg1(), Return(Status()))); + .WillOnce(DoAll(WithArg<1>(vibrator::TriggerCallback()), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), compose(Eq(singleEffect), _)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromStatusT(UNKNOWN_TRANSACTION))); + .WillOnce(Return(ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION))); EXPECT_CALL(*mMockHal.get(), compose(Eq(multipleEffects), _)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))); } std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); @@ -630,26 +561,32 @@ TEST_F(VibratorHalWrapperAidlTest, TestPerformComposedCachesPrimitiveDurationsAn InSequence seq; EXPECT_CALL(*mMockHal.get(), getSupportedPrimitives(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(supportedPrimitives), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(supportedPrimitives), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPrimitiveDuration(Eq(CompositePrimitive::SPIN), _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<1>(2), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<1>(2), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPrimitiveDuration(Eq(CompositePrimitive::THUD), _)) .Times(Exactly(1)) - .WillRepeatedly(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))); EXPECT_CALL(*mMockHal.get(), compose(Eq(multipleEffects), _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(TriggerCallbackInArg1(), Return(Status()))); + .WillOnce(DoAll(WithArg<1>(vibrator::TriggerCallback()), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPrimitiveDuration(Eq(CompositePrimitive::SPIN), _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<1>(2), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<1>(2), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getPrimitiveDuration(Eq(CompositePrimitive::THUD), _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<1>(2), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<1>(2), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), compose(Eq(multipleEffects), _)) .Times(Exactly(2)) - .WillRepeatedly(DoAll(TriggerCallbackInArg1(), Return(Status()))); + // ndk::ScopedAStatus::ok() cannot be copy-constructed so can't use WillRepeatedly + .WillOnce(DoAll(WithArg<1>(vibrator::TriggerCallback()), + Return(ndk::ScopedAStatus::ok()))) + .WillOnce(DoAll(WithArg<1>(vibrator::TriggerCallback()), + Return(ndk::ScopedAStatus::ok()))); } std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); @@ -680,12 +617,12 @@ TEST_F(VibratorHalWrapperAidlTest, TestPerformPwleEffect) { InSequence seq; EXPECT_CALL(*mMockHal.get(), composePwle(Eq(emptyPrimitives), _)) .Times(Exactly(1)) - .WillRepeatedly(Return( - Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))); EXPECT_CALL(*mMockHal.get(), composePwle(Eq(multiplePrimitives), _)) .Times(Exactly(2)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(TriggerCallbackInArg1(), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(WithArg<1>(vibrator::TriggerCallback()), + Return(ndk::ScopedAStatus::ok()))); } std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); diff --git a/services/vibratorservice/test/VibratorHalWrapperHidlV1_0Test.cpp b/services/vibratorservice/test/VibratorHalWrapperHidlV1_0Test.cpp index 0c27fc73b1..dd590935c4 100644 --- a/services/vibratorservice/test/VibratorHalWrapperHidlV1_0Test.cpp +++ b/services/vibratorservice/test/VibratorHalWrapperHidlV1_0Test.cpp @@ -16,7 +16,7 @@ #define LOG_TAG "VibratorHalWrapperHidlV1_0Test" -#include <android/hardware/vibrator/IVibrator.h> +#include <aidl/android/hardware/vibrator/IVibrator.h> #include <gmock/gmock.h> #include <gtest/gtest.h> @@ -27,17 +27,18 @@ #include <vibratorservice/VibratorCallbackScheduler.h> #include <vibratorservice/VibratorHalWrapper.h> +#include "test_mocks.h" #include "test_utils.h" namespace V1_0 = android::hardware::vibrator::V1_0; -using android::hardware::vibrator::Braking; -using android::hardware::vibrator::CompositeEffect; -using android::hardware::vibrator::CompositePrimitive; -using android::hardware::vibrator::Effect; -using android::hardware::vibrator::EffectStrength; -using android::hardware::vibrator::IVibrator; -using android::hardware::vibrator::PrimitivePwle; +using aidl::android::hardware::vibrator::Braking; +using aidl::android::hardware::vibrator::CompositeEffect; +using aidl::android::hardware::vibrator::CompositePrimitive; +using aidl::android::hardware::vibrator::Effect; +using aidl::android::hardware::vibrator::EffectStrength; +using aidl::android::hardware::vibrator::IVibrator; +using aidl::android::hardware::vibrator::PrimitivePwle; using namespace android; using namespace std::chrono_literals; diff --git a/services/vibratorservice/test/VibratorHalWrapperHidlV1_1Test.cpp b/services/vibratorservice/test/VibratorHalWrapperHidlV1_1Test.cpp index d887efce80..b0a653769e 100644 --- a/services/vibratorservice/test/VibratorHalWrapperHidlV1_1Test.cpp +++ b/services/vibratorservice/test/VibratorHalWrapperHidlV1_1Test.cpp @@ -16,7 +16,7 @@ #define LOG_TAG "VibratorHalWrapperHidlV1_1Test" -#include <android/hardware/vibrator/IVibrator.h> +#include <aidl/android/hardware/vibrator/IVibrator.h> #include <gmock/gmock.h> #include <gtest/gtest.h> @@ -26,13 +26,14 @@ #include <vibratorservice/VibratorCallbackScheduler.h> #include <vibratorservice/VibratorHalWrapper.h> +#include "test_mocks.h" #include "test_utils.h" namespace V1_0 = android::hardware::vibrator::V1_0; namespace V1_1 = android::hardware::vibrator::V1_1; -using android::hardware::vibrator::Effect; -using android::hardware::vibrator::EffectStrength; +using aidl::android::hardware::vibrator::Effect; +using aidl::android::hardware::vibrator::EffectStrength; using namespace android; using namespace std::chrono_literals; diff --git a/services/vibratorservice/test/VibratorHalWrapperHidlV1_2Test.cpp b/services/vibratorservice/test/VibratorHalWrapperHidlV1_2Test.cpp index 26d93503c6..dfe3fa0e68 100644 --- a/services/vibratorservice/test/VibratorHalWrapperHidlV1_2Test.cpp +++ b/services/vibratorservice/test/VibratorHalWrapperHidlV1_2Test.cpp @@ -16,7 +16,7 @@ #define LOG_TAG "VibratorHalWrapperHidlV1_2Test" -#include <android/hardware/vibrator/IVibrator.h> +#include <aidl/android/hardware/vibrator/IVibrator.h> #include <gmock/gmock.h> #include <gtest/gtest.h> @@ -26,14 +26,15 @@ #include <vibratorservice/VibratorCallbackScheduler.h> #include <vibratorservice/VibratorHalWrapper.h> +#include "test_mocks.h" #include "test_utils.h" namespace V1_0 = android::hardware::vibrator::V1_0; namespace V1_1 = android::hardware::vibrator::V1_1; namespace V1_2 = android::hardware::vibrator::V1_2; -using android::hardware::vibrator::Effect; -using android::hardware::vibrator::EffectStrength; +using aidl::android::hardware::vibrator::Effect; +using aidl::android::hardware::vibrator::EffectStrength; using namespace android; using namespace std::chrono_literals; diff --git a/services/vibratorservice/test/VibratorHalWrapperHidlV1_3Test.cpp b/services/vibratorservice/test/VibratorHalWrapperHidlV1_3Test.cpp index a6f1a74931..86243326ac 100644 --- a/services/vibratorservice/test/VibratorHalWrapperHidlV1_3Test.cpp +++ b/services/vibratorservice/test/VibratorHalWrapperHidlV1_3Test.cpp @@ -16,7 +16,7 @@ #define LOG_TAG "VibratorHalWrapperHidlV1_3Test" -#include <android/hardware/vibrator/IVibrator.h> +#include <aidl/android/hardware/vibrator/IVibrator.h> #include <gmock/gmock.h> #include <gtest/gtest.h> @@ -27,6 +27,7 @@ #include <vibratorservice/VibratorCallbackScheduler.h> #include <vibratorservice/VibratorHalWrapper.h> +#include "test_mocks.h" #include "test_utils.h" namespace V1_0 = android::hardware::vibrator::V1_0; @@ -34,9 +35,9 @@ namespace V1_1 = android::hardware::vibrator::V1_1; namespace V1_2 = android::hardware::vibrator::V1_2; namespace V1_3 = android::hardware::vibrator::V1_3; -using android::hardware::vibrator::Effect; -using android::hardware::vibrator::EffectStrength; -using android::hardware::vibrator::IVibrator; +using aidl::android::hardware::vibrator::Effect; +using aidl::android::hardware::vibrator::EffectStrength; +using aidl::android::hardware::vibrator::IVibrator; using namespace android; using namespace std::chrono_literals; diff --git a/services/vibratorservice/test/VibratorManagerHalControllerTest.cpp b/services/vibratorservice/test/VibratorManagerHalControllerTest.cpp index 11a8b66968..c7214e054e 100644 --- a/services/vibratorservice/test/VibratorManagerHalControllerTest.cpp +++ b/services/vibratorservice/test/VibratorManagerHalControllerTest.cpp @@ -24,6 +24,7 @@ #include <vibratorservice/VibratorManagerHalController.h> +#include "test_mocks.h" #include "test_utils.h" using android::vibrator::HalController; @@ -35,6 +36,8 @@ static constexpr int MAX_ATTEMPTS = 2; static const std::vector<int32_t> VIBRATOR_IDS = {1, 2}; static constexpr int VIBRATOR_ID = 1; +// ------------------------------------------------------------------------------------------------- + class MockManagerHalWrapper : public vibrator::ManagerHalWrapper { public: MOCK_METHOD(void, tryReconnect, (), (override)); @@ -51,6 +54,8 @@ public: MOCK_METHOD(vibrator::HalResult<void>, cancelSynced, (), (override)); }; +// ------------------------------------------------------------------------------------------------- + class VibratorManagerHalControllerTest : public Test { public: void SetUp() override { @@ -106,6 +111,8 @@ protected: } }; +// ------------------------------------------------------------------------------------------------- + TEST_F(VibratorManagerHalControllerTest, TestInit) { mController->init(); ASSERT_EQ(1, mConnectCounter); diff --git a/services/vibratorservice/test/VibratorManagerHalWrapperAidlTest.cpp b/services/vibratorservice/test/VibratorManagerHalWrapperAidlTest.cpp index dffc281fa1..764d9bea4f 100644 --- a/services/vibratorservice/test/VibratorManagerHalWrapperAidlTest.cpp +++ b/services/vibratorservice/test/VibratorManagerHalWrapperAidlTest.cpp @@ -23,84 +23,42 @@ #include <vibratorservice/VibratorManagerHalWrapper.h> +#include "test_mocks.h" #include "test_utils.h" -using android::binder::Status; - -using android::hardware::vibrator::Braking; -using android::hardware::vibrator::CompositeEffect; -using android::hardware::vibrator::CompositePrimitive; -using android::hardware::vibrator::Effect; -using android::hardware::vibrator::EffectStrength; -using android::hardware::vibrator::IVibrator; -using android::hardware::vibrator::IVibratorCallback; -using android::hardware::vibrator::IVibratorManager; -using android::hardware::vibrator::PrimitivePwle; +using aidl::android::hardware::vibrator::Braking; +using aidl::android::hardware::vibrator::CompositeEffect; +using aidl::android::hardware::vibrator::CompositePrimitive; +using aidl::android::hardware::vibrator::Effect; +using aidl::android::hardware::vibrator::EffectStrength; +using aidl::android::hardware::vibrator::IVibrator; +using aidl::android::hardware::vibrator::IVibratorCallback; +using aidl::android::hardware::vibrator::IVibratorManager; +using aidl::android::hardware::vibrator::PrimitivePwle; using namespace android; using namespace testing; static const auto OFF_FN = [](vibrator::HalWrapper* hal) { return hal->off(); }; -class MockBinder : public BBinder { -public: - MOCK_METHOD(status_t, linkToDeath, - (const sp<DeathRecipient>& recipient, void* cookie, uint32_t flags), (override)); - MOCK_METHOD(status_t, unlinkToDeath, - (const wp<DeathRecipient>& recipient, void* cookie, uint32_t flags, - wp<DeathRecipient>* outRecipient), - (override)); - MOCK_METHOD(status_t, pingBinder, (), (override)); -}; +// ------------------------------------------------------------------------------------------------- -class MockIVibrator : public IVibrator { +class MockIVibratorManager : public IVibratorManager { public: - MOCK_METHOD(Status, getCapabilities, (int32_t * ret), (override)); - MOCK_METHOD(Status, off, (), (override)); - MOCK_METHOD(Status, on, (int32_t timeout, const sp<IVibratorCallback>& cb), (override)); - MOCK_METHOD(Status, perform, - (Effect e, EffectStrength s, const sp<IVibratorCallback>& cb, int32_t* ret), - (override)); - MOCK_METHOD(Status, getSupportedEffects, (std::vector<Effect> * ret), (override)); - MOCK_METHOD(Status, setAmplitude, (float amplitude), (override)); - MOCK_METHOD(Status, setExternalControl, (bool enabled), (override)); - MOCK_METHOD(Status, getCompositionDelayMax, (int32_t * ret), (override)); - MOCK_METHOD(Status, getCompositionSizeMax, (int32_t * ret), (override)); - MOCK_METHOD(Status, getSupportedPrimitives, (std::vector<CompositePrimitive> * ret), + MockIVibratorManager() = default; + + MOCK_METHOD(ndk::ScopedAStatus, getCapabilities, (int32_t * ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getVibratorIds, (std::vector<int32_t> * ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getVibrator, (int32_t id, std::shared_ptr<IVibrator>* ret), (override)); - MOCK_METHOD(Status, getPrimitiveDuration, (CompositePrimitive p, int32_t* ret), (override)); - MOCK_METHOD(Status, compose, - (const std::vector<CompositeEffect>& e, const sp<IVibratorCallback>& cb), + MOCK_METHOD(ndk::ScopedAStatus, prepareSynced, (const std::vector<int32_t>& ids), (override)); + MOCK_METHOD(ndk::ScopedAStatus, triggerSynced, (const std::shared_ptr<IVibratorCallback>& cb), (override)); - MOCK_METHOD(Status, composePwle, - (const std::vector<PrimitivePwle>& e, const sp<IVibratorCallback>& cb), (override)); - MOCK_METHOD(Status, getSupportedAlwaysOnEffects, (std::vector<Effect> * ret), (override)); - MOCK_METHOD(Status, alwaysOnEnable, (int32_t id, Effect e, EffectStrength s), (override)); - MOCK_METHOD(Status, alwaysOnDisable, (int32_t id), (override)); - MOCK_METHOD(Status, getQFactor, (float * ret), (override)); - MOCK_METHOD(Status, getResonantFrequency, (float * ret), (override)); - MOCK_METHOD(Status, getFrequencyResolution, (float* ret), (override)); - MOCK_METHOD(Status, getFrequencyMinimum, (float* ret), (override)); - MOCK_METHOD(Status, getBandwidthAmplitudeMap, (std::vector<float> * ret), (override)); - MOCK_METHOD(Status, getPwlePrimitiveDurationMax, (int32_t * ret), (override)); - MOCK_METHOD(Status, getPwleCompositionSizeMax, (int32_t * ret), (override)); - MOCK_METHOD(Status, getSupportedBraking, (std::vector<Braking> * ret), (override)); - MOCK_METHOD(int32_t, getInterfaceVersion, (), (override)); - MOCK_METHOD(std::string, getInterfaceHash, (), (override)); - MOCK_METHOD(IBinder*, onAsBinder, (), (override)); -}; - -class MockIVibratorManager : public IVibratorManager { -public: - MOCK_METHOD(Status, getCapabilities, (int32_t * ret), (override)); - MOCK_METHOD(Status, getVibratorIds, (std::vector<int32_t> * ret), (override)); - MOCK_METHOD(Status, getVibrator, (int32_t id, sp<IVibrator>* ret), (override)); - MOCK_METHOD(Status, prepareSynced, (const std::vector<int32_t>& ids), (override)); - MOCK_METHOD(Status, triggerSynced, (const sp<IVibratorCallback>& cb), (override)); - MOCK_METHOD(Status, cancelSynced, (), (override)); - MOCK_METHOD(int32_t, getInterfaceVersion, (), (override)); - MOCK_METHOD(std::string, getInterfaceHash, (), (override)); - MOCK_METHOD(IBinder*, onAsBinder, (), (override)); + MOCK_METHOD(ndk::ScopedAStatus, cancelSynced, (), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getInterfaceVersion, (int32_t*), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getInterfaceHash, (std::string*), (override)); + MOCK_METHOD(ndk::SpAIBinder, asBinder, (), (override)); + MOCK_METHOD(bool, isRemote, (), (override)); }; // ------------------------------------------------------------------------------------------------- @@ -108,9 +66,8 @@ public: class VibratorManagerHalWrapperAidlTest : public Test { public: void SetUp() override { - mMockBinder = new StrictMock<MockBinder>(); - mMockVibrator = new StrictMock<MockIVibrator>(); - mMockHal = new StrictMock<MockIVibratorManager>(); + mMockVibrator = ndk::SharedRefBase::make<StrictMock<vibrator::MockIVibrator>>(); + mMockHal = ndk::SharedRefBase::make<StrictMock<MockIVibratorManager>>(); mMockScheduler = std::make_shared<StrictMock<vibrator::MockCallbackScheduler>>(); mWrapper = std::make_unique<vibrator::AidlManagerHalWrapper>(mMockScheduler, mMockHal); ASSERT_NE(mWrapper, nullptr); @@ -119,9 +76,8 @@ public: protected: std::shared_ptr<StrictMock<vibrator::MockCallbackScheduler>> mMockScheduler = nullptr; std::unique_ptr<vibrator::ManagerHalWrapper> mWrapper = nullptr; - sp<StrictMock<MockIVibratorManager>> mMockHal = nullptr; - sp<StrictMock<MockIVibrator>> mMockVibrator = nullptr; - sp<StrictMock<MockBinder>> mMockBinder = nullptr; + std::shared_ptr<StrictMock<MockIVibratorManager>> mMockHal = nullptr; + std::shared_ptr<StrictMock<vibrator::MockIVibrator>> mMockVibrator = nullptr; }; // ------------------------------------------------------------------------------------------------- @@ -129,32 +85,13 @@ protected: static const std::vector<int32_t> kVibratorIds = {1, 2}; static constexpr int kVibratorId = 1; -ACTION(TriggerCallback) { - if (arg0 != nullptr) { - arg0->onComplete(); - } -} - -TEST_F(VibratorManagerHalWrapperAidlTest, TestPing) { - EXPECT_CALL(*mMockHal.get(), onAsBinder()) - .Times(Exactly(2)) - .WillRepeatedly(Return(mMockBinder.get())); - EXPECT_CALL(*mMockBinder.get(), pingBinder()) - .Times(Exactly(2)) - .WillOnce(Return(android::OK)) - .WillRepeatedly(Return(android::DEAD_OBJECT)); - - ASSERT_TRUE(mWrapper->ping().isOk()); - ASSERT_TRUE(mWrapper->ping().isFailed()); -} - TEST_F(VibratorManagerHalWrapperAidlTest, TestGetCapabilitiesDoesNotCacheFailedResult) { EXPECT_CALL(*mMockHal.get(), getCapabilities(_)) .Times(Exactly(3)) - .WillOnce( - Return(Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(IVibratorManager::CAP_SYNC), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))) + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(IVibratorManager::CAP_SYNC), + Return(ndk::ScopedAStatus::ok()))); ASSERT_TRUE(mWrapper->getCapabilities().isUnsupported()); ASSERT_TRUE(mWrapper->getCapabilities().isFailed()); @@ -167,7 +104,8 @@ TEST_F(VibratorManagerHalWrapperAidlTest, TestGetCapabilitiesDoesNotCacheFailedR TEST_F(VibratorManagerHalWrapperAidlTest, TestGetCapabilitiesCachesResult) { EXPECT_CALL(*mMockHal.get(), getCapabilities(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(IVibratorManager::CAP_SYNC), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(IVibratorManager::CAP_SYNC), + Return(ndk::ScopedAStatus::ok()))); std::vector<std::thread> threads; for (int i = 0; i < 10; i++) { @@ -187,10 +125,9 @@ TEST_F(VibratorManagerHalWrapperAidlTest, TestGetCapabilitiesCachesResult) { TEST_F(VibratorManagerHalWrapperAidlTest, TestGetVibratorIdsDoesNotCacheFailedResult) { EXPECT_CALL(*mMockHal.get(), getVibratorIds(_)) .Times(Exactly(3)) - .WillOnce( - Return(Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(SetArgPointee<0>(kVibratorIds), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))) + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(SetArgPointee<0>(kVibratorIds), Return(ndk::ScopedAStatus::ok()))); ASSERT_TRUE(mWrapper->getVibratorIds().isUnsupported()); ASSERT_TRUE(mWrapper->getVibratorIds().isFailed()); @@ -203,7 +140,7 @@ TEST_F(VibratorManagerHalWrapperAidlTest, TestGetVibratorIdsDoesNotCacheFailedRe TEST_F(VibratorManagerHalWrapperAidlTest, TestGetVibratorIdsCachesResult) { EXPECT_CALL(*mMockHal.get(), getVibratorIds(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(kVibratorIds), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(kVibratorIds), Return(ndk::ScopedAStatus::ok()))); std::vector<std::thread> threads; for (int i = 0; i < 10; i++) { @@ -225,11 +162,11 @@ TEST_F(VibratorManagerHalWrapperAidlTest, TestGetVibratorWithValidIdReturnsContr InSequence seq; EXPECT_CALL(*mMockHal.get(), getVibratorIds(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(kVibratorIds), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(kVibratorIds), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getVibrator(Eq(kVibratorId), _)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<1>(mMockVibrator), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<1>(mMockVibrator), Return(ndk::ScopedAStatus::ok()))); } auto result = mWrapper->getVibrator(kVibratorId); @@ -241,7 +178,7 @@ TEST_F(VibratorManagerHalWrapperAidlTest, TestGetVibratorWithValidIdReturnsContr TEST_F(VibratorManagerHalWrapperAidlTest, TestGetVibratorWithInvalidIdFails) { EXPECT_CALL(*mMockHal.get(), getVibratorIds(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(kVibratorIds), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(kVibratorIds), Return(ndk::ScopedAStatus::ok()))); ASSERT_TRUE(mWrapper->getVibrator(0).isFailed()); } @@ -249,20 +186,21 @@ TEST_F(VibratorManagerHalWrapperAidlTest, TestGetVibratorWithInvalidIdFails) { TEST_F(VibratorManagerHalWrapperAidlTest, TestGetVibratorRecoversVibratorPointer) { EXPECT_CALL(*mMockHal.get(), getVibratorIds(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(kVibratorIds), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(kVibratorIds), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getVibrator(Eq(kVibratorId), _)) .Times(Exactly(3)) .WillOnce(DoAll(SetArgPointee<1>(nullptr), - Return(Status::fromExceptionCode( - Status::Exception::EX_TRANSACTION_FAILED)))) - .WillRepeatedly(DoAll(SetArgPointee<1>(mMockVibrator), Return(Status()))); + Return(ndk::ScopedAStatus::fromExceptionCode(EX_TRANSACTION_FAILED)))) + // ndk::ScopedAStatus::ok() cannot be copy-constructed so can't use WillRepeatedly + .WillOnce(DoAll(SetArgPointee<1>(mMockVibrator), Return(ndk::ScopedAStatus::ok()))) + .WillOnce(DoAll(SetArgPointee<1>(mMockVibrator), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockVibrator.get(), off()) .Times(Exactly(3)) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_TRANSACTION_FAILED))) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_TRANSACTION_FAILED))) - .WillRepeatedly(Return(Status())); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_TRANSACTION_FAILED))) + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_TRANSACTION_FAILED))) + .WillOnce(Return(ndk::ScopedAStatus::ok())); // Get vibrator controller is successful even if first getVibrator. auto result = mWrapper->getVibrator(kVibratorId); @@ -281,18 +219,19 @@ TEST_F(VibratorManagerHalWrapperAidlTest, TestGetVibratorRecoversVibratorPointer TEST_F(VibratorManagerHalWrapperAidlTest, TestPrepareSynced) { EXPECT_CALL(*mMockHal.get(), getVibratorIds(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(kVibratorIds), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(kVibratorIds), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getVibrator(_, _)) .Times(Exactly(2)) - .WillRepeatedly(DoAll(SetArgPointee<1>(mMockVibrator), Return(Status()))); + // ndk::ScopedAStatus::ok() cannot be copy-constructed so can't use WillRepeatedly + .WillOnce(DoAll(SetArgPointee<1>(mMockVibrator), Return(ndk::ScopedAStatus::ok()))) + .WillOnce(DoAll(SetArgPointee<1>(mMockVibrator), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), prepareSynced(Eq(kVibratorIds))) .Times(Exactly(3)) - .WillOnce( - Return(Status::fromExceptionCode(Status::Exception::EX_UNSUPPORTED_OPERATION))) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(Return(Status())); + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_UNSUPPORTED_OPERATION))) + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(Return(ndk::ScopedAStatus::ok())); ASSERT_TRUE(mWrapper->getVibratorIds().isOk()); ASSERT_TRUE(mWrapper->prepareSynced(kVibratorIds).isUnsupported()); @@ -305,13 +244,13 @@ TEST_F(VibratorManagerHalWrapperAidlTest, TestTriggerSyncedWithCallbackSupport) InSequence seq; EXPECT_CALL(*mMockHal.get(), getCapabilities(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(IVibratorManager::CAP_TRIGGER_CALLBACK), - Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(IVibratorManager::CAP_TRIGGER_CALLBACK), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), triggerSynced(_)) .Times(Exactly(3)) - .WillOnce(Return(Status::fromStatusT(UNKNOWN_TRANSACTION))) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(DoAll(TriggerCallback(), Return(Status()))); + .WillOnce(Return(ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION))) + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(DoAll(vibrator::TriggerCallback(), Return(ndk::ScopedAStatus::ok()))); } std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); @@ -328,11 +267,11 @@ TEST_F(VibratorManagerHalWrapperAidlTest, TestTriggerSyncedWithoutCallbackSuppor InSequence seq; EXPECT_CALL(*mMockHal.get(), getCapabilities(_)) .Times(Exactly(1)) - .WillRepeatedly( - DoAll(SetArgPointee<0>(IVibratorManager::CAP_SYNC), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(IVibratorManager::CAP_SYNC), + Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), triggerSynced(Eq(nullptr))) .Times(Exactly(1)) - .WillRepeatedly(Return(Status())); + .WillOnce(Return(ndk::ScopedAStatus::ok())); } std::unique_ptr<int32_t> callbackCounter = std::make_unique<int32_t>(); @@ -345,9 +284,9 @@ TEST_F(VibratorManagerHalWrapperAidlTest, TestTriggerSyncedWithoutCallbackSuppor TEST_F(VibratorManagerHalWrapperAidlTest, TestCancelSynced) { EXPECT_CALL(*mMockHal.get(), cancelSynced()) .Times(Exactly(3)) - .WillOnce(Return(Status::fromStatusT(UNKNOWN_TRANSACTION))) - .WillOnce(Return(Status::fromExceptionCode(Status::Exception::EX_SECURITY))) - .WillRepeatedly(Return(Status())); + .WillOnce(Return(ndk::ScopedAStatus::fromStatus(STATUS_UNKNOWN_TRANSACTION))) + .WillOnce(Return(ndk::ScopedAStatus::fromExceptionCode(EX_SECURITY))) + .WillOnce(Return(ndk::ScopedAStatus::ok())); ASSERT_TRUE(mWrapper->cancelSynced().isUnsupported()); ASSERT_TRUE(mWrapper->cancelSynced().isFailed()); @@ -357,13 +296,17 @@ TEST_F(VibratorManagerHalWrapperAidlTest, TestCancelSynced) { TEST_F(VibratorManagerHalWrapperAidlTest, TestCancelSyncedReloadsAllControllers) { EXPECT_CALL(*mMockHal.get(), getVibratorIds(_)) .Times(Exactly(1)) - .WillRepeatedly(DoAll(SetArgPointee<0>(kVibratorIds), Return(Status()))); + .WillOnce(DoAll(SetArgPointee<0>(kVibratorIds), Return(ndk::ScopedAStatus::ok()))); EXPECT_CALL(*mMockHal.get(), getVibrator(_, _)) .Times(Exactly(2)) - .WillRepeatedly(DoAll(SetArgPointee<1>(mMockVibrator), Return(Status()))); + // ndk::ScopedAStatus::ok() cannot be copy-constructed so can't use WillRepeatedly + .WillOnce(DoAll(SetArgPointee<1>(mMockVibrator), Return(ndk::ScopedAStatus::ok()))) + .WillOnce(DoAll(SetArgPointee<1>(mMockVibrator), Return(ndk::ScopedAStatus::ok()))); - EXPECT_CALL(*mMockHal.get(), cancelSynced()).Times(Exactly(1)).WillRepeatedly(Return(Status())); + EXPECT_CALL(*mMockHal.get(), cancelSynced()) + .Times(Exactly(1)) + .WillOnce(Return(ndk::ScopedAStatus::ok())); ASSERT_TRUE(mWrapper->getVibratorIds().isOk()); ASSERT_TRUE(mWrapper->cancelSynced().isOk()); diff --git a/services/vibratorservice/test/VibratorManagerHalWrapperLegacyTest.cpp b/services/vibratorservice/test/VibratorManagerHalWrapperLegacyTest.cpp index 0850ef3b8c..78772369bf 100644 --- a/services/vibratorservice/test/VibratorManagerHalWrapperLegacyTest.cpp +++ b/services/vibratorservice/test/VibratorManagerHalWrapperLegacyTest.cpp @@ -23,10 +23,12 @@ #include <vibratorservice/VibratorManagerHalWrapper.h> -using android::hardware::vibrator::CompositeEffect; -using android::hardware::vibrator::CompositePrimitive; -using android::hardware::vibrator::Effect; -using android::hardware::vibrator::EffectStrength; +#include "test_mocks.h" + +using aidl::android::hardware::vibrator::CompositeEffect; +using aidl::android::hardware::vibrator::CompositePrimitive; +using aidl::android::hardware::vibrator::Effect; +using aidl::android::hardware::vibrator::EffectStrength; using std::chrono::milliseconds; @@ -35,27 +37,16 @@ using namespace testing; // ------------------------------------------------------------------------------------------------- -class MockHalController : public vibrator::HalController { -public: - MockHalController() = default; - virtual ~MockHalController() = default; - - MOCK_METHOD(bool, init, (), (override)); - MOCK_METHOD(void, tryReconnect, (), (override)); -}; - -// ------------------------------------------------------------------------------------------------- - class VibratorManagerHalWrapperLegacyTest : public Test { public: void SetUp() override { - mMockController = std::make_shared<StrictMock<MockHalController>>(); + mMockController = std::make_shared<StrictMock<vibrator::MockHalController>>(); mWrapper = std::make_unique<vibrator::LegacyManagerHalWrapper>(mMockController); ASSERT_NE(mWrapper, nullptr); } protected: - std::shared_ptr<StrictMock<MockHalController>> mMockController = nullptr; + std::shared_ptr<StrictMock<vibrator::MockHalController>> mMockController = nullptr; std::unique_ptr<vibrator::ManagerHalWrapper> mWrapper = nullptr; }; diff --git a/services/vibratorservice/test/test_mocks.h b/services/vibratorservice/test/test_mocks.h new file mode 100644 index 0000000000..7882186b40 --- /dev/null +++ b/services/vibratorservice/test/test_mocks.h @@ -0,0 +1,169 @@ +/* + * 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. + */ + +#ifndef VIBRATORSERVICE_UNITTEST_MOCKS_H_ +#define VIBRATORSERVICE_UNITTEST_MOCKS_H_ + +#include <gmock/gmock.h> + +#include <aidl/android/hardware/vibrator/IVibrator.h> + +#include <vibratorservice/VibratorCallbackScheduler.h> +#include <vibratorservice/VibratorHalController.h> +#include <vibratorservice/VibratorHalWrapper.h> + +namespace android { + +namespace vibrator { + +using std::chrono::milliseconds; + +using namespace testing; + +using aidl::android::hardware::vibrator::Braking; +using aidl::android::hardware::vibrator::CompositeEffect; +using aidl::android::hardware::vibrator::CompositePrimitive; +using aidl::android::hardware::vibrator::Effect; +using aidl::android::hardware::vibrator::EffectStrength; +using aidl::android::hardware::vibrator::IVibrator; +using aidl::android::hardware::vibrator::IVibratorCallback; +using aidl::android::hardware::vibrator::PrimitivePwle; + +// ------------------------------------------------------------------------------------------------- + +class MockIVibrator : public IVibrator { +public: + MockIVibrator() = default; + + MOCK_METHOD(ndk::ScopedAStatus, getCapabilities, (int32_t * ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, off, (), (override)); + MOCK_METHOD(ndk::ScopedAStatus, on, + (int32_t timeout, const std::shared_ptr<IVibratorCallback>& cb), (override)); + MOCK_METHOD(ndk::ScopedAStatus, perform, + (Effect e, EffectStrength s, const std::shared_ptr<IVibratorCallback>& cb, + int32_t* ret), + (override)); + MOCK_METHOD(ndk::ScopedAStatus, getSupportedEffects, (std::vector<Effect> * ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, setAmplitude, (float amplitude), (override)); + MOCK_METHOD(ndk::ScopedAStatus, setExternalControl, (bool enabled), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getCompositionDelayMax, (int32_t * ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getCompositionSizeMax, (int32_t * ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getSupportedPrimitives, (std::vector<CompositePrimitive> * ret), + (override)); + MOCK_METHOD(ndk::ScopedAStatus, getPrimitiveDuration, (CompositePrimitive p, int32_t* ret), + (override)); + MOCK_METHOD(ndk::ScopedAStatus, compose, + (const std::vector<CompositeEffect>& e, + const std::shared_ptr<IVibratorCallback>& cb), + (override)); + MOCK_METHOD(ndk::ScopedAStatus, composePwle, + (const std::vector<PrimitivePwle>& e, const std::shared_ptr<IVibratorCallback>& cb), + (override)); + MOCK_METHOD(ndk::ScopedAStatus, getSupportedAlwaysOnEffects, (std::vector<Effect> * ret), + (override)); + MOCK_METHOD(ndk::ScopedAStatus, alwaysOnEnable, (int32_t id, Effect e, EffectStrength s), + (override)); + MOCK_METHOD(ndk::ScopedAStatus, alwaysOnDisable, (int32_t id), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getQFactor, (float* ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getResonantFrequency, (float* ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getFrequencyResolution, (float* ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getFrequencyMinimum, (float* ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getBandwidthAmplitudeMap, (std::vector<float> * ret), + (override)); + MOCK_METHOD(ndk::ScopedAStatus, getPwlePrimitiveDurationMax, (int32_t * ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getPwleCompositionSizeMax, (int32_t * ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getSupportedBraking, (std::vector<Braking> * ret), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getInterfaceVersion, (int32_t*), (override)); + MOCK_METHOD(ndk::ScopedAStatus, getInterfaceHash, (std::string*), (override)); + MOCK_METHOD(ndk::SpAIBinder, asBinder, (), (override)); + MOCK_METHOD(bool, isRemote, (), (override)); +}; + +// gmock requirement to provide a WithArg<0>(TriggerCallback()) matcher +typedef void TriggerCallbackFunction(const std::shared_ptr<IVibratorCallback>&); + +class TriggerCallbackAction : public ActionInterface<TriggerCallbackFunction> { +public: + explicit TriggerCallbackAction() {} + + virtual Result Perform(const ArgumentTuple& args) { + const std::shared_ptr<IVibratorCallback>& callback = get<0>(args); + if (callback) { + callback->onComplete(); + } + } +}; + +inline Action<TriggerCallbackFunction> TriggerCallback() { + return MakeAction(new TriggerCallbackAction()); +} + +// ------------------------------------------------------------------------------------------------- + +class MockCallbackScheduler : public CallbackScheduler { +public: + MOCK_METHOD(void, schedule, (std::function<void()> callback, std::chrono::milliseconds delay), + (override)); +}; + +ACTION(TriggerSchedulerCallback) { + arg0(); +} + +// ------------------------------------------------------------------------------------------------- + +class MockHalWrapper : public HalWrapper { +public: + MockHalWrapper(std::shared_ptr<CallbackScheduler> scheduler) : HalWrapper(scheduler) {} + virtual ~MockHalWrapper() = default; + + MOCK_METHOD(vibrator::HalResult<void>, ping, (), (override)); + MOCK_METHOD(void, tryReconnect, (), (override)); + MOCK_METHOD(vibrator::HalResult<void>, on, + (milliseconds timeout, const std::function<void()>& completionCallback), + (override)); + MOCK_METHOD(vibrator::HalResult<void>, off, (), (override)); + MOCK_METHOD(vibrator::HalResult<void>, setAmplitude, (float amplitude), (override)); + MOCK_METHOD(vibrator::HalResult<void>, setExternalControl, (bool enabled), (override)); + MOCK_METHOD(vibrator::HalResult<void>, alwaysOnEnable, + (int32_t id, Effect effect, EffectStrength strength), (override)); + MOCK_METHOD(vibrator::HalResult<void>, alwaysOnDisable, (int32_t id), (override)); + MOCK_METHOD(vibrator::HalResult<milliseconds>, performEffect, + (Effect effect, EffectStrength strength, + const std::function<void()>& completionCallback), + (override)); + MOCK_METHOD(vibrator::HalResult<vibrator::Capabilities>, getCapabilitiesInternal, (), + (override)); + + CallbackScheduler* getCallbackScheduler() { return mCallbackScheduler.get(); } +}; + +class MockHalController : public vibrator::HalController { +public: + MockHalController() = default; + virtual ~MockHalController() = default; + + MOCK_METHOD(bool, init, (), (override)); + MOCK_METHOD(void, tryReconnect, (), (override)); +}; + +// ------------------------------------------------------------------------------------------------- + +} // namespace vibrator + +} // namespace android + +#endif // VIBRATORSERVICE_UNITTEST_MOCKS_H_ diff --git a/services/vibratorservice/test/test_utils.h b/services/vibratorservice/test/test_utils.h index 715c2215c4..e99965c877 100644 --- a/services/vibratorservice/test/test_utils.h +++ b/services/vibratorservice/test/test_utils.h @@ -17,7 +17,7 @@ #ifndef VIBRATORSERVICE_UNITTEST_UTIL_H_ #define VIBRATORSERVICE_UNITTEST_UTIL_H_ -#include <android/hardware/vibrator/IVibrator.h> +#include <aidl/android/hardware/vibrator/IVibrator.h> #include <vibratorservice/VibratorHalWrapper.h> @@ -25,24 +25,12 @@ namespace android { namespace vibrator { -using ::android::hardware::vibrator::ActivePwle; -using ::android::hardware::vibrator::Braking; -using ::android::hardware::vibrator::BrakingPwle; -using ::android::hardware::vibrator::CompositeEffect; -using ::android::hardware::vibrator::CompositePrimitive; -using ::android::hardware::vibrator::PrimitivePwle; - -// ------------------------------------------------------------------------------------------------- - -class MockCallbackScheduler : public vibrator::CallbackScheduler { -public: - MOCK_METHOD(void, schedule, (std::function<void()> callback, std::chrono::milliseconds delay), - (override)); -}; - -ACTION(TriggerSchedulerCallback) { - arg0(); -} +using aidl::android::hardware::vibrator::ActivePwle; +using aidl::android::hardware::vibrator::Braking; +using aidl::android::hardware::vibrator::BrakingPwle; +using aidl::android::hardware::vibrator::CompositeEffect; +using aidl::android::hardware::vibrator::CompositePrimitive; +using aidl::android::hardware::vibrator::PrimitivePwle; // ------------------------------------------------------------------------------------------------- |