Loading biometrics/face/1.0/vts/functional/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,6 @@ cc_test { defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalBiometricsFaceV1_0TargetTest.cpp"], static_libs: ["android.hardware.biometrics.face@1.0"], test_suites: ["general-tests"], test_suites: ["general-tests", "vts-core"], } biometrics/face/1.0/vts/functional/VtsHalBiometricsFaceV1_0TargetTest.cpp +26 −45 Original line number Diff line number Diff line Loading @@ -20,9 +20,10 @@ #include <android/hardware/biometrics/face/1.0/IBiometricsFaceClientCallback.h> #include <VtsHalHidlTargetCallbackBase.h> #include <VtsHalHidlTargetTestBase.h> #include <VtsHalHidlTargetTestEnvBase.h> #include <android-base/logging.h> #include <gtest/gtest.h> #include <hidl/GtestPrinter.h> #include <hidl/ServiceManagement.h> #include <chrono> #include <cstdint> Loading Loading @@ -124,27 +125,11 @@ class FaceCallback : public ::testing::VtsHalHidlTargetCallbackBase<FaceCallback } }; // Test environment for the BiometricsFace HAL. class FaceHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { public: // Get the test environment singleton. static FaceHidlEnvironment* Instance() { static FaceHidlEnvironment* instance = new FaceHidlEnvironment; return instance; } void registerTestServices() override { registerTestService<IBiometricsFace>(); } private: FaceHidlEnvironment() = default; }; // Test class for the BiometricsFace HAL. class FaceHidlTest : public ::testing::VtsHalHidlTargetTestBase { class FaceHidlTest : public ::testing::TestWithParam<std::string> { public: void SetUp() override { mService = ::testing::VtsHalHidlTargetTestBase::getService<IBiometricsFace>( FaceHidlEnvironment::Instance()->getServiceName<IBiometricsFace>()); mService = IBiometricsFace::getService(GetParam()); ASSERT_NE(mService, nullptr); mCallback = new FaceCallback(); mCallback->SetWaitTimeoutDefault(kTimeout); Loading @@ -167,7 +152,7 @@ class FaceHidlTest : public ::testing::VtsHalHidlTargetTestBase { // generateChallenge should always return a unique, cryptographically secure, // non-zero number. TEST_F(FaceHidlTest, GenerateChallengeTest) { TEST_P(FaceHidlTest, GenerateChallengeTest) { std::map<uint64_t, int> m; for (int i = 0; i < kGenerateChallengeIterations; ++i) { Return<void> ret = Loading @@ -182,7 +167,7 @@ TEST_F(FaceHidlTest, GenerateChallengeTest) { } // enroll with an invalid (all zeroes) HAT should fail. TEST_F(FaceHidlTest, EnrollZeroHatTest) { TEST_P(FaceHidlTest, EnrollZeroHatTest) { // Filling HAT with zeros hidl_vec<uint8_t> token(69); for (size_t i = 0; i < 69; i++) { Loading @@ -200,7 +185,7 @@ TEST_F(FaceHidlTest, EnrollZeroHatTest) { } // enroll with an invalid HAT should fail. TEST_F(FaceHidlTest, EnrollGarbageHatTest) { TEST_P(FaceHidlTest, EnrollGarbageHatTest) { // Filling HAT with pseudorandom invalid data. // Using default seed to make the test reproducible. std::mt19937 gen(std::mt19937::default_seed); Loading @@ -221,7 +206,7 @@ TEST_F(FaceHidlTest, EnrollGarbageHatTest) { } // setFeature with an invalid (all zeros) HAT should fail. TEST_F(FaceHidlTest, SetFeatureZeroHatTest) { TEST_P(FaceHidlTest, SetFeatureZeroHatTest) { hidl_vec<uint8_t> token(69); for (size_t i = 0; i < 69; i++) { token[i] = 0; Loading @@ -232,7 +217,7 @@ TEST_F(FaceHidlTest, SetFeatureZeroHatTest) { } // setFeature with an invalid HAT should fail. TEST_F(FaceHidlTest, SetFeatureGarbageHatTest) { TEST_P(FaceHidlTest, SetFeatureGarbageHatTest) { // Filling HAT with pseudorandom invalid data. // Using default seed to make the test reproducible. std::mt19937 gen(std::mt19937::default_seed); Loading @@ -254,16 +239,16 @@ void assertGetFeatureFails(const sp<IBiometricsFace>& service, uint32_t faceId, ASSERT_TRUE(res.isOk()); } TEST_F(FaceHidlTest, GetFeatureRequireAttentionTest) { TEST_P(FaceHidlTest, GetFeatureRequireAttentionTest) { assertGetFeatureFails(mService, 0 /* faceId */, Feature::REQUIRE_ATTENTION); } TEST_F(FaceHidlTest, GetFeatureRequireDiversityTest) { TEST_P(FaceHidlTest, GetFeatureRequireDiversityTest) { assertGetFeatureFails(mService, 0 /* faceId */, Feature::REQUIRE_DIVERSITY); } // revokeChallenge should always return within the timeout TEST_F(FaceHidlTest, RevokeChallengeTest) { TEST_P(FaceHidlTest, RevokeChallengeTest) { auto start = std::chrono::system_clock::now(); Return<Status> ret = mService->revokeChallenge(); auto elapsed = std::chrono::system_clock::now() - start; Loading @@ -272,14 +257,14 @@ TEST_F(FaceHidlTest, RevokeChallengeTest) { } // The call to getAuthenticatorId should succeed. TEST_F(FaceHidlTest, GetAuthenticatorIdTest) { TEST_P(FaceHidlTest, GetAuthenticatorIdTest) { Return<void> ret = mService->getAuthenticatorId( [](const OptionalUint64& res) { ASSERT_EQ(Status::OK, res.status); }); ASSERT_TRUE(ret.isOk()); } // The call to enumerate should succeed. TEST_F(FaceHidlTest, EnumerateTest) { TEST_P(FaceHidlTest, EnumerateTest) { Return<Status> ret = mService->enumerate(); ASSERT_EQ(Status::OK, static_cast<Status>(ret)); auto res = mCallback->WaitForCallback(kCallbackNameOnEnumerate); Loading @@ -288,21 +273,21 @@ TEST_F(FaceHidlTest, EnumerateTest) { } // The call to remove should succeed for any faceId TEST_F(FaceHidlTest, RemoveFaceTest) { TEST_P(FaceHidlTest, RemoveFaceTest) { // Remove a face Return<Status> ret = mService->remove(kFaceId); ASSERT_EQ(Status::OK, static_cast<Status>(ret)); } // Remove should accept 0 to delete all faces TEST_F(FaceHidlTest, RemoveAllFacesTest) { TEST_P(FaceHidlTest, RemoveAllFacesTest) { // Remove all faces Return<Status> ret = mService->remove(0); ASSERT_EQ(Status::OK, static_cast<Status>(ret)); } // Active user should successfully set to a writable location. TEST_F(FaceHidlTest, SetActiveUserTest) { TEST_P(FaceHidlTest, SetActiveUserTest) { // Create an active user Return<Status> ret = mService->setActiveUser(2, kFacedataDir); ASSERT_EQ(Status::OK, static_cast<Status>(ret)); Loading @@ -313,7 +298,7 @@ TEST_F(FaceHidlTest, SetActiveUserTest) { } // Active user should fail to set to an unwritable location. TEST_F(FaceHidlTest, SetActiveUserUnwritableTest) { TEST_P(FaceHidlTest, SetActiveUserUnwritableTest) { // Create an active user to an unwritable location (device root dir) Return<Status> ret = mService->setActiveUser(3, "/"); ASSERT_NE(Status::OK, static_cast<Status>(ret)); Loading @@ -324,7 +309,7 @@ TEST_F(FaceHidlTest, SetActiveUserUnwritableTest) { } // Active user should fail to set to a null location. TEST_F(FaceHidlTest, SetActiveUserNullTest) { TEST_P(FaceHidlTest, SetActiveUserNullTest) { // Create an active user to a null location. Return<Status> ret = mService->setActiveUser(4, nullptr); ASSERT_NE(Status::OK, static_cast<Status>(ret)); Loading @@ -336,7 +321,7 @@ TEST_F(FaceHidlTest, SetActiveUserNullTest) { // Cancel should always return CANCELED from any starting state including // the IDLE state. TEST_F(FaceHidlTest, CancelTest) { TEST_P(FaceHidlTest, CancelTest) { Return<Status> ret = mService->cancel(); // check that we were able to make an IPC request successfully ASSERT_EQ(Status::OK, static_cast<Status>(ret)); Loading @@ -347,7 +332,7 @@ TEST_F(FaceHidlTest, CancelTest) { EXPECT_EQ(FaceError::CANCELED, res.args->error); } TEST_F(FaceHidlTest, OnLockoutChangedTest) { TEST_P(FaceHidlTest, OnLockoutChangedTest) { // Update active user and ensure onLockoutChanged was called. Return<Status> ret = mService->setActiveUser(kUserId + 1, kFacedataDir); ASSERT_EQ(Status::OK, static_cast<Status>(ret)); Loading @@ -359,11 +344,7 @@ TEST_F(FaceHidlTest, OnLockoutChangedTest) { } // anonymous namespace int main(int argc, char** argv) { ::testing::AddGlobalTestEnvironment(FaceHidlEnvironment::Instance()); ::testing::InitGoogleTest(&argc, argv); FaceHidlEnvironment::Instance()->init(&argc, argv); int status = RUN_ALL_TESTS(); LOG(INFO) << "Test result = " << status; return status; } INSTANTIATE_TEST_SUITE_P( PerInstance, FaceHidlTest, testing::ValuesIn(android::hardware::getAllHalInstanceNames(IBiometricsFace::descriptor)), android::hardware::PrintInstanceNameToString); Loading
biometrics/face/1.0/vts/functional/Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,6 @@ cc_test { defaults: ["VtsHalTargetTestDefaults"], srcs: ["VtsHalBiometricsFaceV1_0TargetTest.cpp"], static_libs: ["android.hardware.biometrics.face@1.0"], test_suites: ["general-tests"], test_suites: ["general-tests", "vts-core"], }
biometrics/face/1.0/vts/functional/VtsHalBiometricsFaceV1_0TargetTest.cpp +26 −45 Original line number Diff line number Diff line Loading @@ -20,9 +20,10 @@ #include <android/hardware/biometrics/face/1.0/IBiometricsFaceClientCallback.h> #include <VtsHalHidlTargetCallbackBase.h> #include <VtsHalHidlTargetTestBase.h> #include <VtsHalHidlTargetTestEnvBase.h> #include <android-base/logging.h> #include <gtest/gtest.h> #include <hidl/GtestPrinter.h> #include <hidl/ServiceManagement.h> #include <chrono> #include <cstdint> Loading Loading @@ -124,27 +125,11 @@ class FaceCallback : public ::testing::VtsHalHidlTargetCallbackBase<FaceCallback } }; // Test environment for the BiometricsFace HAL. class FaceHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase { public: // Get the test environment singleton. static FaceHidlEnvironment* Instance() { static FaceHidlEnvironment* instance = new FaceHidlEnvironment; return instance; } void registerTestServices() override { registerTestService<IBiometricsFace>(); } private: FaceHidlEnvironment() = default; }; // Test class for the BiometricsFace HAL. class FaceHidlTest : public ::testing::VtsHalHidlTargetTestBase { class FaceHidlTest : public ::testing::TestWithParam<std::string> { public: void SetUp() override { mService = ::testing::VtsHalHidlTargetTestBase::getService<IBiometricsFace>( FaceHidlEnvironment::Instance()->getServiceName<IBiometricsFace>()); mService = IBiometricsFace::getService(GetParam()); ASSERT_NE(mService, nullptr); mCallback = new FaceCallback(); mCallback->SetWaitTimeoutDefault(kTimeout); Loading @@ -167,7 +152,7 @@ class FaceHidlTest : public ::testing::VtsHalHidlTargetTestBase { // generateChallenge should always return a unique, cryptographically secure, // non-zero number. TEST_F(FaceHidlTest, GenerateChallengeTest) { TEST_P(FaceHidlTest, GenerateChallengeTest) { std::map<uint64_t, int> m; for (int i = 0; i < kGenerateChallengeIterations; ++i) { Return<void> ret = Loading @@ -182,7 +167,7 @@ TEST_F(FaceHidlTest, GenerateChallengeTest) { } // enroll with an invalid (all zeroes) HAT should fail. TEST_F(FaceHidlTest, EnrollZeroHatTest) { TEST_P(FaceHidlTest, EnrollZeroHatTest) { // Filling HAT with zeros hidl_vec<uint8_t> token(69); for (size_t i = 0; i < 69; i++) { Loading @@ -200,7 +185,7 @@ TEST_F(FaceHidlTest, EnrollZeroHatTest) { } // enroll with an invalid HAT should fail. TEST_F(FaceHidlTest, EnrollGarbageHatTest) { TEST_P(FaceHidlTest, EnrollGarbageHatTest) { // Filling HAT with pseudorandom invalid data. // Using default seed to make the test reproducible. std::mt19937 gen(std::mt19937::default_seed); Loading @@ -221,7 +206,7 @@ TEST_F(FaceHidlTest, EnrollGarbageHatTest) { } // setFeature with an invalid (all zeros) HAT should fail. TEST_F(FaceHidlTest, SetFeatureZeroHatTest) { TEST_P(FaceHidlTest, SetFeatureZeroHatTest) { hidl_vec<uint8_t> token(69); for (size_t i = 0; i < 69; i++) { token[i] = 0; Loading @@ -232,7 +217,7 @@ TEST_F(FaceHidlTest, SetFeatureZeroHatTest) { } // setFeature with an invalid HAT should fail. TEST_F(FaceHidlTest, SetFeatureGarbageHatTest) { TEST_P(FaceHidlTest, SetFeatureGarbageHatTest) { // Filling HAT with pseudorandom invalid data. // Using default seed to make the test reproducible. std::mt19937 gen(std::mt19937::default_seed); Loading @@ -254,16 +239,16 @@ void assertGetFeatureFails(const sp<IBiometricsFace>& service, uint32_t faceId, ASSERT_TRUE(res.isOk()); } TEST_F(FaceHidlTest, GetFeatureRequireAttentionTest) { TEST_P(FaceHidlTest, GetFeatureRequireAttentionTest) { assertGetFeatureFails(mService, 0 /* faceId */, Feature::REQUIRE_ATTENTION); } TEST_F(FaceHidlTest, GetFeatureRequireDiversityTest) { TEST_P(FaceHidlTest, GetFeatureRequireDiversityTest) { assertGetFeatureFails(mService, 0 /* faceId */, Feature::REQUIRE_DIVERSITY); } // revokeChallenge should always return within the timeout TEST_F(FaceHidlTest, RevokeChallengeTest) { TEST_P(FaceHidlTest, RevokeChallengeTest) { auto start = std::chrono::system_clock::now(); Return<Status> ret = mService->revokeChallenge(); auto elapsed = std::chrono::system_clock::now() - start; Loading @@ -272,14 +257,14 @@ TEST_F(FaceHidlTest, RevokeChallengeTest) { } // The call to getAuthenticatorId should succeed. TEST_F(FaceHidlTest, GetAuthenticatorIdTest) { TEST_P(FaceHidlTest, GetAuthenticatorIdTest) { Return<void> ret = mService->getAuthenticatorId( [](const OptionalUint64& res) { ASSERT_EQ(Status::OK, res.status); }); ASSERT_TRUE(ret.isOk()); } // The call to enumerate should succeed. TEST_F(FaceHidlTest, EnumerateTest) { TEST_P(FaceHidlTest, EnumerateTest) { Return<Status> ret = mService->enumerate(); ASSERT_EQ(Status::OK, static_cast<Status>(ret)); auto res = mCallback->WaitForCallback(kCallbackNameOnEnumerate); Loading @@ -288,21 +273,21 @@ TEST_F(FaceHidlTest, EnumerateTest) { } // The call to remove should succeed for any faceId TEST_F(FaceHidlTest, RemoveFaceTest) { TEST_P(FaceHidlTest, RemoveFaceTest) { // Remove a face Return<Status> ret = mService->remove(kFaceId); ASSERT_EQ(Status::OK, static_cast<Status>(ret)); } // Remove should accept 0 to delete all faces TEST_F(FaceHidlTest, RemoveAllFacesTest) { TEST_P(FaceHidlTest, RemoveAllFacesTest) { // Remove all faces Return<Status> ret = mService->remove(0); ASSERT_EQ(Status::OK, static_cast<Status>(ret)); } // Active user should successfully set to a writable location. TEST_F(FaceHidlTest, SetActiveUserTest) { TEST_P(FaceHidlTest, SetActiveUserTest) { // Create an active user Return<Status> ret = mService->setActiveUser(2, kFacedataDir); ASSERT_EQ(Status::OK, static_cast<Status>(ret)); Loading @@ -313,7 +298,7 @@ TEST_F(FaceHidlTest, SetActiveUserTest) { } // Active user should fail to set to an unwritable location. TEST_F(FaceHidlTest, SetActiveUserUnwritableTest) { TEST_P(FaceHidlTest, SetActiveUserUnwritableTest) { // Create an active user to an unwritable location (device root dir) Return<Status> ret = mService->setActiveUser(3, "/"); ASSERT_NE(Status::OK, static_cast<Status>(ret)); Loading @@ -324,7 +309,7 @@ TEST_F(FaceHidlTest, SetActiveUserUnwritableTest) { } // Active user should fail to set to a null location. TEST_F(FaceHidlTest, SetActiveUserNullTest) { TEST_P(FaceHidlTest, SetActiveUserNullTest) { // Create an active user to a null location. Return<Status> ret = mService->setActiveUser(4, nullptr); ASSERT_NE(Status::OK, static_cast<Status>(ret)); Loading @@ -336,7 +321,7 @@ TEST_F(FaceHidlTest, SetActiveUserNullTest) { // Cancel should always return CANCELED from any starting state including // the IDLE state. TEST_F(FaceHidlTest, CancelTest) { TEST_P(FaceHidlTest, CancelTest) { Return<Status> ret = mService->cancel(); // check that we were able to make an IPC request successfully ASSERT_EQ(Status::OK, static_cast<Status>(ret)); Loading @@ -347,7 +332,7 @@ TEST_F(FaceHidlTest, CancelTest) { EXPECT_EQ(FaceError::CANCELED, res.args->error); } TEST_F(FaceHidlTest, OnLockoutChangedTest) { TEST_P(FaceHidlTest, OnLockoutChangedTest) { // Update active user and ensure onLockoutChanged was called. Return<Status> ret = mService->setActiveUser(kUserId + 1, kFacedataDir); ASSERT_EQ(Status::OK, static_cast<Status>(ret)); Loading @@ -359,11 +344,7 @@ TEST_F(FaceHidlTest, OnLockoutChangedTest) { } // anonymous namespace int main(int argc, char** argv) { ::testing::AddGlobalTestEnvironment(FaceHidlEnvironment::Instance()); ::testing::InitGoogleTest(&argc, argv); FaceHidlEnvironment::Instance()->init(&argc, argv); int status = RUN_ALL_TESTS(); LOG(INFO) << "Test result = " << status; return status; } INSTANTIATE_TEST_SUITE_P( PerInstance, FaceHidlTest, testing::ValuesIn(android::hardware::getAllHalInstanceNames(IBiometricsFace::descriptor)), android::hardware::PrintInstanceNameToString);