Merge "Update fingerprint VHAL operation lifecycle" into udc-qpr-dev

This commit is contained in:
Jeff Pu
2023-07-17 15:40:25 +00:00
committed by Android (Google) Code Review
3 changed files with 50 additions and 25 deletions

View File

@@ -89,24 +89,29 @@ void FakeFingerprintEngine::updateContext(WorkMode mode, ISessionCallback* cb,
} }
void FakeFingerprintEngine::fingerDownAction() { void FakeFingerprintEngine::fingerDownAction() {
bool isTerminal = false;
LOG(INFO) << __func__; LOG(INFO) << __func__;
switch (mWorkMode) { switch (mWorkMode) {
case WorkMode::kAuthenticate: case WorkMode::kAuthenticate:
onAuthenticateFingerDown(mCb, mOperationId, mCancel); isTerminal = onAuthenticateFingerDown(mCb, mOperationId, mCancel);
break; break;
case WorkMode::kEnroll: case WorkMode::kEnroll:
onEnrollFingerDown(mCb, mHat, mCancel); isTerminal = onEnrollFingerDown(mCb, mHat, mCancel);
break; break;
case WorkMode::kDetectInteract: case WorkMode::kDetectInteract:
onDetectInteractFingerDown(mCb, mCancel); isTerminal = onDetectInteractFingerDown(mCb, mCancel);
break; break;
default: default:
LOG(WARNING) << "unexpected mode: on fingerDownAction(), " << (int)mWorkMode; LOG(WARNING) << "unexpected mode: on fingerDownAction(), " << (int)mWorkMode;
break; break;
} }
if (isTerminal) {
mWorkMode = WorkMode::kIdle;
}
} }
void FakeFingerprintEngine::onEnrollFingerDown(ISessionCallback* cb, bool FakeFingerprintEngine::onEnrollFingerDown(ISessionCallback* cb,
const keymaster::HardwareAuthToken& hat, const keymaster::HardwareAuthToken& hat,
const std::future<void>& cancel) { const std::future<void>& cancel) {
BEGIN_OP(getLatency(FingerprintHalProperties::operation_enroll_latency())); BEGIN_OP(getLatency(FingerprintHalProperties::operation_enroll_latency()));
@@ -115,7 +120,7 @@ void FakeFingerprintEngine::onEnrollFingerDown(ISessionCallback* cb,
if (hat.mac.empty()) { if (hat.mac.empty()) {
LOG(ERROR) << "Fail: hat"; LOG(ERROR) << "Fail: hat";
cb->onError(Error::UNABLE_TO_PROCESS, 0 /* vendorError */); cb->onError(Error::UNABLE_TO_PROCESS, 0 /* vendorError */);
return; return true;
} }
// Force error-out // Force error-out
@@ -124,7 +129,7 @@ void FakeFingerprintEngine::onEnrollFingerDown(ISessionCallback* cb,
LOG(ERROR) << "Fail: operation_enroll_error"; LOG(ERROR) << "Fail: operation_enroll_error";
auto ec = convertError(err); auto ec = convertError(err);
cb->onError(ec.first, ec.second); cb->onError(ec.first, ec.second);
return; return true;
} }
// Format is "<id>:<progress_ms-[acquiredInfo..]>,...:<result> // Format is "<id>:<progress_ms-[acquiredInfo..]>,...:<result>
@@ -133,7 +138,7 @@ void FakeFingerprintEngine::onEnrollFingerDown(ISessionCallback* cb,
if (parts.size() != 3) { if (parts.size() != 3) {
LOG(ERROR) << "Fail: invalid next_enrollment:" << nextEnroll; LOG(ERROR) << "Fail: invalid next_enrollment:" << nextEnroll;
cb->onError(Error::VENDOR, 0 /* vendorError */); cb->onError(Error::VENDOR, 0 /* vendorError */);
return; return true;
} }
auto enrollmentId = std::stoi(parts[0]); auto enrollmentId = std::stoi(parts[0]);
auto progress = parseEnrollmentCapture(parts[1]); auto progress = parseEnrollmentCapture(parts[1]);
@@ -149,7 +154,7 @@ void FakeFingerprintEngine::onEnrollFingerDown(ISessionCallback* cb,
if (shouldCancel(cancel)) { if (shouldCancel(cancel)) {
LOG(ERROR) << "Fail: cancel"; LOG(ERROR) << "Fail: cancel";
cb->onError(Error::CANCELED, 0 /* vendorCode */); cb->onError(Error::CANCELED, 0 /* vendorCode */);
return; return true;
} }
auto ac = convertAcquiredInfo(acquired[j]); auto ac = convertAcquiredInfo(acquired[j]);
cb->onAcquired(ac.first, ac.second); cb->onAcquired(ac.first, ac.second);
@@ -175,9 +180,11 @@ void FakeFingerprintEngine::onEnrollFingerDown(ISessionCallback* cb,
cb->onEnrollmentProgress(enrollmentId, left); cb->onEnrollmentProgress(enrollmentId, left);
} }
} }
return true;
} }
void FakeFingerprintEngine::onAuthenticateFingerDown(ISessionCallback* cb, bool FakeFingerprintEngine::onAuthenticateFingerDown(ISessionCallback* cb,
int64_t /* operationId */, int64_t /* operationId */,
const std::future<void>& cancel) { const std::future<void>& cancel) {
BEGIN_OP(getLatency(FingerprintHalProperties::operation_authenticate_latency())); BEGIN_OP(getLatency(FingerprintHalProperties::operation_authenticate_latency()));
@@ -191,11 +198,13 @@ void FakeFingerprintEngine::onAuthenticateFingerDown(ISessionCallback* cb,
if (N == 0) { if (N == 0) {
LOG(ERROR) << "Fail to parse authentiate acquired info: " + acquired; LOG(ERROR) << "Fail to parse authentiate acquired info: " + acquired;
cb->onError(Error::UNABLE_TO_PROCESS, 0 /* vendorError */); cb->onError(Error::UNABLE_TO_PROCESS, 0 /* vendorError */);
return; return true;
} }
// got lockout? // got lockout?
if (checkSensorLockout(cb)) return; if (checkSensorLockout(cb)) {
return FakeLockoutTracker::LockoutMode::kPermanent == mLockoutTracker.getMode();
}
int i = 0; int i = 0;
do { do {
@@ -203,7 +212,7 @@ void FakeFingerprintEngine::onAuthenticateFingerDown(ISessionCallback* cb,
LOG(ERROR) << "Fail: operation_authenticate_fails"; LOG(ERROR) << "Fail: operation_authenticate_fails";
mLockoutTracker.addFailedAttempt(); mLockoutTracker.addFailedAttempt();
cb->onAuthenticationFailed(); cb->onAuthenticationFailed();
return; return false;
} }
auto err = FingerprintHalProperties::operation_authenticate_error().value_or(0); auto err = FingerprintHalProperties::operation_authenticate_error().value_or(0);
@@ -211,20 +220,21 @@ void FakeFingerprintEngine::onAuthenticateFingerDown(ISessionCallback* cb,
LOG(ERROR) << "Fail: operation_authenticate_error"; LOG(ERROR) << "Fail: operation_authenticate_error";
auto ec = convertError(err); auto ec = convertError(err);
cb->onError(ec.first, ec.second); cb->onError(ec.first, ec.second);
return; return true; /* simply terminating current operation for any user inserted error,
revisit if tests need*/
} }
if (FingerprintHalProperties::lockout().value_or(false)) { if (FingerprintHalProperties::lockout().value_or(false)) {
LOG(ERROR) << "Fail: lockout"; LOG(ERROR) << "Fail: lockout";
cb->onLockoutPermanent(); cb->onLockoutPermanent();
cb->onError(Error::HW_UNAVAILABLE, 0 /* vendorError */); cb->onError(Error::HW_UNAVAILABLE, 0 /* vendorError */);
return; return true;
} }
if (shouldCancel(cancel)) { if (shouldCancel(cancel)) {
LOG(ERROR) << "Fail: cancel"; LOG(ERROR) << "Fail: cancel";
cb->onError(Error::CANCELED, 0 /* vendorCode */); cb->onError(Error::CANCELED, 0 /* vendorCode */);
return; return true;
} }
if (i < N) { if (i < N) {
@@ -242,16 +252,17 @@ void FakeFingerprintEngine::onAuthenticateFingerDown(ISessionCallback* cb,
if (id > 0 && isEnrolled) { if (id > 0 && isEnrolled) {
cb->onAuthenticationSucceeded(id, {} /* hat */); cb->onAuthenticationSucceeded(id, {} /* hat */);
mLockoutTracker.reset(); mLockoutTracker.reset();
return; return true;
} else { } else {
LOG(ERROR) << "Fail: fingerprint not enrolled"; LOG(ERROR) << "Fail: fingerprint not enrolled";
cb->onAuthenticationFailed(); cb->onAuthenticationFailed();
mLockoutTracker.addFailedAttempt(); mLockoutTracker.addFailedAttempt();
checkSensorLockout(cb); checkSensorLockout(cb);
return true;
} }
} }
void FakeFingerprintEngine::onDetectInteractFingerDown(ISessionCallback* cb, bool FakeFingerprintEngine::onDetectInteractFingerDown(ISessionCallback* cb,
const std::future<void>& cancel) { const std::future<void>& cancel) {
BEGIN_OP(getLatency(FingerprintHalProperties::operation_detect_interaction_latency())); BEGIN_OP(getLatency(FingerprintHalProperties::operation_detect_interaction_latency()));
@@ -266,7 +277,7 @@ void FakeFingerprintEngine::onDetectInteractFingerDown(ISessionCallback* cb,
if (N == 0) { if (N == 0) {
LOG(ERROR) << "Fail to parse detect interaction acquired info: " + acquired; LOG(ERROR) << "Fail to parse detect interaction acquired info: " + acquired;
cb->onError(Error::UNABLE_TO_PROCESS, 0 /* vendorError */); cb->onError(Error::UNABLE_TO_PROCESS, 0 /* vendorError */);
return; return true;
} }
int i = 0; int i = 0;
@@ -276,13 +287,13 @@ void FakeFingerprintEngine::onDetectInteractFingerDown(ISessionCallback* cb,
LOG(ERROR) << "Fail: operation_detect_interaction_error"; LOG(ERROR) << "Fail: operation_detect_interaction_error";
auto ec = convertError(err); auto ec = convertError(err);
cb->onError(ec.first, ec.second); cb->onError(ec.first, ec.second);
return; return true;
} }
if (shouldCancel(cancel)) { if (shouldCancel(cancel)) {
LOG(ERROR) << "Fail: cancel"; LOG(ERROR) << "Fail: cancel";
cb->onError(Error::CANCELED, 0 /* vendorCode */); cb->onError(Error::CANCELED, 0 /* vendorCode */);
return; return true;
} }
if (i < N) { if (i < N) {
@@ -299,10 +310,12 @@ void FakeFingerprintEngine::onDetectInteractFingerDown(ISessionCallback* cb,
if (id <= 0 || !isEnrolled) { if (id <= 0 || !isEnrolled) {
LOG(ERROR) << "Fail: not enrolled"; LOG(ERROR) << "Fail: not enrolled";
cb->onError(Error::UNABLE_TO_PROCESS, 0 /* vendorError */); cb->onError(Error::UNABLE_TO_PROCESS, 0 /* vendorError */);
return; return true;
} }
cb->onInteractionDetected(); cb->onInteractionDetected();
return true;
} }
void FakeFingerprintEngine::enumerateEnrollmentsImpl(ISessionCallback* cb) { void FakeFingerprintEngine::enumerateEnrollmentsImpl(ISessionCallback* cb) {

View File

@@ -94,10 +94,10 @@ class FakeFingerprintEngine {
virtual void updateContext(WorkMode mode, ISessionCallback* cb, std::future<void>& cancel, virtual void updateContext(WorkMode mode, ISessionCallback* cb, std::future<void>& cancel,
int64_t operationId, const keymaster::HardwareAuthToken& hat); int64_t operationId, const keymaster::HardwareAuthToken& hat);
void onEnrollFingerDown(ISessionCallback* cb, const keymaster::HardwareAuthToken& hat, bool onEnrollFingerDown(ISessionCallback* cb, const keymaster::HardwareAuthToken& hat,
const std::future<void>& cancel); const std::future<void>& cancel);
void onAuthenticateFingerDown(ISessionCallback* cb, int64_t, const std::future<void>& cancel); bool onAuthenticateFingerDown(ISessionCallback* cb, int64_t, const std::future<void>& cancel);
void onDetectInteractFingerDown(ISessionCallback* cb, const std::future<void>& cancel); bool onDetectInteractFingerDown(ISessionCallback* cb, const std::future<void>& cancel);
WorkMode mWorkMode; WorkMode mWorkMode;
ISessionCallback* mCb; ISessionCallback* mCb;

View File

@@ -132,6 +132,8 @@ class FakeFingerprintEngineTest : public ::testing::Test {
FingerprintHalProperties::operation_enroll_latency({}); FingerprintHalProperties::operation_enroll_latency({});
FingerprintHalProperties::operation_authenticate_latency({}); FingerprintHalProperties::operation_authenticate_latency({});
FingerprintHalProperties::operation_detect_interaction_latency({}); FingerprintHalProperties::operation_detect_interaction_latency({});
FingerprintHalProperties::operation_authenticate_fails(false);
FingerprintHalProperties::operation_detect_interaction_latency({});
} }
FakeFingerprintEngine mEngine; FakeFingerprintEngine mEngine;
@@ -185,6 +187,7 @@ TEST_F(FakeFingerprintEngineTest, Enroll) {
ASSERT_EQ(4, FingerprintHalProperties::enrollments()[0].value()); ASSERT_EQ(4, FingerprintHalProperties::enrollments()[0].value());
ASSERT_EQ(4, mCallback->mLastEnrolled); ASSERT_EQ(4, mCallback->mLastEnrolled);
ASSERT_EQ(1, mCallback->mLastAcquiredInfo); ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kIdle);
} }
TEST_F(FakeFingerprintEngineTest, EnrollCancel) { TEST_F(FakeFingerprintEngineTest, EnrollCancel) {
@@ -239,6 +242,7 @@ TEST_F(FakeFingerprintEngineTest, Authenticate) {
ASSERT_FALSE(mCallback->mAuthenticateFailed); ASSERT_FALSE(mCallback->mAuthenticateFailed);
ASSERT_EQ(2, mCallback->mLastAuthenticated); ASSERT_EQ(2, mCallback->mLastAuthenticated);
ASSERT_EQ(1, mCallback->mLastAcquiredInfo); ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kIdle);
} }
TEST_F(FakeFingerprintEngineTest, AuthenticateCancel) { TEST_F(FakeFingerprintEngineTest, AuthenticateCancel) {
@@ -293,6 +297,14 @@ TEST_F(FakeFingerprintEngineTest, AuthenticateError9) {
ASSERT_EQ(mCallback->mErrorVendorCode, 9); ASSERT_EQ(mCallback->mErrorVendorCode, 9);
} }
TEST_F(FakeFingerprintEngineTest, AuthenticateFails) {
FingerprintHalProperties::operation_authenticate_fails(true);
mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
mEngine.fingerDownAction();
ASSERT_TRUE(mCallback->mAuthenticateFailed);
ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kAuthenticate);
}
TEST_F(FakeFingerprintEngineTest, AuthenticateAcquired) { TEST_F(FakeFingerprintEngineTest, AuthenticateAcquired) {
FingerprintHalProperties::lockout(false); FingerprintHalProperties::lockout(false);
FingerprintHalProperties::enrollments({1, 2}); FingerprintHalProperties::enrollments({1, 2});
@@ -318,6 +330,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetect) {
mEngine.fingerDownAction(); mEngine.fingerDownAction();
ASSERT_EQ(1, mCallback->mInteractionDetectedCount); ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
ASSERT_EQ(1, mCallback->mLastAcquiredInfo); ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kIdle);
} }
TEST_F(FakeFingerprintEngineTest, InteractionDetectCancel) { TEST_F(FakeFingerprintEngineTest, InteractionDetectCancel) {
@@ -483,7 +496,6 @@ TEST_F(FakeFingerprintEngineTest, randomLatency) {
FingerprintHalProperties::operation_detect_interaction_latency())); FingerprintHalProperties::operation_detect_interaction_latency()));
} }
ASSERT_TRUE(latencySet.size() > 95); ASSERT_TRUE(latencySet.size() > 95);
FingerprintHalProperties::operation_detect_interaction_latency({});
} }
} // namespace aidl::android::hardware::biometrics::fingerprint } // namespace aidl::android::hardware::biometrics::fingerprint