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

Commit cd8db322 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
Change-Id: I7cec59700e3d49d873c12226687e10b275be6a43
parent 0b2502ba
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);

@@ -178,6 +199,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) {