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

Commit 8c5bb259 authored by Jeff Pu's avatar Jeff Pu
Browse files

Wait for HAL service death signal before trying to connect it again

Bug: 393630510
Test: atest VtsHalBiometricsFingerprintTargetTest
Merged-In: I7cec59700e3d49d873c12226687e10b275be6a43
Change-Id: I4094bd21b602c8dd5cf7484c8dfafd4bb0ea03e4
parent 74a6d419
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -138,6 +138,11 @@ class SessionCallback : public BnSessionCallback {
};

class Fingerprint : public testing::TestWithParam<std::string> {
    static void HalServiceDied(void* cookie) {
        auto halDeathPromise = static_cast<std::promise<void>*>(cookie);
        halDeathPromise->set_value();
    }

  protected:
    void SetUp() override {
        // Prepare the callback.
@@ -157,8 +162,24 @@ class Fingerprint : public testing::TestWithParam<std::string> {
            ASSERT_NE(binder, nullptr);
            mHal = IFingerprint::fromBinder(ndk::SpAIBinder(binder));

            // Create HAL service death notifier
            auto halDeathPromise = std::make_shared<std::promise<void>>();
            mHalDeathRecipient = ndk::ScopedAIBinder_DeathRecipient(
                    AIBinder_DeathRecipient_new(&HalServiceDied));
            ASSERT_EQ(STATUS_OK, AIBinder_linkToDeath(binder, mHalDeathRecipient.get(),
                                                      static_cast<void*>(halDeathPromise.get())));

            // Create a session.
            isOk = mHal->createSession(kSensorId, kUserId, mCb, &mSession).isOk();

            if (!isOk) {
                // Failed to create session on first attempt, it is likely that the HAL service
                //   is dying or dead. Wait for its death notification signal before next try
                auto future = halDeathPromise->get_future();
                auto status = future.wait_for(std::chrono::milliseconds(500));
                EXPECT_EQ(status, std::future_status::ready);
            }

            ++retries;
        } while (!isOk && retries < 2);

@@ -177,6 +198,7 @@ class Fingerprint : public testing::TestWithParam<std::string> {
    std::shared_ptr<IFingerprint> mHal;
    std::shared_ptr<SessionCallback> mCb;
    std::shared_ptr<ISession> mSession;
    ::ndk::ScopedAIBinder_DeathRecipient mHalDeathRecipient;
};

TEST_P(Fingerprint, GetSensorPropsWorksTest) {