Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6fe484ca authored by nelsonli's avatar nelsonli
Browse files

[vts-core] add VtsHalBiometricsFingerprintV2_1TargetTest to vts-core

Convert VtsHalBiometricsFingerprintV2_1TargetTest to be parameterized test
and add it to vts-core

Bug: 142397658
Test: $ atest VtsHalBiometricsFingerprintV2_1TargetTest
Change-Id: I076d3de4398e071370f3386817b8248a13eb9352
parent 538d6526
Loading
Loading
Loading
Loading
+213 −232
Original line number Diff line number Diff line
@@ -16,14 +16,15 @@

#define LOG_TAG "fingerprint_hidl_hal_test"

#include <VtsHalHidlTargetTestBase.h>
#include <VtsHalHidlTargetTestEnvBase.h>
#include <android-base/logging.h>
#include <android-base/properties.h>
#include <android/hardware/biometrics/fingerprint/2.1/IBiometricsFingerprint.h>
#include <android/hardware/biometrics/fingerprint/2.1/IBiometricsFingerprintClientCallback.h>
#include <gtest/gtest.h>
#include <hidl/GtestPrinter.h>
#include <hidl/HidlSupport.h>
#include <hidl/HidlTransportSupport.h>
#include <hidl/ServiceManagement.h>
#include <utils/Condition.h>

#include <cinttypes>
@@ -183,23 +184,10 @@ class RemoveCallback : public FingerprintCallbackBase {
  std::promise<void> promise;
};

// Test environment for Fingerprint HIDL HAL.
class FingerprintHidlEnvironment : public ::testing::VtsHalHidlTargetTestEnvBase {
 public:
  // get the test environment singleton
  static FingerprintHidlEnvironment* Instance() {
    static FingerprintHidlEnvironment* instance = new FingerprintHidlEnvironment;
    return instance;
  }

  virtual void registerTestServices() override { registerTestService<IBiometricsFingerprint>(); }
};

