blob: 47a78139f2a30b2cbe2f8b6f01f4f701083aa90c [file] [log] [blame]
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -07001/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
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#include <aidl/Gtest.h>
17#include <aidl/Vintf.h>
18#include <aidl/android/hardware/biometrics/face/BnFace.h>
19#include <aidl/android/hardware/biometrics/face/BnSessionCallback.h>
20
21#include <android/binder_manager.h>
22#include <android/binder_process.h>
23
Ilya Matyukhincc2b6942021-03-23 23:08:41 -070024#include <chrono>
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070025#include <future>
26
27namespace aidl::android::hardware::biometrics::face {
28namespace {
29
Ilya Matyukhincc2b6942021-03-23 23:08:41 -070030using namespace std::literals::chrono_literals;
31
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070032constexpr int kSensorId = 0;
33constexpr int kUserId = 0;
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070034
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070035class SessionCallback : public BnSessionCallback {
36 public:
Kevin Chyn0d13e042020-11-17 15:14:23 -080037 ndk::ScopedAStatus onChallengeGenerated(int64_t /*challenge*/) override {
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070038 return ndk::ScopedAStatus::ok();
39 }
40
Kevin Chyn0d13e042020-11-17 15:14:23 -080041 ndk::ScopedAStatus onChallengeRevoked(int64_t /*challenge*/) override {
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070042 return ndk::ScopedAStatus::ok();
43 }
44
Ilya Matyukhine13bc812021-01-19 16:04:04 -080045 ndk::ScopedAStatus onAuthenticationFrame(const AuthenticationFrame& /*frame*/) override {
46 return ndk::ScopedAStatus::ok();
47 }
48
49 ndk::ScopedAStatus onEnrollmentFrame(const EnrollmentFrame& /*frame*/) override {
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070050 return ndk::ScopedAStatus::ok();
51 }
52
Ilya Matyukhincc2b6942021-03-23 23:08:41 -070053 ndk::ScopedAStatus onError(Error error, int32_t vendorCode) override {
Ilya Matyukhin13d84062021-06-07 16:56:11 -070054 auto lock = std::lock_guard<std::mutex>{mMutex};
55 mError = error;
56 mVendorCode = vendorCode;
57 mOnErrorInvoked = true;
58 mCv.notify_one();
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070059 return ndk::ScopedAStatus::ok();
60 }
61
62 ndk::ScopedAStatus onEnrollmentProgress(int32_t /*enrollmentId*/,
63 int32_t /*remaining*/) override {
64 return ndk::ScopedAStatus::ok();
65 }
66
67 ndk::ScopedAStatus onAuthenticationSucceeded(
68 int32_t /*enrollmentId*/, const keymaster::HardwareAuthToken& /*hat*/) override {
69 return ndk::ScopedAStatus::ok();
70 }
71
72 ndk::ScopedAStatus onAuthenticationFailed() override { return ndk::ScopedAStatus::ok(); }
73
74 ndk::ScopedAStatus onLockoutTimed(int64_t /*durationMillis*/) override {
75 return ndk::ScopedAStatus::ok();
76 }
77
78 ndk::ScopedAStatus onLockoutPermanent() override { return ndk::ScopedAStatus::ok(); }
79
80 ndk::ScopedAStatus onLockoutCleared() override { return ndk::ScopedAStatus::ok(); }
81
82 ndk::ScopedAStatus onInteractionDetected() override { return ndk::ScopedAStatus::ok(); }
83
84 ndk::ScopedAStatus onEnrollmentsEnumerated(
85 const std::vector<int32_t>& /*enrollmentIds*/) override {
86 return ndk::ScopedAStatus::ok();
87 }
88
89 ndk::ScopedAStatus onEnrollmentsRemoved(
90 const std::vector<int32_t>& /*enrollmentIds*/) override {
91 return ndk::ScopedAStatus::ok();
92 }
93
Ilya Matyukhin9fcf6b12021-04-14 13:43:06 -070094 ndk::ScopedAStatus onFeaturesRetrieved(const std::vector<Feature>& /*features*/) override {
Ilya Matyukhinf2d38862021-01-22 11:48:59 -080095 return ndk::ScopedAStatus::ok();
96 }
97
Ilya Matyukhin9fcf6b12021-04-14 13:43:06 -070098 ndk::ScopedAStatus onFeatureSet(Feature /*feature*/) override {
Ilya Matyukhinf2d38862021-01-22 11:48:59 -080099 return ndk::ScopedAStatus::ok();
100 }
101
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700102 ndk::ScopedAStatus onAuthenticatorIdRetrieved(int64_t /*authenticatorId*/) override {
103 return ndk::ScopedAStatus::ok();
104 }
105
Kevin Chynf7890cc2021-01-11 17:08:36 -0800106 ndk::ScopedAStatus onAuthenticatorIdInvalidated(int64_t /*newAuthenticatorId*/) override {
107 return ndk::ScopedAStatus::ok();
108 }
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700109
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700110 ndk::ScopedAStatus onSessionClosed() override {
Ilya Matyukhin13d84062021-06-07 16:56:11 -0700111 auto lock = std::lock_guard<std::mutex>{mMutex};
112 mOnSessionClosedInvoked = true;
113 mCv.notify_one();
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700114 return ndk::ScopedAStatus::ok();
115 }
Ilya Matyukhincbbfa932021-03-22 13:25:15 -0700116
Ilya Matyukhin13d84062021-06-07 16:56:11 -0700117 std::mutex mMutex;
118 std::condition_variable mCv;
119 Error mError = Error::UNKNOWN;
120 int32_t mVendorCode = 0;
121 bool mOnErrorInvoked = false;
122 bool mOnSessionClosedInvoked = false;
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700123};
124
125class Face : public testing::TestWithParam<std::string> {
126 protected:
127 void SetUp() override {
128 AIBinder* binder = AServiceManager_waitForService(GetParam().c_str());
129 ASSERT_NE(binder, nullptr);
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700130 mHal = IFace::fromBinder(ndk::SpAIBinder(binder));
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700131 }
132
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700133 std::shared_ptr<IFace> mHal;
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700134};
135
136TEST_P(Face, AuthenticateTest) {
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700137 // Prepare the callback.
Ilya Matyukhin13d84062021-06-07 16:56:11 -0700138 auto cb = ndk::SharedRefBase::make<SessionCallback>();
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700139
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700140 // Create a session
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700141 std::shared_ptr<ISession> session;
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700142 ASSERT_TRUE(mHal->createSession(kSensorId, kUserId, cb, &session).isOk());
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700143
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700144 // Call authenticate
145 std::shared_ptr<common::ICancellationSignal> cancellationSignal;
146 ASSERT_TRUE(session->authenticate(0 /* operationId */, &cancellationSignal).isOk());
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700147
Ilya Matyukhin13d84062021-06-07 16:56:11 -0700148 auto lock = std::unique_lock<std::mutex>(cb->mMutex);
149 cb->mCv.wait(lock, [&cb] { return cb->mOnErrorInvoked; });
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700150 // Get the results
Ilya Matyukhin13d84062021-06-07 16:56:11 -0700151 EXPECT_EQ(cb->mError, Error::UNABLE_TO_PROCESS);
152 EXPECT_EQ(cb->mVendorCode, 0);
153 lock.unlock();
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700154
155 // Close the session
156 ASSERT_TRUE(session->close().isOk());
157
Ilya Matyukhin13d84062021-06-07 16:56:11 -0700158 lock.lock();
159 cb->mCv.wait(lock, [&cb] { return cb->mOnSessionClosedInvoked; });
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700160}
161
162GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Face);
163INSTANTIATE_TEST_SUITE_P(IFace, Face,
164 testing::ValuesIn(::android::getAidlHalInstanceNames(IFace::descriptor)),
165 ::android::PrintInstanceNameToString);
166
167} // namespace
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700168} // namespace aidl::android::hardware::biometrics::face
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700169
170int main(int argc, char** argv) {
171 ::testing::InitGoogleTest(&argc, argv);
172 ABinderProcess_setThreadPoolMaxThreadCount(1);
173 ABinderProcess_startThreadPool();
174 return RUN_ALL_TESTS();
175}