blob: ada6f734ca1add6b8fa16dc2858655e91a214441 [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 Matyukhincc2b6942021-03-23 23:08:41 -070035enum class MethodName {
36 kOnError,
37 kOnSessionClosed,
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070038};
39
Ilya Matyukhincc2b6942021-03-23 23:08:41 -070040struct Invocation {
41 MethodName methodName;
42 Error error;
43 int32_t vendorCode;
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070044};
45
46class SessionCallback : public BnSessionCallback {
47 public:
Ilya Matyukhincc2b6942021-03-23 23:08:41 -070048 explicit SessionCallback(Invocation* inv) : mInv(inv) {}
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070049
Kevin Chyn0d13e042020-11-17 15:14:23 -080050 ndk::ScopedAStatus onChallengeGenerated(int64_t /*challenge*/) override {
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070051 return ndk::ScopedAStatus::ok();
52 }
53
Kevin Chyn0d13e042020-11-17 15:14:23 -080054 ndk::ScopedAStatus onChallengeRevoked(int64_t /*challenge*/) override {
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070055 return ndk::ScopedAStatus::ok();
56 }
57
Ilya Matyukhine13bc812021-01-19 16:04:04 -080058 ndk::ScopedAStatus onAuthenticationFrame(const AuthenticationFrame& /*frame*/) override {
59 return ndk::ScopedAStatus::ok();
60 }
61
62 ndk::ScopedAStatus onEnrollmentFrame(const EnrollmentFrame& /*frame*/) override {
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070063 return ndk::ScopedAStatus::ok();
64 }
65
Ilya Matyukhincc2b6942021-03-23 23:08:41 -070066 ndk::ScopedAStatus onError(Error error, int32_t vendorCode) override {
67 *mInv = {};
68 mInv->methodName = MethodName::kOnError;
69 mInv->error = error;
70 mInv->vendorCode = vendorCode;
71
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -070072 return ndk::ScopedAStatus::ok();
73 }
74
75 ndk::ScopedAStatus onEnrollmentProgress(int32_t /*enrollmentId*/,
76 int32_t /*remaining*/) override {
77 return ndk::ScopedAStatus::ok();
78 }
79
80 ndk::ScopedAStatus onAuthenticationSucceeded(
81 int32_t /*enrollmentId*/, const keymaster::HardwareAuthToken& /*hat*/) override {
82 return ndk::ScopedAStatus::ok();
83 }
84
85 ndk::ScopedAStatus onAuthenticationFailed() override { return ndk::ScopedAStatus::ok(); }
86
87 ndk::ScopedAStatus onLockoutTimed(int64_t /*durationMillis*/) override {
88 return ndk::ScopedAStatus::ok();
89 }
90
91 ndk::ScopedAStatus onLockoutPermanent() override { return ndk::ScopedAStatus::ok(); }
92
93 ndk::ScopedAStatus onLockoutCleared() override { return ndk::ScopedAStatus::ok(); }
94
95 ndk::ScopedAStatus onInteractionDetected() override { return ndk::ScopedAStatus::ok(); }
96
97 ndk::ScopedAStatus onEnrollmentsEnumerated(
98 const std::vector<int32_t>& /*enrollmentIds*/) override {
99 return ndk::ScopedAStatus::ok();
100 }
101
102 ndk::ScopedAStatus onEnrollmentsRemoved(
103 const std::vector<int32_t>& /*enrollmentIds*/) override {
104 return ndk::ScopedAStatus::ok();
105 }
106
Ilya Matyukhin9fcf6b12021-04-14 13:43:06 -0700107 ndk::ScopedAStatus onFeaturesRetrieved(const std::vector<Feature>& /*features*/) override {
Ilya Matyukhinf2d38862021-01-22 11:48:59 -0800108 return ndk::ScopedAStatus::ok();
109 }
110
Ilya Matyukhin9fcf6b12021-04-14 13:43:06 -0700111 ndk::ScopedAStatus onFeatureSet(Feature /*feature*/) override {
Ilya Matyukhinf2d38862021-01-22 11:48:59 -0800112 return ndk::ScopedAStatus::ok();
113 }
114
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700115 ndk::ScopedAStatus onAuthenticatorIdRetrieved(int64_t /*authenticatorId*/) override {
116 return ndk::ScopedAStatus::ok();
117 }
118
Kevin Chynf7890cc2021-01-11 17:08:36 -0800119 ndk::ScopedAStatus onAuthenticatorIdInvalidated(int64_t /*newAuthenticatorId*/) override {
120 return ndk::ScopedAStatus::ok();
121 }
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700122
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700123 ndk::ScopedAStatus onSessionClosed() override {
124 *mInv = {};
125 mInv->methodName = MethodName::kOnSessionClosed;
126
127 return ndk::ScopedAStatus::ok();
128 }
Ilya Matyukhincbbfa932021-03-22 13:25:15 -0700129
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700130 private:
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700131 Invocation* mInv;
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700132};
133
134class Face : public testing::TestWithParam<std::string> {
135 protected:
136 void SetUp() override {
137 AIBinder* binder = AServiceManager_waitForService(GetParam().c_str());
138 ASSERT_NE(binder, nullptr);
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700139 mHal = IFace::fromBinder(ndk::SpAIBinder(binder));
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700140 }
141
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700142 std::shared_ptr<IFace> mHal;
143 Invocation mInv;
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700144};
145
146TEST_P(Face, AuthenticateTest) {
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700147 // Prepare the callback.
148 auto cb = ndk::SharedRefBase::make<SessionCallback>(&mInv);
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700149
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700150 // Create a session
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700151 std::shared_ptr<ISession> session;
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700152 ASSERT_TRUE(mHal->createSession(kSensorId, kUserId, cb, &session).isOk());
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700153
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700154 // Call authenticate
155 std::shared_ptr<common::ICancellationSignal> cancellationSignal;
156 ASSERT_TRUE(session->authenticate(0 /* operationId */, &cancellationSignal).isOk());
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700157
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700158 // Get the results
159 EXPECT_EQ(mInv.methodName, MethodName::kOnError);
160 EXPECT_EQ(mInv.error, Error::UNABLE_TO_PROCESS);
161 EXPECT_EQ(mInv.vendorCode, 0);
162
163 // Close the session
164 ASSERT_TRUE(session->close().isOk());
165
166 EXPECT_EQ(mInv.methodName, MethodName::kOnSessionClosed);
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700167}
168
169GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Face);
170INSTANTIATE_TEST_SUITE_P(IFace, Face,
171 testing::ValuesIn(::android::getAidlHalInstanceNames(IFace::descriptor)),
172 ::android::PrintInstanceNameToString);
173
174} // namespace
Ilya Matyukhincc2b6942021-03-23 23:08:41 -0700175} // namespace aidl::android::hardware::biometrics::face
Ilya Matyukhin3b542cd2020-10-12 18:23:46 -0700176
177int main(int argc, char** argv) {
178 ::testing::InitGoogleTest(&argc, argv);
179 ABinderProcess_setThreadPoolMaxThreadCount(1);
180 ABinderProcess_startThreadPool();
181 return RUN_ALL_TESTS();
182}
183