blob: eedcae1a3587a70d6e7fdd40d228508a9495753a [file] [log] [blame]
Joe Bolingerde94aa02021-12-09 17:00:32 -08001/*
Jeff Pu52653182022-10-12 16:27:23 -04002 * Copyright (C) 2022 The Android Open Source Project
Joe Bolingerde94aa02021-12-09 17:00:32 -08003 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <android/binder_process.h>
18#include <fingerprint.sysprop.h>
19#include <gtest/gtest.h>
20
21#include <aidl/android/hardware/biometrics/fingerprint/BnSessionCallback.h>
22
23#include "FakeFingerprintEngine.h"
Jeff Pu52653182022-10-12 16:27:23 -040024#include "util/Util.h"
Joe Bolingerde94aa02021-12-09 17:00:32 -080025
26using namespace ::android::fingerprint::virt;
27using namespace ::aidl::android::hardware::biometrics::fingerprint;
28using namespace ::aidl::android::hardware::keymaster;
29
30namespace aidl::android::hardware::biometrics::fingerprint {
31
32class TestSessionCallback : public BnSessionCallback {
33 public:
34 ndk::ScopedAStatus onChallengeGenerated(int64_t challenge) override {
35 mLastChallenge = challenge;
36 return ndk::ScopedAStatus::ok();
37 };
38 ::ndk::ScopedAStatus onChallengeRevoked(int64_t challenge) override {
39 mLastChallengeRevoked = challenge;
40 return ndk::ScopedAStatus::ok();
41 };
Jeff Pu343ca942022-09-14 15:56:30 -040042 ::ndk::ScopedAStatus onError(fingerprint::Error error, int32_t vendorCode) override {
Joe Bolingerde94aa02021-12-09 17:00:32 -080043 mError = error;
Jeff Pu343ca942022-09-14 15:56:30 -040044 mErrorVendorCode = vendorCode;
Joe Bolingerde94aa02021-12-09 17:00:32 -080045 return ndk::ScopedAStatus::ok();
46 };
47 ::ndk::ScopedAStatus onEnrollmentProgress(int32_t enrollmentId, int32_t remaining) override {
48 if (remaining == 0) mLastEnrolled = enrollmentId;
49 return ndk::ScopedAStatus::ok();
50 };
51
52 ::ndk::ScopedAStatus onAuthenticationSucceeded(int32_t enrollmentId,
53 const keymaster::HardwareAuthToken&) override {
54 mLastAuthenticated = enrollmentId;
55 mAuthenticateFailed = false;
56 return ndk::ScopedAStatus::ok();
57 };
58 ::ndk::ScopedAStatus onAuthenticationFailed() override {
59 mLastAuthenticated = 0;
60 mAuthenticateFailed = true;
61 return ndk::ScopedAStatus::ok();
62 };
63 ::ndk::ScopedAStatus onInteractionDetected() override {
64 mInteractionDetectedCount++;
65 return ndk::ScopedAStatus::ok();
66 };
Jeff Pu343ca942022-09-14 15:56:30 -040067 ndk::ScopedAStatus onAcquired(AcquiredInfo info, int32_t vendorCode) override {
68 mLastAcquiredInfo = (int32_t)info;
69 mLastAcquiredVendorCode = vendorCode;
70 mLastAcquiredCount++;
Joe Bolingerde94aa02021-12-09 17:00:32 -080071 return ndk::ScopedAStatus::ok();
72 }
73 ::ndk::ScopedAStatus onEnrollmentsEnumerated(
74 const std::vector<int32_t>& enrollmentIds) override {
75 mLastEnrollmentEnumerated = enrollmentIds;
76 return ndk::ScopedAStatus::ok();
77 };
78 ::ndk::ScopedAStatus onEnrollmentsRemoved(const std::vector<int32_t>& enrollmentIds) override {
79 mLastEnrollmentRemoved = enrollmentIds;
80 return ndk::ScopedAStatus::ok();
81 };
82 ::ndk::ScopedAStatus onAuthenticatorIdRetrieved(int64_t authenticatorId) override {
83 mLastAuthenticatorId = authenticatorId;
84 return ndk::ScopedAStatus::ok();
85 };
86 ::ndk::ScopedAStatus onAuthenticatorIdInvalidated(int64_t authenticatorId) override {
87 mLastAuthenticatorId = authenticatorId;
88 mAuthenticatorIdInvalidated = true;
89 return ndk::ScopedAStatus::ok();
90 };
91 ::ndk::ScopedAStatus onLockoutPermanent() override {
92 mLockoutPermanent = true;
93 return ndk::ScopedAStatus::ok();
94 };
95 ndk::ScopedAStatus onLockoutTimed(int64_t /* timeout */) override {
Jeff Puc6f21462023-08-04 13:41:37 +000096 mLockoutTimed = true;
Joe Bolingerde94aa02021-12-09 17:00:32 -080097 return ndk::ScopedAStatus::ok();
98 }
Jeff Puc6f21462023-08-04 13:41:37 +000099 ndk::ScopedAStatus onLockoutCleared() override {
100 mLockoutCleared = true;
101 return ndk::ScopedAStatus::ok();
102 }
Joe Bolingerde94aa02021-12-09 17:00:32 -0800103 ndk::ScopedAStatus onSessionClosed() override { return ndk::ScopedAStatus::ok(); }
104
105 Error mError = Error::UNKNOWN;
Jeff Pu343ca942022-09-14 15:56:30 -0400106 int32_t mErrorVendorCode = 0;
Joe Bolingerde94aa02021-12-09 17:00:32 -0800107 int64_t mLastChallenge = -1;
108 int64_t mLastChallengeRevoked = -1;
109 int32_t mLastEnrolled = -1;
110 int32_t mLastAuthenticated = -1;
111 int64_t mLastAuthenticatorId = -1;
112 std::vector<int32_t> mLastEnrollmentEnumerated;
113 std::vector<int32_t> mLastEnrollmentRemoved;
114 bool mAuthenticateFailed = false;
115 bool mAuthenticatorIdInvalidated = false;
116 bool mLockoutPermanent = false;
Jeff Puc6f21462023-08-04 13:41:37 +0000117 bool mLockoutTimed = false;
118 bool mLockoutCleared = false;
Joe Bolingerde94aa02021-12-09 17:00:32 -0800119 int mInteractionDetectedCount = 0;
Jeff Pu343ca942022-09-14 15:56:30 -0400120 int32_t mLastAcquiredInfo = -1;
121 int32_t mLastAcquiredVendorCode = -1;
122 int32_t mLastAcquiredCount = 0;
Joe Bolingerde94aa02021-12-09 17:00:32 -0800123};
124
125class FakeFingerprintEngineTest : public ::testing::Test {
126 protected:
127 void SetUp() override {
Jeff Pu52653182022-10-12 16:27:23 -0400128 FingerprintHalProperties::operation_enroll_latency({0});
129 FingerprintHalProperties::operation_authenticate_latency({0});
130 FingerprintHalProperties::operation_detect_interaction_latency({0});
Joe Bolingerde94aa02021-12-09 17:00:32 -0800131 mCallback = ndk::SharedRefBase::make<TestSessionCallback>();
132 }
133
Jeff Pu343ca942022-09-14 15:56:30 -0400134 void TearDown() override {
135 FingerprintHalProperties::operation_authenticate_error(0);
136 FingerprintHalProperties::operation_detect_interaction_error(0);
137 FingerprintHalProperties::operation_authenticate_acquired("");
Jeff Pu52653182022-10-12 16:27:23 -0400138 FingerprintHalProperties::operation_enroll_latency({});
139 FingerprintHalProperties::operation_authenticate_latency({});
140 FingerprintHalProperties::operation_detect_interaction_latency({});
Jeff Pu073af182023-07-12 18:53:52 +0000141 FingerprintHalProperties::operation_authenticate_fails(false);
142 FingerprintHalProperties::operation_detect_interaction_latency({});
Jeff Pu343ca942022-09-14 15:56:30 -0400143 }
144
Joe Bolingerde94aa02021-12-09 17:00:32 -0800145 FakeFingerprintEngine mEngine;
146 std::shared_ptr<TestSessionCallback> mCallback;
147 std::promise<void> mCancel;
148};
149
150TEST_F(FakeFingerprintEngineTest, GenerateChallenge) {
151 mEngine.generateChallengeImpl(mCallback.get());
152 ASSERT_EQ(FingerprintHalProperties::challenge().value(), mCallback->mLastChallenge);
153}
154
155TEST_F(FakeFingerprintEngineTest, RevokeChallenge) {
156 auto challenge = FingerprintHalProperties::challenge().value_or(10);
157 mEngine.revokeChallengeImpl(mCallback.get(), challenge);
158 ASSERT_FALSE(FingerprintHalProperties::challenge().has_value());
159 ASSERT_EQ(challenge, mCallback->mLastChallengeRevoked);
160}
161
162TEST_F(FakeFingerprintEngineTest, ResetLockout) {
163 FingerprintHalProperties::lockout(true);
Jeff Pu343ca942022-09-14 15:56:30 -0400164 keymaster::HardwareAuthToken hat{.mac = {2, 4}};
165 mEngine.resetLockoutImpl(mCallback.get(), hat);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800166 ASSERT_FALSE(FingerprintHalProperties::lockout().value_or(true));
167}
168
169TEST_F(FakeFingerprintEngineTest, AuthenticatorId) {
Jeff Pu343ca942022-09-14 15:56:30 -0400170 FingerprintHalProperties::enrollments({1});
Joe Bolingerde94aa02021-12-09 17:00:32 -0800171 FingerprintHalProperties::authenticator_id(50);
172 mEngine.getAuthenticatorIdImpl(mCallback.get());
173 ASSERT_EQ(50, mCallback->mLastAuthenticatorId);
174 ASSERT_FALSE(mCallback->mAuthenticatorIdInvalidated);
175}
176
177TEST_F(FakeFingerprintEngineTest, AuthenticatorIdInvalidate) {
178 FingerprintHalProperties::authenticator_id(500);
179 mEngine.invalidateAuthenticatorIdImpl(mCallback.get());
180 ASSERT_NE(500, FingerprintHalProperties::authenticator_id().value());
181 ASSERT_TRUE(mCallback->mAuthenticatorIdInvalidated);
182}
183
184TEST_F(FakeFingerprintEngineTest, Enroll) {
185 FingerprintHalProperties::enrollments({});
186 FingerprintHalProperties::next_enrollment("4:0,0:true");
187 keymaster::HardwareAuthToken hat{.mac = {2, 4}};
188 mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400189 ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kEnroll);
190 mEngine.fingerDownAction();
Joe Bolingerde94aa02021-12-09 17:00:32 -0800191 ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
192 ASSERT_EQ(1, FingerprintHalProperties::enrollments().size());
193 ASSERT_EQ(4, FingerprintHalProperties::enrollments()[0].value());
194 ASSERT_EQ(4, mCallback->mLastEnrolled);
Jeff Pu343ca942022-09-14 15:56:30 -0400195 ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
Jeff Pu073af182023-07-12 18:53:52 +0000196 ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kIdle);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800197}
198
199TEST_F(FakeFingerprintEngineTest, EnrollCancel) {
200 FingerprintHalProperties::enrollments({});
201 auto next = "4:0,0:true";
202 FingerprintHalProperties::next_enrollment(next);
203 keymaster::HardwareAuthToken hat{.mac = {2, 4}};
204 mCancel.set_value();
205 mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400206 mEngine.fingerDownAction();
Joe Bolingerde94aa02021-12-09 17:00:32 -0800207 ASSERT_EQ(Error::CANCELED, mCallback->mError);
208 ASSERT_EQ(-1, mCallback->mLastEnrolled);
209 ASSERT_EQ(0, FingerprintHalProperties::enrollments().size());
210 ASSERT_EQ(next, FingerprintHalProperties::next_enrollment().value_or(""));
211}
212
213TEST_F(FakeFingerprintEngineTest, EnrollFail) {
214 FingerprintHalProperties::enrollments({});
215 auto next = "2:0,0:false";
216 FingerprintHalProperties::next_enrollment(next);
217 keymaster::HardwareAuthToken hat{.mac = {2, 4}};
218 mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400219 mEngine.fingerDownAction();
Joe Bolingerde94aa02021-12-09 17:00:32 -0800220 ASSERT_EQ(Error::UNABLE_TO_PROCESS, mCallback->mError);
221 ASSERT_EQ(-1, mCallback->mLastEnrolled);
222 ASSERT_EQ(0, FingerprintHalProperties::enrollments().size());
223 ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
224}
225
Jeff Pu343ca942022-09-14 15:56:30 -0400226TEST_F(FakeFingerprintEngineTest, EnrollAcquired) {
227 FingerprintHalProperties::enrollments({});
228 FingerprintHalProperties::next_enrollment("4:0,5-[12,1013]:true");
229 keymaster::HardwareAuthToken hat{.mac = {2, 4}};
230 int32_t prevCnt = mCallback->mLastAcquiredCount;
231 mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400232 mEngine.fingerDownAction();
Jeff Pu343ca942022-09-14 15:56:30 -0400233 ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
234 ASSERT_EQ(1, FingerprintHalProperties::enrollments().size());
235 ASSERT_EQ(4, FingerprintHalProperties::enrollments()[0].value());
236 ASSERT_EQ(4, mCallback->mLastEnrolled);
237 ASSERT_EQ(prevCnt + 3, mCallback->mLastAcquiredCount);
238 ASSERT_EQ(7, mCallback->mLastAcquiredInfo);
239 ASSERT_EQ(13, mCallback->mLastAcquiredVendorCode);
240}
241
Joe Bolingerde94aa02021-12-09 17:00:32 -0800242TEST_F(FakeFingerprintEngineTest, Authenticate) {
243 FingerprintHalProperties::enrollments({1, 2});
244 FingerprintHalProperties::enrollment_hit(2);
245 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400246 ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kAuthenticate);
247 mEngine.fingerDownAction();
Joe Bolingerde94aa02021-12-09 17:00:32 -0800248 ASSERT_FALSE(mCallback->mAuthenticateFailed);
249 ASSERT_EQ(2, mCallback->mLastAuthenticated);
Jeff Pu343ca942022-09-14 15:56:30 -0400250 ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
Jeff Pu073af182023-07-12 18:53:52 +0000251 ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kIdle);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800252}
253
254TEST_F(FakeFingerprintEngineTest, AuthenticateCancel) {
255 FingerprintHalProperties::enrollments({2});
256 FingerprintHalProperties::enrollment_hit(2);
257 mCancel.set_value();
258 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400259 mEngine.fingerDownAction();
Joe Bolingerde94aa02021-12-09 17:00:32 -0800260 ASSERT_EQ(Error::CANCELED, mCallback->mError);
261 ASSERT_EQ(-1, mCallback->mLastAuthenticated);
262}
263
264TEST_F(FakeFingerprintEngineTest, AuthenticateNotSet) {
265 FingerprintHalProperties::enrollments({1, 2});
266 FingerprintHalProperties::enrollment_hit({});
267 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400268 mEngine.fingerDownAction();
Joe Bolingerde94aa02021-12-09 17:00:32 -0800269 ASSERT_TRUE(mCallback->mAuthenticateFailed);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800270}
271
272TEST_F(FakeFingerprintEngineTest, AuthenticateNotEnrolled) {
273 FingerprintHalProperties::enrollments({1, 2});
274 FingerprintHalProperties::enrollment_hit(3);
275 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400276 mEngine.fingerDownAction();
Joe Bolingerde94aa02021-12-09 17:00:32 -0800277 ASSERT_TRUE(mCallback->mAuthenticateFailed);
Jeff Pu8fec5562023-07-20 13:07:04 +0000278 ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kAuthenticate);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800279}
280
281TEST_F(FakeFingerprintEngineTest, AuthenticateLockout) {
282 FingerprintHalProperties::enrollments({22, 2});
283 FingerprintHalProperties::enrollment_hit(2);
284 FingerprintHalProperties::lockout(true);
285 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400286 mEngine.fingerDownAction();
Joe Bolingerde94aa02021-12-09 17:00:32 -0800287 ASSERT_TRUE(mCallback->mLockoutPermanent);
288 ASSERT_NE(mCallback->mError, Error::UNKNOWN);
289}
290
Jeff Pu343ca942022-09-14 15:56:30 -0400291TEST_F(FakeFingerprintEngineTest, AuthenticateError8) {
292 FingerprintHalProperties::operation_authenticate_error(8);
293 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400294 mEngine.fingerDownAction();
Jeff Pu343ca942022-09-14 15:56:30 -0400295 ASSERT_EQ(mCallback->mError, (Error)8);
296 ASSERT_EQ(mCallback->mErrorVendorCode, 0);
297}
298
299TEST_F(FakeFingerprintEngineTest, AuthenticateError9) {
300 FingerprintHalProperties::operation_authenticate_error(1009);
301 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400302 mEngine.fingerDownAction();
Jeff Pu343ca942022-09-14 15:56:30 -0400303 ASSERT_EQ(mCallback->mError, (Error)7);
304 ASSERT_EQ(mCallback->mErrorVendorCode, 9);
305}
306
Jeff Pu073af182023-07-12 18:53:52 +0000307TEST_F(FakeFingerprintEngineTest, AuthenticateFails) {
308 FingerprintHalProperties::operation_authenticate_fails(true);
309 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
310 mEngine.fingerDownAction();
311 ASSERT_TRUE(mCallback->mAuthenticateFailed);
312 ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kAuthenticate);
313}
314
Jeff Pu343ca942022-09-14 15:56:30 -0400315TEST_F(FakeFingerprintEngineTest, AuthenticateAcquired) {
316 FingerprintHalProperties::lockout(false);
317 FingerprintHalProperties::enrollments({1, 2});
318 FingerprintHalProperties::enrollment_hit(2);
319 FingerprintHalProperties::operation_authenticate_acquired("4,1009");
320 int32_t prevCount = mCallback->mLastAcquiredCount;
321 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400322 mEngine.fingerDownAction();
Jeff Pu343ca942022-09-14 15:56:30 -0400323 ASSERT_FALSE(mCallback->mAuthenticateFailed);
324 ASSERT_EQ(2, mCallback->mLastAuthenticated);
325 ASSERT_EQ(prevCount + 2, mCallback->mLastAcquiredCount);
326 ASSERT_EQ(7, mCallback->mLastAcquiredInfo);
327 ASSERT_EQ(9, mCallback->mLastAcquiredVendorCode);
328}
329
Joe Bolingerde94aa02021-12-09 17:00:32 -0800330TEST_F(FakeFingerprintEngineTest, InteractionDetect) {
Jeff Pu52653182022-10-12 16:27:23 -0400331 FingerprintHalProperties::detect_interaction(true);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800332 FingerprintHalProperties::enrollments({1, 2});
333 FingerprintHalProperties::enrollment_hit(2);
Jeff Pu343ca942022-09-14 15:56:30 -0400334 FingerprintHalProperties::operation_detect_interaction_acquired("");
Joe Bolingerde94aa02021-12-09 17:00:32 -0800335 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400336 ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kDetectInteract);
337 mEngine.fingerDownAction();
Joe Bolingerde94aa02021-12-09 17:00:32 -0800338 ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
Jeff Pu343ca942022-09-14 15:56:30 -0400339 ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
Jeff Pu073af182023-07-12 18:53:52 +0000340 ASSERT_EQ(mEngine.getWorkMode(), FakeFingerprintEngine::WorkMode::kIdle);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800341}
342
343TEST_F(FakeFingerprintEngineTest, InteractionDetectCancel) {
Jeff Pu52653182022-10-12 16:27:23 -0400344 FingerprintHalProperties::detect_interaction(true);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800345 FingerprintHalProperties::enrollments({1, 2});
346 FingerprintHalProperties::enrollment_hit(2);
347 mCancel.set_value();
348 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400349 mEngine.fingerDownAction();
Joe Bolingerde94aa02021-12-09 17:00:32 -0800350 ASSERT_EQ(Error::CANCELED, mCallback->mError);
351 ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
352}
353
354TEST_F(FakeFingerprintEngineTest, InteractionDetectNotSet) {
Jeff Pu52653182022-10-12 16:27:23 -0400355 FingerprintHalProperties::detect_interaction(true);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800356 FingerprintHalProperties::enrollments({1, 2});
357 FingerprintHalProperties::enrollment_hit({});
358 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400359 mEngine.fingerDownAction();
Jeff Pu29df1e92023-10-06 14:12:44 +0000360 ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800361}
362
363TEST_F(FakeFingerprintEngineTest, InteractionDetectNotEnrolled) {
364 FingerprintHalProperties::enrollments({1, 2});
365 FingerprintHalProperties::enrollment_hit(25);
366 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400367 mEngine.fingerDownAction();
Jeff Pu29df1e92023-10-06 14:12:44 +0000368 ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800369}
370
Jeff Pu343ca942022-09-14 15:56:30 -0400371TEST_F(FakeFingerprintEngineTest, InteractionDetectError) {
Jeff Pu52653182022-10-12 16:27:23 -0400372 FingerprintHalProperties::detect_interaction(true);
Jeff Pu343ca942022-09-14 15:56:30 -0400373 FingerprintHalProperties::operation_detect_interaction_error(8);
374 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400375 mEngine.fingerDownAction();
Jeff Pu343ca942022-09-14 15:56:30 -0400376 ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
377 ASSERT_EQ(mCallback->mError, (Error)8);
378 ASSERT_EQ(mCallback->mErrorVendorCode, 0);
379}
380
381TEST_F(FakeFingerprintEngineTest, InteractionDetectAcquired) {
Jeff Pu52653182022-10-12 16:27:23 -0400382 FingerprintHalProperties::detect_interaction(true);
Jeff Pu343ca942022-09-14 15:56:30 -0400383 FingerprintHalProperties::enrollments({1, 2});
384 FingerprintHalProperties::enrollment_hit(2);
385 FingerprintHalProperties::operation_detect_interaction_acquired("4,1013");
386 int32_t prevCount = mCallback->mLastAcquiredCount;
387 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
Jeff Pudef5b042023-05-25 14:28:16 -0400388 mEngine.fingerDownAction();
Jeff Pu343ca942022-09-14 15:56:30 -0400389 ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
390 ASSERT_EQ(prevCount + 2, mCallback->mLastAcquiredCount);
391 ASSERT_EQ(7, mCallback->mLastAcquiredInfo);
392 ASSERT_EQ(13, mCallback->mLastAcquiredVendorCode);
393}
394
Joe Bolingerde94aa02021-12-09 17:00:32 -0800395TEST_F(FakeFingerprintEngineTest, EnumerateEnrolled) {
396 FingerprintHalProperties::enrollments({2, 4, 8});
397 mEngine.enumerateEnrollmentsImpl(mCallback.get());
Jeff Pu437516e2023-06-28 15:21:21 +0000398 ASSERT_EQ(3, mCallback->mLastEnrollmentEnumerated.size());
Joe Bolingerde94aa02021-12-09 17:00:32 -0800399 for (auto id : FingerprintHalProperties::enrollments()) {
400 ASSERT_TRUE(std::find(mCallback->mLastEnrollmentEnumerated.begin(),
401 mCallback->mLastEnrollmentEnumerated.end(),
402 id) != mCallback->mLastEnrollmentEnumerated.end());
403 }
404}
405
406TEST_F(FakeFingerprintEngineTest, RemoveEnrolled) {
407 FingerprintHalProperties::enrollments({2, 4, 8, 1});
408 mEngine.removeEnrollmentsImpl(mCallback.get(), {2, 8});
409 auto enrolls = FingerprintHalProperties::enrollments();
410 ASSERT_EQ(2, mCallback->mLastEnrollmentRemoved.size());
411 for (auto id : {2, 8}) {
412 ASSERT_TRUE(std::find(mCallback->mLastEnrollmentRemoved.begin(),
413 mCallback->mLastEnrollmentRemoved.end(),
414 id) != mCallback->mLastEnrollmentRemoved.end());
415 }
416 ASSERT_EQ(2, enrolls.size());
417 for (auto id : {1, 4}) {
418 ASSERT_TRUE(std::find(enrolls.begin(), enrolls.end(), id) != enrolls.end());
419 }
420}
421
Jeff Pu343ca942022-09-14 15:56:30 -0400422TEST_F(FakeFingerprintEngineTest, parseIntSequence) {
423 std::vector<int32_t> seqV;
Jeff Pu484d2e72023-09-25 15:11:19 +0000424 seqV = Util::parseIntSequence("");
Jeff Pu343ca942022-09-14 15:56:30 -0400425 ASSERT_EQ(0, seqV.size());
Jeff Pu484d2e72023-09-25 15:11:19 +0000426 seqV = Util::parseIntSequence("2");
Jeff Pu343ca942022-09-14 15:56:30 -0400427 ASSERT_EQ(1, seqV.size());
428 ASSERT_EQ(2, seqV[0]);
Jeff Pu484d2e72023-09-25 15:11:19 +0000429 seqV = Util::parseIntSequence("2,3,4");
Jeff Pu343ca942022-09-14 15:56:30 -0400430 std::vector<int32_t> expV{2, 3, 4};
431 ASSERT_EQ(expV, seqV);
Jeff Pu484d2e72023-09-25 15:11:19 +0000432 seqV = Util::parseIntSequence("2,3,a");
Jeff Pu343ca942022-09-14 15:56:30 -0400433 ASSERT_EQ(0, seqV.size());
Jeff Pu484d2e72023-09-25 15:11:19 +0000434 seqV = Util::parseIntSequence("2, 3, 4");
Jeff Pu343ca942022-09-14 15:56:30 -0400435 ASSERT_EQ(expV, seqV);
Jeff Pu484d2e72023-09-25 15:11:19 +0000436 seqV = Util::parseIntSequence("123,456");
Jeff Pu343ca942022-09-14 15:56:30 -0400437 ASSERT_EQ(2, seqV.size());
438 std::vector<int32_t> expV1{123, 456};
439 ASSERT_EQ(expV1, seqV);
Jeff Pu484d2e72023-09-25 15:11:19 +0000440 seqV = Util::parseIntSequence("12f3,456");
Jeff Pu343ca942022-09-14 15:56:30 -0400441 ASSERT_EQ(0, seqV.size());
442}
443
444TEST_F(FakeFingerprintEngineTest, parseEnrollmentCaptureOk) {
445 std::vector<std::vector<int32_t>> ecV;
Jeff Pu484d2e72023-09-25 15:11:19 +0000446 ecV = Util::parseEnrollmentCapture("100,200,300");
Jeff Pu343ca942022-09-14 15:56:30 -0400447 ASSERT_EQ(6, ecV.size());
448 std::vector<std::vector<int32_t>> expE{{100}, {200}, {300}};
449 std::vector<int32_t> defC{1};
450 for (int i = 0; i < ecV.size(); i += 2) {
451 ASSERT_EQ(expE[i / 2], ecV[i]);
452 ASSERT_EQ(defC, ecV[i + 1]);
453 }
Jeff Pu484d2e72023-09-25 15:11:19 +0000454 ecV = Util::parseEnrollmentCapture("100");
Jeff Pu343ca942022-09-14 15:56:30 -0400455 ASSERT_EQ(2, ecV.size());
456 ASSERT_EQ(expE[0], ecV[0]);
457 ASSERT_EQ(defC, ecV[1]);
458
Jeff Pu484d2e72023-09-25 15:11:19 +0000459 ecV = Util::parseEnrollmentCapture("100-[5,6,7]");
Jeff Pu343ca942022-09-14 15:56:30 -0400460 std::vector<int32_t> expC{5, 6, 7};
461 ASSERT_EQ(2, ecV.size());
462 for (int i = 0; i < ecV.size(); i += 2) {
463 ASSERT_EQ(expE[i / 2], ecV[i]);
464 ASSERT_EQ(expC, ecV[i + 1]);
465 }
Jeff Pu484d2e72023-09-25 15:11:19 +0000466 ecV = Util::parseEnrollmentCapture("100-[5,6,7], 200, 300-[9,10]");
Jeff Pu343ca942022-09-14 15:56:30 -0400467 std::vector<std::vector<int32_t>> expC1{{5, 6, 7}, {1}, {9, 10}};
468 ASSERT_EQ(6, ecV.size());
469 for (int i = 0; i < ecV.size(); i += 2) {
470 ASSERT_EQ(expE[i / 2], ecV[i]);
471 ASSERT_EQ(expC1[i / 2], ecV[i + 1]);
472 }
Jeff Pu484d2e72023-09-25 15:11:19 +0000473 ecV = Util::parseEnrollmentCapture("100-[5,6,7], 200-[2,1], 300-[9]");
Jeff Pu343ca942022-09-14 15:56:30 -0400474 std::vector<std::vector<int32_t>> expC2{{5, 6, 7}, {2, 1}, {9}};
475 ASSERT_EQ(ecV.size(), 6);
476 for (int i = 0; i < ecV.size(); i += 2) {
477 ASSERT_EQ(expE[i / 2], ecV[i]);
478 ASSERT_EQ(expC2[i / 2], ecV[i + 1]);
479 }
480}
481
482TEST_F(FakeFingerprintEngineTest, parseEnrollmentCaptureFail) {
483 std::vector<std::string> badStr{"10c", "100-5", "100-[5,6,7", "100-5,6,7]",
484 "100,2x0,300", "200-[f]", "a,b"};
485 std::vector<std::vector<int32_t>> ecV;
Jeff Pu52653182022-10-12 16:27:23 -0400486 for (const auto& s : badStr) {
Jeff Pu484d2e72023-09-25 15:11:19 +0000487 ecV = Util::parseEnrollmentCapture(s);
Jeff Pu343ca942022-09-14 15:56:30 -0400488 ASSERT_EQ(ecV.size(), 0);
489 }
490}
491
Jeff Pu52653182022-10-12 16:27:23 -0400492TEST_F(FakeFingerprintEngineTest, randomLatency) {
493 FingerprintHalProperties::operation_detect_interaction_latency({});
494 ASSERT_EQ(DEFAULT_LATENCY,
495 mEngine.getLatency(FingerprintHalProperties::operation_detect_interaction_latency()));
496 FingerprintHalProperties::operation_detect_interaction_latency({10});
497 ASSERT_EQ(10,
498 mEngine.getLatency(FingerprintHalProperties::operation_detect_interaction_latency()));
499 FingerprintHalProperties::operation_detect_interaction_latency({1, 1000});
500 std::set<int32_t> latencySet;
501 for (int i = 0; i < 100; i++) {
502 latencySet.insert(mEngine.getLatency(
503 FingerprintHalProperties::operation_detect_interaction_latency()));
504 }
505 ASSERT_TRUE(latencySet.size() > 95);
Jeff Pu52653182022-10-12 16:27:23 -0400506}
507
Jeff Puc6f21462023-08-04 13:41:37 +0000508TEST_F(FakeFingerprintEngineTest, lockoutTimer) {
509 mEngine.startLockoutTimer(200, mCallback.get());
510 ASSERT_TRUE(mEngine.getLockoutTimerStarted());
Jeff Pu29df1e92023-10-06 14:12:44 +0000511 std::this_thread::sleep_for(std::chrono::milliseconds(250));
Jeff Puc6f21462023-08-04 13:41:37 +0000512 ASSERT_FALSE(mEngine.getLockoutTimerStarted());
513 ASSERT_TRUE(mCallback->mLockoutCleared);
514}
Joe Bolingerde94aa02021-12-09 17:00:32 -0800515} // namespace aidl::android::hardware::biometrics::fingerprint
516
517int main(int argc, char** argv) {
518 testing::InitGoogleTest(&argc, argv);
519 ABinderProcess_startThreadPool();
520 return RUN_ALL_TESTS();
521}