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.managedprovisioning.common; 18 19 import static android.app.admin.DevicePolicyManager.ACTION_ADMIN_POLICY_COMPLIANCE; 20 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE; 21 22 import static com.google.common.truth.Truth.assertThat; 23 24 import static org.robolectric.Shadows.shadowOf; 25 26 import android.app.Activity; 27 import android.app.Service; 28 import android.content.ComponentName; 29 import android.content.Context; 30 import android.content.Intent; 31 import android.content.pm.ResolveInfo; 32 import android.os.UserHandle; 33 34 import androidx.test.core.app.ApplicationProvider; 35 36 import com.android.managedprovisioning.analytics.MetricsWriterFactory; 37 import com.android.managedprovisioning.analytics.ProvisioningAnalyticsTracker; 38 import com.android.managedprovisioning.finalization.SendDpcBroadcastService; 39 import com.android.managedprovisioning.model.ProvisioningParams; 40 41 import org.junit.Ignore; 42 import org.junit.Test; 43 import org.junit.runner.RunWith; 44 import org.robolectric.Robolectric; 45 import org.robolectric.RobolectricTestRunner; 46 47 @RunWith(RobolectricTestRunner.class) 48 public class PolicyComplianceUtilsTest { 49 50 private static final String TEST_MDM_PACKAGE_NAME = "mdm.package.name"; 51 private static final String TEST_MDM_ADMIN_RECEIVER = TEST_MDM_PACKAGE_NAME + ".AdminReceiver"; 52 private static final ComponentName TEST_MDM_ADMIN = new ComponentName(TEST_MDM_PACKAGE_NAME, 53 TEST_MDM_ADMIN_RECEIVER); 54 private static final int POLICY_COMPLIANCE_ACTIVITY_REQUEST_CODE = 123; 55 private static final int NO_FLAGS = 0; 56 57 private final Context mContext = ApplicationProvider.getApplicationContext(); 58 private PolicyComplianceUtils mPolicyComplianceUtils = new PolicyComplianceUtils(); 59 private Utils mUtils = new Utils(); 60 private final ManagedProvisioningSharedPreferences mManagedProvisioningSharedPreferences = 61 new ManagedProvisioningSharedPreferences(mContext); 62 private final ProvisioningAnalyticsTracker mProvisioningAnalyticsTracker = 63 new ProvisioningAnalyticsTracker( 64 MetricsWriterFactory.getMetricsWriter(mContext, new SettingsFacade()), 65 mManagedProvisioningSharedPreferences); 66 private final TransitionHelper mTransitionHelper = new TransitionHelper(); 67 68 @Test isPolicyComplianceActivityResolvableForSystemUser_activityExists_returnsTrue()69 public void isPolicyComplianceActivityResolvableForSystemUser_activityExists_returnsTrue() { 70 Intent intent = createPolicyComplianceIntent(); 71 shadowOf(mContext.getPackageManager()).addResolveInfoForIntent(intent, new ResolveInfo()); 72 73 boolean result = mPolicyComplianceUtils.isPolicyComplianceActivityResolvableForUser( 74 mContext, 75 createTrustedSourceParamsBuilder().build(), 76 mUtils, 77 UserHandle.SYSTEM); 78 79 assertThat(result).isTrue(); 80 } 81 82 @Test isPolicyComplianceActivityResolvableForSystemUser_activityExists_returnsFalse()83 public void isPolicyComplianceActivityResolvableForSystemUser_activityExists_returnsFalse() { 84 boolean result = mPolicyComplianceUtils.isPolicyComplianceActivityResolvableForUser( 85 mContext, 86 createTrustedSourceParamsBuilder().build(), 87 mUtils, 88 UserHandle.SYSTEM); 89 90 assertThat(result).isFalse(); 91 } 92 93 @Ignore("b/218480743") 94 @Test startPolicyComplianceActivityForResultIfResolved_activityExists_isStarted()95 public void startPolicyComplianceActivityForResultIfResolved_activityExists_isStarted() { 96 Intent intent = createPolicyComplianceIntent(); 97 shadowOf(mContext.getPackageManager()).addResolveInfoForIntent(intent, new ResolveInfo()); 98 Activity parentActivity = Robolectric.buildActivity(Activity.class).create().get(); 99 100 boolean result = mPolicyComplianceUtils.startPolicyComplianceActivityForResultIfResolved( 101 parentActivity, 102 createTrustedSourceParamsBuilder().build(), 103 POLICY_COMPLIANCE_ACTIVITY_REQUEST_CODE, 104 mUtils, 105 mProvisioningAnalyticsTracker, 106 mTransitionHelper); 107 108 Intent startedIntent = shadowOf(parentActivity).peekNextStartedActivity(); 109 assertThat(startedIntent.getAction()).isEqualTo(ACTION_ADMIN_POLICY_COMPLIANCE); 110 assertThat(startedIntent.getPackage()).isEqualTo(TEST_MDM_PACKAGE_NAME); 111 assertThat(startedIntent.getFlags()).isEqualTo(NO_FLAGS); 112 assertThat(result).isTrue(); 113 } 114 115 @Ignore("b/218480743") 116 @Test startPolicyComplianceActivityForResultIfResolved_activityDoesNotExist_notStarted()117 public void startPolicyComplianceActivityForResultIfResolved_activityDoesNotExist_notStarted() { 118 Activity parentActivity = Robolectric.buildActivity(Activity.class).create().get(); 119 120 boolean result = mPolicyComplianceUtils.startPolicyComplianceActivityForResultIfResolved( 121 parentActivity, 122 createTrustedSourceParamsBuilder().build(), 123 POLICY_COMPLIANCE_ACTIVITY_REQUEST_CODE, 124 mUtils, 125 mProvisioningAnalyticsTracker, 126 mTransitionHelper); 127 128 Intent startedIntent = shadowOf(parentActivity).peekNextStartedActivity(); 129 assertThat(startedIntent).isNull(); 130 assertThat(result).isFalse(); 131 } 132 133 @Ignore("b/218480743") 134 @Test startPolicyComplianceActivityIfResolved_activityExists_isStarted()135 public void startPolicyComplianceActivityIfResolved_activityExists_isStarted() { 136 Intent intent = createPolicyComplianceIntent(); 137 shadowOf(mContext.getPackageManager()).addResolveInfoForIntent(intent, new ResolveInfo()); 138 Activity parentActivity = Robolectric.buildActivity(Activity.class).create().get(); 139 140 boolean result = mPolicyComplianceUtils.startPolicyComplianceActivityIfResolved( 141 parentActivity, 142 createTrustedSourceParamsBuilder().build(), 143 mUtils, 144 mProvisioningAnalyticsTracker); 145 146 Intent startedIntent = shadowOf(parentActivity).peekNextStartedActivity(); 147 assertThat(startedIntent.getAction()).isEqualTo(ACTION_ADMIN_POLICY_COMPLIANCE); 148 assertThat(startedIntent.getPackage()).isEqualTo(TEST_MDM_PACKAGE_NAME); 149 assertThat(startedIntent.getFlags()).isEqualTo(NO_FLAGS); 150 assertThat(result).isTrue(); 151 } 152 153 @Ignore("b/218480743") 154 @Test startPolicyComplianceActivityIfResolved_activityDoesNotExist_notStarted()155 public void startPolicyComplianceActivityIfResolved_activityDoesNotExist_notStarted() { 156 Activity parentActivity = Robolectric.buildActivity(Activity.class).create().get(); 157 158 boolean result = mPolicyComplianceUtils.startPolicyComplianceActivityIfResolved( 159 parentActivity, 160 createTrustedSourceParamsBuilder().build(), 161 mUtils, 162 mProvisioningAnalyticsTracker); 163 164 Intent startedIntent = shadowOf(parentActivity).peekNextStartedActivity(); 165 assertThat(startedIntent).isNull(); 166 assertThat(result).isFalse(); 167 } 168 169 @Test startPolicyComplianceActivityIfResolved_fromNonActivityContext_isStartedWithNewTaskFlag()170 public void startPolicyComplianceActivityIfResolved_fromNonActivityContext_isStartedWithNewTaskFlag() { 171 Intent intent = createPolicyComplianceIntent(); 172 shadowOf(mContext.getPackageManager()).addResolveInfoForIntent(intent, new ResolveInfo()); 173 Service service = Robolectric.buildService(SendDpcBroadcastService.class).create().get(); 174 175 boolean result = mPolicyComplianceUtils.startPolicyComplianceActivityIfResolved( 176 service, 177 createTrustedSourceParamsBuilder().build(), 178 mUtils, 179 mProvisioningAnalyticsTracker); 180 181 Intent startedIntent = shadowOf(service).peekNextStartedActivity(); 182 assertThat(startedIntent.getAction()).isEqualTo(ACTION_ADMIN_POLICY_COMPLIANCE); 183 assertThat(startedIntent.getPackage()).isEqualTo(TEST_MDM_PACKAGE_NAME); 184 assertThat(startedIntent.getFlags()).isEqualTo(Intent.FLAG_ACTIVITY_NEW_TASK); 185 assertThat(result).isTrue(); 186 } 187 188 @Test isPolicyComplianceActivityResolvableForManagedUser_withSystemUser_activityExists_returnsTrue()189 public void isPolicyComplianceActivityResolvableForManagedUser_withSystemUser_activityExists_returnsTrue() { 190 Intent intent = createPolicyComplianceIntent(); 191 shadowOf(mContext.getPackageManager()).addResolveInfoForIntent(intent, new ResolveInfo()); 192 193 boolean result = mPolicyComplianceUtils.isPolicyComplianceActivityResolvableForManagedUser( 194 mContext, 195 createTrustedSourceParamsBuilder().build(), 196 mUtils); 197 198 assertThat(result).isTrue(); 199 } 200 201 @Test isPolicyComplianceActivityResolvableForManagedUser_withSystemUser_activityDoesNotExist_returnsFalse()202 public void isPolicyComplianceActivityResolvableForManagedUser_withSystemUser_activityDoesNotExist_returnsFalse() { 203 boolean result = mPolicyComplianceUtils.isPolicyComplianceActivityResolvableForManagedUser( 204 mContext, 205 createTrustedSourceParamsBuilder().build(), 206 mUtils); 207 208 assertThat(result).isFalse(); 209 } 210 createPolicyComplianceIntent()211 private Intent createPolicyComplianceIntent() { 212 Intent intent = new Intent(ACTION_ADMIN_POLICY_COMPLIANCE); 213 intent.setPackage(TEST_MDM_PACKAGE_NAME); 214 return intent; 215 } 216 createTrustedSourceParamsBuilder()217 private static ProvisioningParams.Builder createTrustedSourceParamsBuilder() { 218 return ProvisioningParams.Builder.builder() 219 .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE) 220 .setDeviceAdminComponentName(TEST_MDM_ADMIN) 221 .setStartedByTrustedSource(true); 222 } 223 } 224