diff options
author | Treehugger Robot <treehugger-gerrit@google.com> | 2020-04-21 02:03:39 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-04-21 02:03:39 +0000 |
commit | 042f31daf2f6d08c3f1ce544ef8116b938c27dda (patch) | |
tree | ff53dd036858a342de9004d58f0bf551915a3a40 | |
parent | 9a703261aeedf501b2fd5846674d03aa5b03ca5d (diff) | |
parent | 231b61abb51ba6cc3c125659b38d907340f5bce1 (diff) |
Merge "vibrator: vts: Validate Primitive Duration" am: 5ec6625bd6 am: 231b61abb5
Change-Id: I8db95eb838681b8a58853c534e420372b4f3de65
-rw-r--r-- | vibrator/aidl/default/Vibrator.cpp | 4 | ||||
-rw-r--r-- | vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp | 61 |
2 files changed, 48 insertions, 17 deletions
diff --git a/vibrator/aidl/default/Vibrator.cpp b/vibrator/aidl/default/Vibrator.cpp index b359100d1a..c446afdea8 100644 --- a/vibrator/aidl/default/Vibrator.cpp +++ b/vibrator/aidl/default/Vibrator.cpp @@ -163,6 +163,10 @@ ndk::ScopedAStatus Vibrator::compose(const std::vector<CompositeEffect>& composi } LOG(INFO) << "triggering primitive " << static_cast<int>(e.primitive) << " @ scale " << e.scale; + + int32_t durationMs; + getPrimitiveDuration(e.primitive, &durationMs); + usleep(durationMs * 1000); } if (callback != nullptr) { diff --git a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp index 8340517de6..c539865218 100644 --- a/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp +++ b/vibrator/aidl/vts/VtsHalVibratorTargetTest.cpp @@ -34,6 +34,7 @@ using android::hardware::vibrator::CompositePrimitive; using android::hardware::vibrator::Effect; using android::hardware::vibrator::EffectStrength; using android::hardware::vibrator::IVibrator; +using std::chrono::high_resolution_clock; const std::vector<Effect> kEffects{android::enum_range<Effect>().begin(), android::enum_range<Effect>().end()}; @@ -442,26 +443,52 @@ TEST_P(VibratorAidl, ComposeSizeBoundary) { } TEST_P(VibratorAidl, ComposeCallback) { + constexpr std::chrono::milliseconds allowedLatency{10}; + if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) { - std::promise<void> completionPromise; - std::future<void> completionFuture{completionPromise.get_future()}; - sp<CompletionCallback> callback = - new CompletionCallback([&completionPromise] { completionPromise.set_value(); }); - CompositePrimitive primitive = CompositePrimitive::CLICK; - CompositeEffect effect; - std::vector<CompositeEffect> composite; - int32_t duration; + std::vector<CompositePrimitive> supported; - effect.delayMs = 0; - effect.primitive = primitive; - effect.scale = 1.0f; - composite.emplace_back(effect); + ASSERT_TRUE(vibrator->getSupportedPrimitives(&supported).isOk()); + + for (auto primitive : supported) { + if (primitive == CompositePrimitive::NOOP) { + continue; + } + + std::promise<void> completionPromise; + std::future<void> completionFuture{completionPromise.get_future()}; + sp<CompletionCallback> callback = + new CompletionCallback([&completionPromise] { completionPromise.set_value(); }); + CompositeEffect effect; + std::vector<CompositeEffect> composite; + int32_t durationMs; + std::chrono::milliseconds duration; + std::chrono::time_point<high_resolution_clock> start, end; + std::chrono::milliseconds elapsed; + + effect.delayMs = 0; + effect.primitive = primitive; + effect.scale = 1.0f; + composite.emplace_back(effect); + + EXPECT_EQ(Status::EX_NONE, + vibrator->getPrimitiveDuration(primitive, &durationMs).exceptionCode()) + << toString(primitive); + duration = std::chrono::milliseconds(durationMs); - EXPECT_EQ(Status::EX_NONE, - vibrator->getPrimitiveDuration(primitive, &duration).exceptionCode()); - EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, callback).exceptionCode()); - EXPECT_EQ(completionFuture.wait_for(std::chrono::milliseconds(duration * 2)), - std::future_status::ready); + EXPECT_EQ(Status::EX_NONE, vibrator->compose(composite, callback).exceptionCode()) + << toString(primitive); + start = high_resolution_clock::now(); + + EXPECT_EQ(completionFuture.wait_for(duration + allowedLatency), + std::future_status::ready) + << toString(primitive); + end = high_resolution_clock::now(); + + elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end - start); + EXPECT_LE(elapsed.count(), (duration + allowedLatency).count()) << toString(primitive); + EXPECT_GE(elapsed.count(), (duration - allowedLatency).count()) << toString(primitive); + } } } |