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