• 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.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