Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5ec6625b authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge "vibrator: vts: Validate Primitive Duration"

parents d05127d1 b075a6a5
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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) {
+44 −17
Original line number Diff line number Diff line
@@ -33,6 +33,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()};
@@ -381,15 +382,28 @@ TEST_P(VibratorAidl, CompseSizeBoundary) {
}

TEST_P(VibratorAidl, ComposeCallback) {
    constexpr std::chrono::milliseconds allowedLatency{10};

    if (capabilities & IVibrator::CAP_COMPOSE_EFFECTS) {
        std::vector<CompositePrimitive> supported;

        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(); });
        CompositePrimitive primitive = CompositePrimitive::CLICK;
            CompositeEffect effect;
            std::vector<CompositeEffect> composite;
        int32_t duration;
            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;
@@ -397,10 +411,23 @@ TEST_P(VibratorAidl, ComposeCallback) {
            composite.emplace_back(effect);

            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);
                      vibrator->getPrimitiveDuration(primitive, &durationMs).exceptionCode())
                    << toString(primitive);
            duration = std::chrono::milliseconds(durationMs);

            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);
        }
    }
}