blob: a200b397398d1d236f04ec9349472185965beefa [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 {
96 return ndk::ScopedAStatus::ok();
97 }
98 ndk::ScopedAStatus onLockoutCleared() override { return ndk::ScopedAStatus::ok(); }
99 ndk::ScopedAStatus onSessionClosed() override { return ndk::ScopedAStatus::ok(); }
100
101 Error mError = Error::UNKNOWN;
Jeff Pu343ca942022-09-14 15:56:30 -0400102 int32_t mErrorVendorCode = 0;
Joe Bolingerde94aa02021-12-09 17:00:32 -0800103 int64_t mLastChallenge = -1;
104 int64_t mLastChallengeRevoked = -1;
105 int32_t mLastEnrolled = -1;
106 int32_t mLastAuthenticated = -1;
107 int64_t mLastAuthenticatorId = -1;
108 std::vector<int32_t> mLastEnrollmentEnumerated;
109 std::vector<int32_t> mLastEnrollmentRemoved;
110 bool mAuthenticateFailed = false;
111 bool mAuthenticatorIdInvalidated = false;
112 bool mLockoutPermanent = false;
113 int mInteractionDetectedCount = 0;
Jeff Pu343ca942022-09-14 15:56:30 -0400114 int32_t mLastAcquiredInfo = -1;
115 int32_t mLastAcquiredVendorCode = -1;
116 int32_t mLastAcquiredCount = 0;
Joe Bolingerde94aa02021-12-09 17:00:32 -0800117};
118
119class FakeFingerprintEngineTest : public ::testing::Test {
120 protected:
121 void SetUp() override {
Jeff Pu52653182022-10-12 16:27:23 -0400122 FingerprintHalProperties::operation_enroll_latency({0});
123 FingerprintHalProperties::operation_authenticate_latency({0});
124 FingerprintHalProperties::operation_detect_interaction_latency({0});
Joe Bolingerde94aa02021-12-09 17:00:32 -0800125 mCallback = ndk::SharedRefBase::make<TestSessionCallback>();
126 }
127
Jeff Pu343ca942022-09-14 15:56:30 -0400128 void TearDown() override {
129 FingerprintHalProperties::operation_authenticate_error(0);
130 FingerprintHalProperties::operation_detect_interaction_error(0);
131 FingerprintHalProperties::operation_authenticate_acquired("");
Jeff Pu52653182022-10-12 16:27:23 -0400132 FingerprintHalProperties::operation_enroll_latency({});
133 FingerprintHalProperties::operation_authenticate_latency({});
134 FingerprintHalProperties::operation_detect_interaction_latency({});
Jeff Pu343ca942022-09-14 15:56:30 -0400135 }
136
Joe Bolingerde94aa02021-12-09 17:00:32 -0800137 FakeFingerprintEngine mEngine;
138 std::shared_ptr<TestSessionCallback> mCallback;
139 std::promise<void> mCancel;
140};
141
142TEST_F(FakeFingerprintEngineTest, GenerateChallenge) {
143 mEngine.generateChallengeImpl(mCallback.get());
144 ASSERT_EQ(FingerprintHalProperties::challenge().value(), mCallback->mLastChallenge);
145}
146
147TEST_F(FakeFingerprintEngineTest, RevokeChallenge) {
148 auto challenge = FingerprintHalProperties::challenge().value_or(10);
149 mEngine.revokeChallengeImpl(mCallback.get(), challenge);
150 ASSERT_FALSE(FingerprintHalProperties::challenge().has_value());
151 ASSERT_EQ(challenge, mCallback->mLastChallengeRevoked);
152}
153
154TEST_F(FakeFingerprintEngineTest, ResetLockout) {
155 FingerprintHalProperties::lockout(true);
Jeff Pu343ca942022-09-14 15:56:30 -0400156 keymaster::HardwareAuthToken hat{.mac = {2, 4}};
157 mEngine.resetLockoutImpl(mCallback.get(), hat);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800158 ASSERT_FALSE(FingerprintHalProperties::lockout().value_or(true));
159}
160
161TEST_F(FakeFingerprintEngineTest, AuthenticatorId) {
Jeff Pu343ca942022-09-14 15:56:30 -0400162 FingerprintHalProperties::enrollments({1});
Joe Bolingerde94aa02021-12-09 17:00:32 -0800163 FingerprintHalProperties::authenticator_id(50);
164 mEngine.getAuthenticatorIdImpl(mCallback.get());
165 ASSERT_EQ(50, mCallback->mLastAuthenticatorId);
166 ASSERT_FALSE(mCallback->mAuthenticatorIdInvalidated);
167}
168
169TEST_F(FakeFingerprintEngineTest, AuthenticatorIdInvalidate) {
170 FingerprintHalProperties::authenticator_id(500);
171 mEngine.invalidateAuthenticatorIdImpl(mCallback.get());
172 ASSERT_NE(500, FingerprintHalProperties::authenticator_id().value());
173 ASSERT_TRUE(mCallback->mAuthenticatorIdInvalidated);
174}
175
176TEST_F(FakeFingerprintEngineTest, Enroll) {
177 FingerprintHalProperties::enrollments({});
178 FingerprintHalProperties::next_enrollment("4:0,0:true");
179 keymaster::HardwareAuthToken hat{.mac = {2, 4}};
180 mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
181 ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
182 ASSERT_EQ(1, FingerprintHalProperties::enrollments().size());
183 ASSERT_EQ(4, FingerprintHalProperties::enrollments()[0].value());
184 ASSERT_EQ(4, mCallback->mLastEnrolled);
Jeff Pu343ca942022-09-14 15:56:30 -0400185 ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800186}
187
188TEST_F(FakeFingerprintEngineTest, EnrollCancel) {
189 FingerprintHalProperties::enrollments({});
190 auto next = "4:0,0:true";
191 FingerprintHalProperties::next_enrollment(next);
192 keymaster::HardwareAuthToken hat{.mac = {2, 4}};
193 mCancel.set_value();
194 mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
195 ASSERT_EQ(Error::CANCELED, mCallback->mError);
196 ASSERT_EQ(-1, mCallback->mLastEnrolled);
197 ASSERT_EQ(0, FingerprintHalProperties::enrollments().size());
198 ASSERT_EQ(next, FingerprintHalProperties::next_enrollment().value_or(""));
199}
200
201TEST_F(FakeFingerprintEngineTest, EnrollFail) {
202 FingerprintHalProperties::enrollments({});
203 auto next = "2:0,0:false";
204 FingerprintHalProperties::next_enrollment(next);
205 keymaster::HardwareAuthToken hat{.mac = {2, 4}};
206 mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
207 ASSERT_EQ(Error::UNABLE_TO_PROCESS, mCallback->mError);
208 ASSERT_EQ(-1, mCallback->mLastEnrolled);
209 ASSERT_EQ(0, FingerprintHalProperties::enrollments().size());
210 ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
211}
212
Jeff Pu343ca942022-09-14 15:56:30 -0400213TEST_F(FakeFingerprintEngineTest, EnrollAcquired) {
214 FingerprintHalProperties::enrollments({});
215 FingerprintHalProperties::next_enrollment("4:0,5-[12,1013]:true");
216 keymaster::HardwareAuthToken hat{.mac = {2, 4}};
217 int32_t prevCnt = mCallback->mLastAcquiredCount;
218 mEngine.enrollImpl(mCallback.get(), hat, mCancel.get_future());
219 ASSERT_FALSE(FingerprintHalProperties::next_enrollment().has_value());
220 ASSERT_EQ(1, FingerprintHalProperties::enrollments().size());
221 ASSERT_EQ(4, FingerprintHalProperties::enrollments()[0].value());
222 ASSERT_EQ(4, mCallback->mLastEnrolled);
223 ASSERT_EQ(prevCnt + 3, mCallback->mLastAcquiredCount);
224 ASSERT_EQ(7, mCallback->mLastAcquiredInfo);
225 ASSERT_EQ(13, mCallback->mLastAcquiredVendorCode);
226}
227
Joe Bolingerde94aa02021-12-09 17:00:32 -0800228TEST_F(FakeFingerprintEngineTest, Authenticate) {
229 FingerprintHalProperties::enrollments({1, 2});
230 FingerprintHalProperties::enrollment_hit(2);
231 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
232 ASSERT_FALSE(mCallback->mAuthenticateFailed);
233 ASSERT_EQ(2, mCallback->mLastAuthenticated);
Jeff Pu343ca942022-09-14 15:56:30 -0400234 ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800235}
236
237TEST_F(FakeFingerprintEngineTest, AuthenticateCancel) {
238 FingerprintHalProperties::enrollments({2});
239 FingerprintHalProperties::enrollment_hit(2);
240 mCancel.set_value();
241 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
242 ASSERT_EQ(Error::CANCELED, mCallback->mError);
243 ASSERT_EQ(-1, mCallback->mLastAuthenticated);
244}
245
246TEST_F(FakeFingerprintEngineTest, AuthenticateNotSet) {
247 FingerprintHalProperties::enrollments({1, 2});
248 FingerprintHalProperties::enrollment_hit({});
249 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
250 ASSERT_TRUE(mCallback->mAuthenticateFailed);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800251}
252
253TEST_F(FakeFingerprintEngineTest, AuthenticateNotEnrolled) {
254 FingerprintHalProperties::enrollments({1, 2});
255 FingerprintHalProperties::enrollment_hit(3);
256 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
257 ASSERT_TRUE(mCallback->mAuthenticateFailed);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800258}
259
260TEST_F(FakeFingerprintEngineTest, AuthenticateLockout) {
261 FingerprintHalProperties::enrollments({22, 2});
262 FingerprintHalProperties::enrollment_hit(2);
263 FingerprintHalProperties::lockout(true);
264 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
265 ASSERT_TRUE(mCallback->mLockoutPermanent);
266 ASSERT_NE(mCallback->mError, Error::UNKNOWN);
267}
268
Jeff Pu343ca942022-09-14 15:56:30 -0400269TEST_F(FakeFingerprintEngineTest, AuthenticateError8) {
270 FingerprintHalProperties::operation_authenticate_error(8);
271 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
272 ASSERT_EQ(mCallback->mError, (Error)8);
273 ASSERT_EQ(mCallback->mErrorVendorCode, 0);
274}
275
276TEST_F(FakeFingerprintEngineTest, AuthenticateError9) {
277 FingerprintHalProperties::operation_authenticate_error(1009);
278 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
279 ASSERT_EQ(mCallback->mError, (Error)7);
280 ASSERT_EQ(mCallback->mErrorVendorCode, 9);
281}
282
283TEST_F(FakeFingerprintEngineTest, AuthenticateAcquired) {
284 FingerprintHalProperties::lockout(false);
285 FingerprintHalProperties::enrollments({1, 2});
286 FingerprintHalProperties::enrollment_hit(2);
287 FingerprintHalProperties::operation_authenticate_acquired("4,1009");
288 int32_t prevCount = mCallback->mLastAcquiredCount;
289 mEngine.authenticateImpl(mCallback.get(), 0, mCancel.get_future());
290 ASSERT_FALSE(mCallback->mAuthenticateFailed);
291 ASSERT_EQ(2, mCallback->mLastAuthenticated);
292 ASSERT_EQ(prevCount + 2, mCallback->mLastAcquiredCount);
293 ASSERT_EQ(7, mCallback->mLastAcquiredInfo);
294 ASSERT_EQ(9, mCallback->mLastAcquiredVendorCode);
295}
296
Joe Bolingerde94aa02021-12-09 17:00:32 -0800297TEST_F(FakeFingerprintEngineTest, InteractionDetect) {
Jeff Pu52653182022-10-12 16:27:23 -0400298 FingerprintHalProperties::detect_interaction(true);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800299 FingerprintHalProperties::enrollments({1, 2});
300 FingerprintHalProperties::enrollment_hit(2);
Jeff Pu343ca942022-09-14 15:56:30 -0400301 FingerprintHalProperties::operation_detect_interaction_acquired("");
Joe Bolingerde94aa02021-12-09 17:00:32 -0800302 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
303 ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
Jeff Pu343ca942022-09-14 15:56:30 -0400304 ASSERT_EQ(1, mCallback->mLastAcquiredInfo);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800305}
306
307TEST_F(FakeFingerprintEngineTest, InteractionDetectCancel) {
Jeff Pu52653182022-10-12 16:27:23 -0400308 FingerprintHalProperties::detect_interaction(true);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800309 FingerprintHalProperties::enrollments({1, 2});
310 FingerprintHalProperties::enrollment_hit(2);
311 mCancel.set_value();
312 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
313 ASSERT_EQ(Error::CANCELED, mCallback->mError);
314 ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
315}
316
317TEST_F(FakeFingerprintEngineTest, InteractionDetectNotSet) {
Jeff Pu52653182022-10-12 16:27:23 -0400318 FingerprintHalProperties::detect_interaction(true);
Joe Bolingerde94aa02021-12-09 17:00:32 -0800319 FingerprintHalProperties::enrollments({1, 2});
320 FingerprintHalProperties::enrollment_hit({});
321 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
322 ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
323}
324
325TEST_F(FakeFingerprintEngineTest, InteractionDetectNotEnrolled) {
326 FingerprintHalProperties::enrollments({1, 2});
327 FingerprintHalProperties::enrollment_hit(25);
328 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
329 ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
330}
331
Jeff Pu343ca942022-09-14 15:56:30 -0400332TEST_F(FakeFingerprintEngineTest, InteractionDetectError) {
Jeff Pu52653182022-10-12 16:27:23 -0400333 FingerprintHalProperties::detect_interaction(true);
Jeff Pu343ca942022-09-14 15:56:30 -0400334 FingerprintHalProperties::operation_detect_interaction_error(8);
335 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
336 ASSERT_EQ(0, mCallback->mInteractionDetectedCount);
337 ASSERT_EQ(mCallback->mError, (Error)8);
338 ASSERT_EQ(mCallback->mErrorVendorCode, 0);
339}
340
341TEST_F(FakeFingerprintEngineTest, InteractionDetectAcquired) {
Jeff Pu52653182022-10-12 16:27:23 -0400342 FingerprintHalProperties::detect_interaction(true);
Jeff Pu343ca942022-09-14 15:56:30 -0400343 FingerprintHalProperties::enrollments({1, 2});
344 FingerprintHalProperties::enrollment_hit(2);
345 FingerprintHalProperties::operation_detect_interaction_acquired("4,1013");
346 int32_t prevCount = mCallback->mLastAcquiredCount;
347 mEngine.detectInteractionImpl(mCallback.get(), mCancel.get_future());
348 ASSERT_EQ(1, mCallback->mInteractionDetectedCount);
349 ASSERT_EQ(prevCount + 2, mCallback->mLastAcquiredCount);
350 ASSERT_EQ(7, mCallback->mLastAcquiredInfo);
351 ASSERT_EQ(13, mCallback->mLastAcquiredVendorCode);
352}
353
Joe Bolingerde94aa02021-12-09 17:00:32 -0800354TEST_F(FakeFingerprintEngineTest, EnumerateEnrolled) {
355 FingerprintHalProperties::enrollments({2, 4, 8});
356 mEngine.enumerateEnrollmentsImpl(mCallback.get());
Jeff Pu63f33c72022-07-28 16:06:23 -0400357 ASSERT_EQ(
358 4,
359 mCallback->mLastEnrollmentEnumerated.size()); // Due to workaround. TODO (b/243129174)
Joe Bolingerde94aa02021-12-09 17:00:32 -0800360 for (auto id : FingerprintHalProperties::enrollments()) {
361 ASSERT_TRUE(std::find(mCallback->mLastEnrollmentEnumerated.begin(),
362 mCallback->mLastEnrollmentEnumerated.end(),
363 id) != mCallback->mLastEnrollmentEnumerated.end());
364 }
365}
366
367TEST_F(FakeFingerprintEngineTest, RemoveEnrolled) {
368 FingerprintHalProperties::enrollments({2, 4, 8, 1});
369 mEngine.removeEnrollmentsImpl(mCallback.get(), {2, 8});
370 auto enrolls = FingerprintHalProperties::enrollments();
371 ASSERT_EQ(2, mCallback->mLastEnrollmentRemoved.size());
372 for (auto id : {2, 8}) {
373 ASSERT_TRUE(std::find(mCallback->mLastEnrollmentRemoved.begin(),
374 mCallback->mLastEnrollmentRemoved.end(),
375 id) != mCallback->mLastEnrollmentRemoved.end());
376 }
377 ASSERT_EQ(2, enrolls.size());
378 for (auto id : {1, 4}) {
379 ASSERT_TRUE(std::find(enrolls.begin(), enrolls.end(), id) != enrolls.end());
380 }
381}
382
Jeff Pu343ca942022-09-14 15:56:30 -0400383TEST_F(FakeFingerprintEngineTest, parseIntSequence) {
384 std::vector<int32_t> seqV;
385 seqV = mEngine.parseIntSequence("");
386 ASSERT_EQ(0, seqV.size());
387 seqV = mEngine.parseIntSequence("2");
388 ASSERT_EQ(1, seqV.size());
389 ASSERT_EQ(2, seqV[0]);
390 seqV = mEngine.parseIntSequence("2,3,4");
391 std::vector<int32_t> expV{2, 3, 4};
392 ASSERT_EQ(expV, seqV);
393 seqV = mEngine.parseIntSequence("2,3,a");
394 ASSERT_EQ(0, seqV.size());
395 seqV = mEngine.parseIntSequence("2, 3, 4");
396 ASSERT_EQ(expV, seqV);
397 seqV = mEngine.parseIntSequence("123,456");
398 ASSERT_EQ(2, seqV.size());
399 std::vector<int32_t> expV1{123, 456};
400 ASSERT_EQ(expV1, seqV);
401 seqV = mEngine.parseIntSequence("12f3,456");
402 ASSERT_EQ(0, seqV.size());
403}
404
405TEST_F(FakeFingerprintEngineTest, parseEnrollmentCaptureOk) {
406 std::vector<std::vector<int32_t>> ecV;
407 ecV = mEngine.parseEnrollmentCapture("100,200,300");
408 ASSERT_EQ(6, ecV.size());
409 std::vector<std::vector<int32_t>> expE{{100}, {200}, {300}};
410 std::vector<int32_t> defC{1};
411 for (int i = 0; i < ecV.size(); i += 2) {
412 ASSERT_EQ(expE[i / 2], ecV[i]);
413 ASSERT_EQ(defC, ecV[i + 1]);
414 }
415 ecV = mEngine.parseEnrollmentCapture("100");
416 ASSERT_EQ(2, ecV.size());
417 ASSERT_EQ(expE[0], ecV[0]);
418 ASSERT_EQ(defC, ecV[1]);
419
420 ecV = mEngine.parseEnrollmentCapture("100-[5,6,7]");
421 std::vector<int32_t> expC{5, 6, 7};
422 ASSERT_EQ(2, ecV.size());
423 for (int i = 0; i < ecV.size(); i += 2) {
424 ASSERT_EQ(expE[i / 2], ecV[i]);
425 ASSERT_EQ(expC, ecV[i + 1]);
426 }
427 ecV = mEngine.parseEnrollmentCapture("100-[5,6,7], 200, 300-[9,10]");
428 std::vector<std::vector<int32_t>> expC1{{5, 6, 7}, {1}, {9, 10}};
429 ASSERT_EQ(6, ecV.size());
430 for (int i = 0; i < ecV.size(); i += 2) {
431 ASSERT_EQ(expE[i / 2], ecV[i]);
432 ASSERT_EQ(expC1[i / 2], ecV[i + 1]);
433 }
434 ecV = mEngine.parseEnrollmentCapture("100-[5,6,7], 200-[2,1], 300-[9]");
435 std::vector<std::vector<int32_t>> expC2{{5, 6, 7}, {2, 1}, {9}};
436 ASSERT_EQ(ecV.size(), 6);
437 for (int i = 0; i < ecV.size(); i += 2) {
438 ASSERT_EQ(expE[i / 2], ecV[i]);
439 ASSERT_EQ(expC2[i / 2], ecV[i + 1]);
440 }
441}
442
443TEST_F(FakeFingerprintEngineTest, parseEnrollmentCaptureFail) {
444 std::vector<std::string> badStr{"10c", "100-5", "100-[5,6,7", "100-5,6,7]",
445 "100,2x0,300", "200-[f]", "a,b"};
446 std::vector<std::vector<int32_t>> ecV;
Jeff Pu52653182022-10-12 16:27:23 -0400447 for (const auto& s : badStr) {
Jeff Pu343ca942022-09-14 15:56:30 -0400448 ecV = mEngine.parseEnrollmentCapture(s);
449 ASSERT_EQ(ecV.size(), 0);
450 }
451}
452
Jeff Pu52653182022-10-12 16:27:23 -0400453TEST_F(FakeFingerprintEngineTest, randomLatency) {
454 FingerprintHalProperties::operation_detect_interaction_latency({});
455 ASSERT_EQ(DEFAULT_LATENCY,
456 mEngine.getLatency(FingerprintHalProperties::operation_detect_interaction_latency()));
457 FingerprintHalProperties::operation_detect_interaction_latency({10});
458 ASSERT_EQ(10,
459 mEngine.getLatency(FingerprintHalProperties::operation_detect_interaction_latency()));
460 FingerprintHalProperties::operation_detect_interaction_latency({1, 1000});
461 std::set<int32_t> latencySet;
462 for (int i = 0; i < 100; i++) {
463 latencySet.insert(mEngine.getLatency(
464 FingerprintHalProperties::operation_detect_interaction_latency()));
465 }
466 ASSERT_TRUE(latencySet.size() > 95);
467 FingerprintHalProperties::operation_detect_interaction_latency({});
468}
469
Joe Bolingerde94aa02021-12-09 17:00:32 -0800470} // namespace aidl::android::hardware::biometrics::fingerprint
471
472int main(int argc, char** argv) {
473 testing::InitGoogleTest(&argc, argv);
474 ABinderProcess_startThreadPool();
475 return RUN_ALL_TESTS();
476}