1 package org.robolectric.shadows; 2 3 import static android.hardware.biometrics.BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE; 4 import static android.hardware.biometrics.BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED; 5 import static android.hardware.biometrics.BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE; 6 import static android.hardware.biometrics.BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED; 7 import static android.hardware.biometrics.BiometricManager.BIOMETRIC_SUCCESS; 8 import static android.os.Build.VERSION_CODES.Q; 9 import static android.os.Build.VERSION_CODES.R; 10 import static com.google.common.truth.Truth.assertThat; 11 12 import android.app.Activity; 13 import android.hardware.biometrics.BiometricManager; 14 import androidx.test.core.app.ApplicationProvider; 15 import androidx.test.ext.junit.runners.AndroidJUnit4; 16 import org.junit.Before; 17 import org.junit.Test; 18 import org.junit.runner.RunWith; 19 import org.robolectric.Robolectric; 20 import org.robolectric.android.controller.ActivityController; 21 import org.robolectric.annotation.Config; 22 import org.robolectric.shadow.api.Shadow; 23 24 /** Unit test for {@link ShadowBiometricManager} */ 25 @RunWith(AndroidJUnit4.class) 26 @Config(minSdk = Q) 27 public class ShadowBiometricManagerTest { 28 private BiometricManager biometricManager; 29 30 @Before setUp()31 public void setUp() { 32 biometricManager = 33 ApplicationProvider.getApplicationContext().getSystemService(BiometricManager.class); 34 assertThat(biometricManager).isNotNull(); 35 } 36 37 @Test testCanAuthenticate_serviceNotConnected_canNotAuthenticate()38 public void testCanAuthenticate_serviceNotConnected_canNotAuthenticate() { 39 ShadowBiometricManager shadowBiometricManager = Shadow.extract(biometricManager); 40 shadowBiometricManager.setCanAuthenticate(false); 41 42 assertThat(biometricManager.canAuthenticate()).isEqualTo(BIOMETRIC_ERROR_NO_HARDWARE); 43 } 44 45 @Test testCanAuthenticate_serviceConnected_canAuthenticate()46 public void testCanAuthenticate_serviceConnected_canAuthenticate() { 47 ShadowBiometricManager shadowBiometricManager = Shadow.extract(biometricManager); 48 shadowBiometricManager.setCanAuthenticate(true); 49 50 assertThat(biometricManager.canAuthenticate()).isEqualTo(BIOMETRIC_SUCCESS); 51 } 52 53 @Test testCanAuthenticate_serviceNotConnected_noEnrolledBiometric_biometricNotEnrolled()54 public void testCanAuthenticate_serviceNotConnected_noEnrolledBiometric_biometricNotEnrolled() { 55 ShadowBiometricManager shadowBiometricManager = Shadow.extract(biometricManager); 56 shadowBiometricManager.setCanAuthenticate(false); 57 shadowBiometricManager.setAuthenticatorType(BIOMETRIC_ERROR_NONE_ENROLLED); 58 59 assertThat(biometricManager.canAuthenticate()).isEqualTo(BIOMETRIC_ERROR_NONE_ENROLLED); 60 } 61 62 @Test testCanAuthenticate_serviceNotConnected_noHardware_biometricHwUnavailable()63 public void testCanAuthenticate_serviceNotConnected_noHardware_biometricHwUnavailable() { 64 ShadowBiometricManager shadowBiometricManager = Shadow.extract(biometricManager); 65 shadowBiometricManager.setCanAuthenticate(false); 66 shadowBiometricManager.setAuthenticatorType(BIOMETRIC_ERROR_HW_UNAVAILABLE); 67 68 assertThat(biometricManager.canAuthenticate()).isEqualTo(BIOMETRIC_ERROR_HW_UNAVAILABLE); 69 } 70 71 @Test 72 @Config(minSdk = R) 73 public void testCanAuthenticate_serviceNotConnected_securityUpdateRequired_biometricErrorSecurityUpdateRequired()74 testCanAuthenticate_serviceNotConnected_securityUpdateRequired_biometricErrorSecurityUpdateRequired() { 75 ShadowBiometricManager shadowBiometricManager = Shadow.extract(biometricManager); 76 shadowBiometricManager.setCanAuthenticate(false); 77 shadowBiometricManager.setAuthenticatorType(BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED); 78 79 assertThat(biometricManager.canAuthenticate()) 80 .isEqualTo(BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED); 81 } 82 83 @Test 84 @Config(minSdk = R) 85 public void testCanAuthenticateBiometricWeak_serviceConnected_noWeakButHaveStrongEntrolled_canAuthenticate()86 testCanAuthenticateBiometricWeak_serviceConnected_noWeakButHaveStrongEntrolled_canAuthenticate() { 87 ShadowBiometricManager shadowBiometricManager = Shadow.extract(biometricManager); 88 shadowBiometricManager.setCanAuthenticate(true); 89 shadowBiometricManager.setAuthenticatorType(BiometricManager.Authenticators.BIOMETRIC_STRONG); 90 91 assertThat(biometricManager.canAuthenticate(BiometricManager.Authenticators.BIOMETRIC_WEAK)) 92 .isEqualTo(BIOMETRIC_SUCCESS); 93 } 94 95 @Test 96 @Config(minSdk = R) testCanAuthenticateBiometricWeakDeviceCredential_serviceConnected_canAuthenticate()97 public void testCanAuthenticateBiometricWeakDeviceCredential_serviceConnected_canAuthenticate() { 98 final int authenticators = 99 BiometricManager.Authenticators.BIOMETRIC_WEAK 100 | BiometricManager.Authenticators.DEVICE_CREDENTIAL; 101 ShadowBiometricManager shadowBiometricManager = Shadow.extract(biometricManager); 102 shadowBiometricManager.setCanAuthenticate(true); 103 shadowBiometricManager.setAuthenticatorType(authenticators); 104 105 assertThat(biometricManager.canAuthenticate(authenticators)).isEqualTo(BIOMETRIC_SUCCESS); 106 } 107 108 @Test biometricManager_activityContextEnabled_differentInstancesRetrieveSameResult()109 public void biometricManager_activityContextEnabled_differentInstancesRetrieveSameResult() { 110 String originalProperty = System.getProperty("robolectric.createActivityContexts", ""); 111 System.setProperty("robolectric.createActivityContexts", "true"); 112 try (ActivityController<Activity> controller = 113 Robolectric.buildActivity(Activity.class).setup()) { 114 BiometricManager applicationBiometricManager = 115 ApplicationProvider.getApplicationContext().getSystemService(BiometricManager.class); 116 117 Activity activity = controller.get(); 118 BiometricManager activityBiometricManager = activity.getSystemService(BiometricManager.class); 119 120 assertThat(applicationBiometricManager).isNotSameInstanceAs(activityBiometricManager); 121 122 int applicationCanAuthenticate = applicationBiometricManager.canAuthenticate(); 123 int activityCanAuthenticate = activityBiometricManager.canAuthenticate(); 124 125 assertThat(activityCanAuthenticate).isEqualTo(applicationCanAuthenticate); 126 } finally { 127 System.setProperty("robolectric.createActivityContexts", originalProperty); 128 } 129 } 130 } 131