• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.biometrics;
18 
19 import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FACE;
20 import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
21 import static android.hardware.biometrics.BiometricAuthenticator.TYPE_IRIS;
22 
23 import static junit.framework.TestCase.assertNotNull;
24 import static junit.framework.TestCase.assertNull;
25 
26 import static org.junit.Assert.assertEquals;
27 import static org.mockito.ArgumentMatchers.any;
28 import static org.mockito.ArgumentMatchers.anyInt;
29 import static org.mockito.ArgumentMatchers.eq;
30 import static org.mockito.Mockito.spy;
31 import static org.mockito.Mockito.when;
32 
33 import android.app.admin.DevicePolicyManager;
34 import android.app.supervision.SupervisionManager;
35 import android.content.ComponentName;
36 import android.content.Context;
37 import android.hardware.biometrics.BiometricAuthenticator;
38 import android.os.UserHandle;
39 import android.os.UserManager;
40 import android.platform.test.annotations.RequiresFlagsDisabled;
41 import android.platform.test.annotations.RequiresFlagsEnabled;
42 import android.platform.test.flag.junit.CheckFlagsRule;
43 import android.platform.test.flag.junit.DeviceFlagsValueProvider;
44 
45 import androidx.annotation.Nullable;
46 import androidx.test.core.app.ApplicationProvider;
47 import androidx.test.ext.junit.runners.AndroidJUnit4;
48 
49 import com.android.settingslib.RestrictedLockUtils;
50 
51 import org.junit.Before;
52 import org.junit.Rule;
53 import org.junit.Test;
54 import org.junit.runner.RunWith;
55 import org.mockito.Mock;
56 import org.mockito.junit.MockitoJUnit;
57 import org.mockito.junit.MockitoRule;
58 
59 @RunWith(AndroidJUnit4.class)
60 public class ParentalControlsUtilsTest {
61     @Rule
62     public final CheckFlagsRule checkFlags = DeviceFlagsValueProvider.createCheckFlagsRule();
63     @Rule
64     public final MockitoRule mocks = MockitoJUnit.rule();
65 
66     private Context mContext;
67     @Mock
68     private DevicePolicyManager mDpm;
69     @Mock
70     private SupervisionManager mSm;
71 
72     private final ComponentName mSupervisionComponent = new ComponentName("pkg", "cls");
73 
74     @Before
setUp()75     public void setUp() {
76         mContext = spy(ApplicationProvider.getApplicationContext());
77         when(mContext.getSystemService(DevicePolicyManager.class)).thenReturn(mDpm);
78         when(mContext.getSystemService(SupervisionManager.class)).thenReturn(mSm);
79     }
80 
81     /**
82      * Helper that sets the appropriate mocks and testing behavior before returning the actual
83      * EnforcedAdmin from ParentalControlsUtils.
84      */
85     @Nullable
getEnforcedAdminForCombination( @ullable ComponentName supervisionComponentName, @BiometricAuthenticator.Modality int modality, int keyguardDisabledFlags)86     private RestrictedLockUtils.EnforcedAdmin getEnforcedAdminForCombination(
87             @Nullable ComponentName supervisionComponentName,
88             @BiometricAuthenticator.Modality int modality, int keyguardDisabledFlags) {
89         when(mDpm.getProfileOwnerOrDeviceOwnerSupervisionComponent(any(UserHandle.class)))
90                 .thenReturn(supervisionComponentName);
91         when(mDpm.getKeyguardDisabledFeatures(eq(supervisionComponentName)))
92                 .thenReturn(keyguardDisabledFlags);
93 
94         return ParentalControlsUtils.parentConsentRequiredInternal(
95                 mContext, modality, new UserHandle(UserHandle.myUserId()));
96     }
97 
98     /**
99      * Helper that sets the appropriate mocks and testing behavior before returning the actual
100      * EnforcedAdmin from ParentalControlsUtils.
101      */
102     @Nullable
getEnforcedAdminForSupervision( boolean supervisionEnabled, @BiometricAuthenticator.Modality int modality, int keyguardDisabledFlags)103     private RestrictedLockUtils.EnforcedAdmin getEnforcedAdminForSupervision(
104             boolean supervisionEnabled,
105             @BiometricAuthenticator.Modality int modality,
106             int keyguardDisabledFlags) {
107         when(mDpm.getKeyguardDisabledFeatures(eq(null))).thenReturn(keyguardDisabledFlags);
108         when(mSm.isSupervisionEnabledForUser(anyInt())).thenReturn(supervisionEnabled);
109         when(mSm.getActiveSupervisionAppPackage()).thenReturn(
110                 supervisionEnabled ? mSupervisionComponent.getPackageName() : null);
111 
112         return ParentalControlsUtils.parentConsentRequiredInternal(
113                 mContext, modality, new UserHandle(UserHandle.myUserId()));
114     }
115 
116     @Test
117     @RequiresFlagsDisabled(android.app.supervision.flags.Flags.FLAG_DEPRECATE_DPM_SUPERVISION_APIS)
testEnforcedAdmin_whenDpmDisablesBiometricsAndSupervisionComponentExists()118     public void testEnforcedAdmin_whenDpmDisablesBiometricsAndSupervisionComponentExists() {
119         int[][] tests = {
120                 {TYPE_FINGERPRINT, DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT},
121                 {TYPE_FACE, DevicePolicyManager.KEYGUARD_DISABLE_FACE},
122                 {TYPE_IRIS, DevicePolicyManager.KEYGUARD_DISABLE_IRIS},
123         };
124 
125         for (int i = 0; i < tests.length; i++) {
126             RestrictedLockUtils.EnforcedAdmin admin = getEnforcedAdminForCombination(
127                     mSupervisionComponent, tests[i][0] /* modality */,
128                     tests[i][1] /* keyguardDisableFlags */);
129             assertNotNull(admin);
130             assertEquals(UserManager.DISALLOW_BIOMETRIC, admin.enforcedRestriction);
131             assertEquals(mSupervisionComponent, admin.component);
132         }
133     }
134 
135     @Test
136     @RequiresFlagsEnabled(android.app.supervision.flags.Flags.FLAG_DEPRECATE_DPM_SUPERVISION_APIS)
testEnforcedAdmin_whenDpmDisablesBiometricsAndSupervisionIsEnabled()137     public void testEnforcedAdmin_whenDpmDisablesBiometricsAndSupervisionIsEnabled() {
138         int[][] tests = {
139                 {TYPE_FINGERPRINT, DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT},
140                 {TYPE_FACE, DevicePolicyManager.KEYGUARD_DISABLE_FACE},
141                 {TYPE_IRIS, DevicePolicyManager.KEYGUARD_DISABLE_IRIS},
142         };
143 
144         for (int i = 0; i < tests.length; i++) {
145             RestrictedLockUtils.EnforcedAdmin admin = getEnforcedAdminForSupervision(
146                     /* supervisionEnabled= */ true,
147                     /* modality= */ tests[i][0],
148                     /* keyguardDisableFlags= */ tests[i][1]);
149 
150             assertNotNull(admin);
151             assertEquals(UserManager.DISALLOW_BIOMETRIC, admin.enforcedRestriction);
152             assertNull(admin.component);
153         }
154     }
155 
156     @Test
157     @RequiresFlagsDisabled(android.app.supervision.flags.Flags.FLAG_DEPRECATE_DPM_SUPERVISION_APIS)
testNoEnforcedAdmin_whenNoSupervisionComponent()158     public void testNoEnforcedAdmin_whenNoSupervisionComponent() {
159         // Even if DPM flag exists, returns null EnforcedAdmin when no supervision component exists
160         RestrictedLockUtils.EnforcedAdmin admin = getEnforcedAdminForCombination(
161                 null /* supervisionComponentName */, TYPE_FINGERPRINT,
162                 DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
163         assertNull(admin);
164     }
165 
166     @Test
167     @RequiresFlagsEnabled(android.app.supervision.flags.Flags.FLAG_DEPRECATE_DPM_SUPERVISION_APIS)
testNoEnforcedAdmin_whenSupervisionIsDisabled()168     public void testNoEnforcedAdmin_whenSupervisionIsDisabled() {
169         RestrictedLockUtils.EnforcedAdmin admin = getEnforcedAdminForSupervision(
170                 /* supervisionEnabled= */ false,
171                 TYPE_FINGERPRINT,
172                 DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT);
173 
174         assertNull(admin);
175     }
176 }
177