class FingerprintHidlTest : public ::testing::VtsHalHidlTargetTestBase {
class FingerprintHidlTest : public ::testing::TestWithParam<std::string> {
  public:
    virtual void SetUp() override {
    mService = ::testing::VtsHalHidlTargetTestBase::getService<IBiometricsFingerprint>(
        FingerprintHidlEnvironment::Instance()->getServiceName<IBiometricsFingerprint>());
        mService = IBiometricsFingerprint::getService(GetParam());
        ASSERT_FALSE(mService == nullptr);

        /*
@@ -230,22 +218,21 @@ class FingerprintHidlTest : public ::testing::VtsHalHidlTargetTestBase {
    sp<IBiometricsFingerprint> mService;
};


// The service should be reachable.
TEST_F(FingerprintHidlTest, ConnectTest) {
TEST_P(FingerprintHidlTest, ConnectTest) {
    sp<FingerprintCallbackBase> cb = new FingerprintCallbackBase();
    Return<uint64_t> rc = mService->setNotify(cb);
    ASSERT_NE(0UL, static_cast<uint64_t>(rc));
}

// Starting the service with null callback should succeed.
TEST_F(FingerprintHidlTest, ConnectNullTest) {
TEST_P(FingerprintHidlTest, ConnectNullTest) {
    Return<uint64_t> rc = mService->setNotify(NULL);
    ASSERT_NE(0UL, static_cast<uint64_t>(rc));
}

// Pre-enroll should always return unique, cryptographically secure, non-zero number
TEST_F(FingerprintHidlTest, PreEnrollTest) {
TEST_P(FingerprintHidlTest, PreEnrollTest) {
    std::map<uint64_t, uint64_t> m;

    for (unsigned int i = 0; i < kIterations; ++i) {
@@ -257,7 +244,7 @@ TEST_F(FingerprintHidlTest, PreEnrollTest) {
}

// Enroll with an invalid (all zeroes) HAT should fail.
TEST_F(FingerprintHidlTest, EnrollInvalidHatTest) {
TEST_P(FingerprintHidlTest, EnrollInvalidHatTest) {
    sp<ErrorCallback> cb = new ErrorCallback();
    Return<uint64_t> rc = mService->setNotify(cb);
    ASSERT_NE(0UL, static_cast<uint64_t>(rc));
@@ -276,7 +263,7 @@ TEST_F(FingerprintHidlTest, EnrollInvalidHatTest) {
}

// Enroll with an invalid (null) HAT should fail.
TEST_F(FingerprintHidlTest, EnrollNullTest) {
TEST_P(FingerprintHidlTest, EnrollNullTest) {
    sp<ErrorCallback> cb = new ErrorCallback();
    Return<uint64_t> rc = mService->setNotify(cb);
    ASSERT_NE(0UL, static_cast<uint64_t>(rc));
@@ -291,7 +278,7 @@ TEST_F(FingerprintHidlTest, EnrollNullTest) {
}

// PostEnroll should always return within 3s
TEST_F(FingerprintHidlTest, PostEnrollTest) {
TEST_P(FingerprintHidlTest, PostEnrollTest) {
    sp<FingerprintCallbackBase> cb = new FingerprintCallbackBase();
    Return<uint64_t> rc = mService->setNotify(cb);

@@ -302,13 +289,13 @@ TEST_F(FingerprintHidlTest, PostEnrollTest) {
}

// getAuthenticatorId should always return non-zero numbers
TEST_F(FingerprintHidlTest, GetAuthenticatorIdTest) {
TEST_P(FingerprintHidlTest, GetAuthenticatorIdTest) {
    Return<uint64_t> res = mService->getAuthenticatorId();
    EXPECT_NE(0UL, static_cast<uint64_t>(res));
}

// Enumerate should always trigger onEnumerated(fid=0, rem=0) when there are no fingerprints
TEST_F(FingerprintHidlTest, EnumerateTest) {
TEST_P(FingerprintHidlTest, EnumerateTest) {
    sp<EnumerateCallback> cb = new EnumerateCallback();
    Return<uint64_t> rc = mService->setNotify(cb);
    ASSERT_NE(0UL, static_cast<uint64_t>(rc));
@@ -318,12 +305,11 @@ TEST_F(FingerprintHidlTest, EnumerateTest) {
    ASSERT_TRUE(waitForCallback(cb->promise.get_future()));
    EXPECT_EQ(0UL, cb->fingerId);
    EXPECT_EQ(0UL, cb->remaining);

}

// Remove should succeed on any inputs
// At least one callback with "remaining=0" should occur
TEST_F(FingerprintHidlTest, RemoveFingerprintTest) {
TEST_P(FingerprintHidlTest, RemoveFingerprintTest) {
    // Register callback
    sp<RemoveCallback> cb = new RemoveCallback(kGroupId);
    Return<uint64_t> rc = mService->setNotify(cb);
@@ -339,7 +325,7 @@ TEST_F(FingerprintHidlTest, RemoveFingerprintTest) {

// Remove should accept 0 to delete all fingerprints
// At least one callback with "remaining=0" should occur.
TEST_F(FingerprintHidlTest, RemoveAllFingerprintsTest) {
TEST_P(FingerprintHidlTest, RemoveAllFingerprintsTest) {
    // Register callback
    sp<RemoveCallback> cb = new RemoveCallback(kGroupId);
    Return<uint64_t> rc = mService->setNotify(cb);
@@ -352,7 +338,7 @@ TEST_F(FingerprintHidlTest, RemoveAllFingerprintsTest) {
}

// Active group should successfully set to a writable location.
TEST_F(FingerprintHidlTest, SetActiveGroupTest) {
TEST_P(FingerprintHidlTest, SetActiveGroupTest) {
    // Create an active group
    Return<RequestStatus> res = mService->setActiveGroup(2, kTmpDir);
    ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
@@ -363,7 +349,7 @@ TEST_F(FingerprintHidlTest, SetActiveGroupTest) {
}

// Active group should fail to set to an unwritable location.
TEST_F(FingerprintHidlTest, SetActiveGroupUnwritableTest) {
TEST_P(FingerprintHidlTest, SetActiveGroupUnwritableTest) {
    // Create an active group to an unwritable location (device root dir)
    Return<RequestStatus> res = mService->setActiveGroup(3, "/");
    ASSERT_NE(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
@@ -374,7 +360,7 @@ TEST_F(FingerprintHidlTest, SetActiveGroupUnwritableTest) {
}

// Active group should fail to set to a null location.
TEST_F(FingerprintHidlTest, SetActiveGroupNullTest) {
TEST_P(FingerprintHidlTest, SetActiveGroupNullTest) {
    // Create an active group to a null location.
    Return<RequestStatus> res = mService->setActiveGroup(4, nullptr);
    ASSERT_NE(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));
@@ -386,7 +372,7 @@ TEST_F(FingerprintHidlTest, SetActiveGroupNullTest) {

// Cancel should always return ERROR_CANCELED from any starting state including
// the IDLE state.
TEST_F(FingerprintHidlTest, CancelTest) {
TEST_P(FingerprintHidlTest, CancelTest) {
    sp<ErrorCallback> cb = new ErrorCallback(true, FingerprintError::ERROR_CANCELED);
    Return<uint64_t> rc = mService->setNotify(cb);
    ASSERT_NE(0UL, static_cast<uint64_t>(rc));
@@ -402,7 +388,7 @@ TEST_F(FingerprintHidlTest, CancelTest) {
}

// A call to cancel should succeed during enroll.
TEST_F(FingerprintHidlTest, CancelEnrollTest) {
TEST_P(FingerprintHidlTest, CancelEnrollTest) {
    Return<RequestStatus> res = mService->setActiveGroup(kGroupId, kTmpDir);
    ASSERT_EQ(RequestStatus::SYS_OK, static_cast<RequestStatus>(res));

@@ -426,7 +412,7 @@ TEST_F(FingerprintHidlTest, CancelEnrollTest) {
}

// A call to cancel should succeed during authentication.
TEST_F(FingerprintHidlTest, CancelAuthTest) {
TEST_P(FingerprintHidlTest, CancelAuthTest) {
    sp<ErrorCallback> cb = new ErrorCallback(true, FingerprintError::ERROR_CANCELED);
    Return<uint64_t> rc = mService->setNotify(cb);
    ASSERT_NE(0U, static_cast<uint64_t>(rc));
@@ -446,7 +432,7 @@ TEST_F(FingerprintHidlTest, CancelAuthTest) {
}

// A call to cancel should succeed during authentication.
TEST_F(FingerprintHidlTest, CancelRemoveTest) {
TEST_P(FingerprintHidlTest, CancelRemoveTest) {
    sp<ErrorCallback> cb = new ErrorCallback(true, FingerprintError::ERROR_CANCELED);
    Return<uint64_t> rc = mService->setNotify(cb);
    ASSERT_NE(0U, static_cast<uint64_t>(rc));
@@ -466,7 +452,7 @@ TEST_F(FingerprintHidlTest, CancelRemoveTest) {
}

// A call to cancel should succeed during authentication.
TEST_F(FingerprintHidlTest, CancelRemoveAllTest) {
TEST_P(FingerprintHidlTest, CancelRemoveAllTest) {
    sp<ErrorCallback> cb = new ErrorCallback(true, FingerprintError::ERROR_CANCELED);
    Return<uint64_t> rc = mService->setNotify(cb);
    ASSERT_NE(0U, static_cast<uint64_t>(rc));
@@ -486,12 +472,7 @@ TEST_F(FingerprintHidlTest, CancelRemoveAllTest) {
}
}  // anonymous namespace

int main(int argc, char **argv) {
  ::testing::AddGlobalTestEnvironment(FingerprintHidlEnvironment::Instance());
  ::testing::InitGoogleTest(&argc, argv);
  FingerprintHidlEnvironment::Instance()->init(&argc, argv);
  int status = RUN_ALL_TESTS();
  LOG(INFO) << "Test result = " << status;
  return status;
}
INSTANTIATE_TEST_SUITE_P(PerInstance, FingerprintHidlTest,
                         testing::ValuesIn(android::hardware::getAllHalInstanceNames(
                                 IBiometricsFingerprint::descriptor)),
                         android::hardware::PrintInstanceNameToString);