From 3b542cd396699e0c6d364be5a549fec30d60edb6 Mon Sep 17 00:00:00 2001 From: Ilya Matyukhin Date: Mon, 12 Oct 2020 18:23:46 -0700 Subject: [PATCH] Add VTS tests skeleton for IFace Bug: 168730443 Test: atest VtsHalBiometricsFaceTargetTest Change-Id: I90ec41b0b7cc461cce50f55f99e7ee2a836fb2e0 --- biometrics/face/aidl/vts/Android.bp | 16 ++ .../vts/VtsHalBiometricsFaceTargetTest.cpp | 157 ++++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 biometrics/face/aidl/vts/Android.bp create mode 100644 biometrics/face/aidl/vts/VtsHalBiometricsFaceTargetTest.cpp diff --git a/biometrics/face/aidl/vts/Android.bp b/biometrics/face/aidl/vts/Android.bp new file mode 100644 index 0000000000..427b8785fb --- /dev/null +++ b/biometrics/face/aidl/vts/Android.bp @@ -0,0 +1,16 @@ +cc_test { + name: "VtsHalBiometricsFaceTargetTest", + defaults: [ + "VtsHalTargetTestDefaults", + "use_libaidlvintf_gtest_helper_static", + ], + srcs: ["VtsHalBiometricsFaceTargetTest.cpp"], + shared_libs: [ + "libbinder_ndk", + "android.hardware.biometrics.face-ndk_platform", + ], + test_suites: [ + "general-tests", + "vts", + ], +} diff --git a/biometrics/face/aidl/vts/VtsHalBiometricsFaceTargetTest.cpp b/biometrics/face/aidl/vts/VtsHalBiometricsFaceTargetTest.cpp new file mode 100644 index 0000000000..c1ba66b004 --- /dev/null +++ b/biometrics/face/aidl/vts/VtsHalBiometricsFaceTargetTest.cpp @@ -0,0 +1,157 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include +#include +#include +#include + +#include +#include + +#include + +namespace aidl::android::hardware::biometrics::face { +namespace { + +constexpr int kSensorId = 0; +constexpr int kUserId = 0; +constexpr auto kCallbackTimeout = std::chrono::seconds(1); + +enum class SessionCallbackMethodName { + kOnStateChanged, +}; + +struct SessionCallbackInvocation { + SessionCallbackMethodName method_name; + SessionState state; +}; + +class SessionCallback : public BnSessionCallback { + public: + explicit SessionCallback(std::promise invocation_promise) + : invocation_promise_(std::move(invocation_promise)) {} + ndk::ScopedAStatus onStateChanged(int32_t /*cookie*/, SessionState state) override { + SessionCallbackInvocation invocation = {}; + invocation.method_name = SessionCallbackMethodName::kOnStateChanged; + invocation.state = state; + invocation_promise_.set_value(invocation); + return ndk::ScopedAStatus::ok(); + } + + ndk::ScopedAStatus onChallengeGenerated(int32_t /*sensorId*/, int32_t /*userId*/, + int64_t /*challenge*/) override { + return ndk::ScopedAStatus::ok(); + } + + ndk::ScopedAStatus onChallengeRevoked(int32_t /*sensorId*/, int32_t /*userId*/, + int64_t /*challenge*/) override { + return ndk::ScopedAStatus::ok(); + } + + ndk::ScopedAStatus onAcquired(AcquiredInfo /*info*/, int32_t /*vendorCode*/) override { + return ndk::ScopedAStatus::ok(); + } + + ndk::ScopedAStatus onError(Error /*error*/, int32_t /*vendorCode*/) override { + return ndk::ScopedAStatus::ok(); + } + + ndk::ScopedAStatus onEnrollmentProgress(int32_t /*enrollmentId*/, + int32_t /*remaining*/) override { + return ndk::ScopedAStatus::ok(); + } + + ndk::ScopedAStatus onAuthenticationSucceeded( + int32_t /*enrollmentId*/, const keymaster::HardwareAuthToken& /*hat*/) override { + return ndk::ScopedAStatus::ok(); + } + + ndk::ScopedAStatus onAuthenticationFailed() override { return ndk::ScopedAStatus::ok(); } + + ndk::ScopedAStatus onLockoutTimed(int64_t /*durationMillis*/) override { + return ndk::ScopedAStatus::ok(); + } + + ndk::ScopedAStatus onLockoutPermanent() override { return ndk::ScopedAStatus::ok(); } + + ndk::ScopedAStatus onLockoutCleared() override { return ndk::ScopedAStatus::ok(); } + + ndk::ScopedAStatus onInteractionDetected() override { return ndk::ScopedAStatus::ok(); } + + ndk::ScopedAStatus onEnrollmentsEnumerated( + const std::vector& /*enrollmentIds*/) override { + return ndk::ScopedAStatus::ok(); + } + + ndk::ScopedAStatus onEnrollmentsRemoved( + const std::vector& /*enrollmentIds*/) override { + return ndk::ScopedAStatus::ok(); + } + + ndk::ScopedAStatus onAuthenticatorIdRetrieved(int64_t /*authenticatorId*/) override { + return ndk::ScopedAStatus::ok(); + } + + ndk::ScopedAStatus onAuthenticatorIdInvalidated() override { return ndk::ScopedAStatus::ok(); } + + private: + std::promise invocation_promise_; +}; + +class Face : public testing::TestWithParam { + protected: + void SetUp() override { + AIBinder* binder = AServiceManager_waitForService(GetParam().c_str()); + ASSERT_NE(binder, nullptr); + hal_ = IFace::fromBinder(ndk::SpAIBinder(binder)); + } + + std::shared_ptr hal_; +}; + +TEST_P(Face, AuthenticateTest) { + std::promise invocation_promise; + std::future invocation_future = invocation_promise.get_future(); + std::shared_ptr session_cb = + ndk::SharedRefBase::make(std::move(invocation_promise)); + + std::shared_ptr session; + ASSERT_TRUE(hal_->createSession(kSensorId, kUserId, session_cb, &session).isOk()); + + std::shared_ptr cancel_cb; + ASSERT_TRUE(session->authenticate(0, 0, &cancel_cb).isOk()); + ASSERT_EQ(invocation_future.wait_for(kCallbackTimeout), std::future_status::ready); + + SessionCallbackInvocation invocation = invocation_future.get(); + EXPECT_EQ(invocation.method_name, SessionCallbackMethodName::kOnStateChanged); + EXPECT_EQ(invocation.state, SessionState::AUTHENTICATING); +} + +GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(Face); +INSTANTIATE_TEST_SUITE_P(IFace, Face, + testing::ValuesIn(::android::getAidlHalInstanceNames(IFace::descriptor)), + ::android::PrintInstanceNameToString); + +} // namespace + +int main(int argc, char** argv) { + ::testing::InitGoogleTest(&argc, argv); + ABinderProcess_setThreadPoolMaxThreadCount(1); + ABinderProcess_startThreadPool(); + return RUN_ALL_TESTS(); +} + +} // namespace aidl::android::hardware::biometrics::face