Merge "Send error if enroll is invoked when face is already enrolled" into udc-dev

This commit is contained in:
Diya Bera
2023-04-14 22:28:26 +00:00
committed by Android (Google) Code Review
2 changed files with 46 additions and 3 deletions

View File

@@ -342,6 +342,14 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
return;
}
if (getEnrolledFaces(userId).size()
>= mContext.getResources().getInteger(R.integer.config_faceMaxTemplatesPerUser)) {
callback.onEnrollmentError(FACE_ERROR_HW_UNAVAILABLE,
getErrorString(mContext, FACE_ERROR_HW_UNAVAILABLE,
0 /* vendorCode */));
return;
}
if (mService != null) {
try {
mEnrollmentCallback = callback;

View File

@@ -21,8 +21,11 @@ import static android.hardware.biometrics.BiometricFaceConstants.FACE_ERROR_HW_U
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
@@ -38,6 +41,8 @@ import android.os.RemoteException;
import android.os.test.TestLooper;
import android.platform.test.annotations.Presubmit;
import com.android.internal.R;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
@@ -50,6 +55,7 @@ import org.mockito.junit.MockitoJUnitRunner;
import org.mockito.junit.MockitoRule;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@Presubmit
@@ -70,6 +76,8 @@ public class FaceManagerTest {
private IFaceService mService;
@Mock
private FaceManager.AuthenticationCallback mAuthCallback;
@Mock
private FaceManager.EnrollmentCallback mEnrollmentCallback;
@Captor
private ArgumentCaptor<IFaceAuthenticatorsRegisteredCallback> mCaptor;
@@ -107,9 +115,7 @@ public class FaceManagerTest {
@Test
public void getSensorPropertiesInternal_noBinderCalls() throws RemoteException {
verify(mService).addAuthenticatorsRegisteredCallback(mCaptor.capture());
mCaptor.getValue().onAllAuthenticatorsRegistered(mProps);
initializeProperties();
List<FaceSensorPropertiesInternal> actual = mFaceManager.getSensorPropertiesInternal();
assertThat(actual).containsExactlyElementsIn(mProps);
@@ -148,4 +154,33 @@ public class FaceManagerTest {
verify(mAuthCallback).onAuthenticationError(eq(FACE_ERROR_HW_UNAVAILABLE), any());
}
@Test
public void enrollment_errorWhenFaceEnrollmentExists() throws RemoteException {
when(mResources.getInteger(R.integer.config_faceMaxTemplatesPerUser)).thenReturn(1);
when(mService.getEnrolledFaces(anyInt(), anyInt(), anyString()))
.thenReturn(Collections.emptyList())
.thenReturn(Collections.singletonList(new Face("Face" /* name */, 0 /* faceId */,
0 /* deviceId */)));
initializeProperties();
mFaceManager.enroll(USER_ID, new byte[]{},
new CancellationSignal(), mEnrollmentCallback, null /* disabledFeatures */);
verify(mService).enroll(eq(USER_ID), any(), any(), any(), anyString(), any(), any(),
anyBoolean());
mFaceManager.enroll(USER_ID, new byte[]{},
new CancellationSignal(), mEnrollmentCallback, null /* disabledFeatures */);
verify(mService, atMost(1 /* maxNumberOfInvocations */)).enroll(eq(USER_ID), any(), any(),
any(), anyString(), any(), any(), anyBoolean());
verify(mEnrollmentCallback).onEnrollmentError(eq(FACE_ERROR_HW_UNAVAILABLE), anyString());
}
private void initializeProperties() throws RemoteException {
verify(mService).addAuthenticatorsRegisteredCallback(mCaptor.capture());
mCaptor.getValue().onAllAuthenticatorsRegistered(mProps);
}
}