• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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