1 /*
2  * Copyright (C) 2020 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_GET_PROVISIONING_MODE;
20 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE;
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.content.ComponentName;
28 import android.content.Context;
29 import android.content.Intent;
30 import android.content.pm.ActivityInfo;
31 import android.content.pm.ApplicationInfo;
32 import android.content.pm.ResolveInfo;
33 import android.os.Bundle;
34 
35 import androidx.test.core.app.ApplicationProvider;
36 
37 import com.android.managedprovisioning.model.ProvisioningParams;
38 
39 import org.junit.Test;
40 import org.junit.runner.RunWith;
41 import org.robolectric.Robolectric;
42 import org.robolectric.RobolectricTestRunner;
43 
44 /**
45  * Tests for {@link GetProvisioningModeUtils}.
46  */
47 @RunWith(RobolectricTestRunner.class)
48 public class GetProvisioningModeUtilsTest {
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 ProvisioningParams PARAMS = ProvisioningParams.Builder.builder()
55             .setProvisioningAction(ACTION_PROVISION_MANAGED_PROFILE)
56             .setDeviceAdminComponentName(TEST_MDM_ADMIN)
57             .build();
58     private static final String STRING_EXTRA_KEY = "myStringExtra";
59     private static final String STRING_EXTRA_VALUE = "some string";
60     private static final String INT_EXTRA_KEY = "myIntExtra";
61     private static final int INT_EXTRA_VALUE = 2;
62 
63     private final Context mContext = ApplicationProvider.getApplicationContext();
64     private final GetProvisioningModeUtils mProvisioningModeUtils = new GetProvisioningModeUtils();
65     private final TransitionHelper mTransitionHelper = new TransitionHelper();
66 
67     @Test
isGetProvisioningModeActivityResolvable_resolvableActivity_returnsTrue()68     public void isGetProvisioningModeActivityResolvable_resolvableActivity_returnsTrue() {
69         Intent intentGetMode = new Intent(ACTION_GET_PROVISIONING_MODE);
70         intentGetMode.setPackage(TEST_MDM_PACKAGE_NAME);
71         ResolveInfo info = createFakeResolveInfo();
72         shadowOf(mContext.getPackageManager()).addResolveInfoForIntent(intentGetMode, info);
73 
74         assertThat(mProvisioningModeUtils
75                 .isGetProvisioningModeActivityResolvable(mContext, PARAMS)).isTrue();
76     }
77 
78     @Test
isGetProvisioningModeActivityResolvable_notResolvableActivity_returnsFalse()79     public void isGetProvisioningModeActivityResolvable_notResolvableActivity_returnsFalse() {
80         Intent intentGetMode = new Intent(ACTION_GET_PROVISIONING_MODE);
81         intentGetMode.setPackage(TEST_MDM_PACKAGE_NAME);
82 
83         assertThat(mProvisioningModeUtils
84                 .isGetProvisioningModeActivityResolvable(mContext, PARAMS)).isFalse();
85     }
86 
87     @Test
startGetProvisioningModeActivityIfResolved_resolvableActivity_returnsTrue()88     public void startGetProvisioningModeActivityIfResolved_resolvableActivity_returnsTrue() {
89         Intent intentGetMode = new Intent(ACTION_GET_PROVISIONING_MODE);
90         intentGetMode.setPackage(TEST_MDM_PACKAGE_NAME);
91         ResolveInfo info = createFakeResolveInfo();
92         shadowOf(mContext.getPackageManager()).addResolveInfoForIntent(intentGetMode, info);
93         int requestCode = 1;
94         Activity parentActivity = Robolectric.buildActivity(Activity.class).create().get();
95 
96         assertThat(mProvisioningModeUtils
97                 .startGetProvisioningModeActivityIfResolved(
98                 parentActivity, PARAMS, new Bundle(), requestCode, mTransitionHelper)).isTrue();
99     }
100 
101     @Test
startGetProvisioningModeActivityIfResolved_resolvableActivity_startsGetProvisioningModeIntent()102     public void startGetProvisioningModeActivityIfResolved_resolvableActivity_startsGetProvisioningModeIntent() {
103         Intent intentGetMode = new Intent(ACTION_GET_PROVISIONING_MODE);
104         intentGetMode.setPackage(TEST_MDM_PACKAGE_NAME);
105         ResolveInfo info = createFakeResolveInfo();
106         shadowOf(mContext.getPackageManager()).addResolveInfoForIntent(intentGetMode, info);
107         int requestCode = 1;
108         Activity parentActivity = Robolectric.buildActivity(Activity.class).create().get();
109 
110         mProvisioningModeUtils.startGetProvisioningModeActivityIfResolved(
111                 parentActivity, PARAMS, new Bundle(), requestCode, mTransitionHelper);
112 
113         Intent startedIntent = shadowOf(parentActivity).peekNextStartedActivity();
114         assertThat(startedIntent.getAction())
115                 .isEqualTo(ACTION_GET_PROVISIONING_MODE);
116         assertThat(startedIntent.getPackage())
117                 .isEqualTo(TEST_MDM_PACKAGE_NAME);
118     }
119 
120     @Test
121     public void
startGetProvisioningModeActivityIfResolved_resolvableActivity_includesAdditionalExtras()122     startGetProvisioningModeActivityIfResolved_resolvableActivity_includesAdditionalExtras() {
123         Intent intentGetMode = new Intent(ACTION_GET_PROVISIONING_MODE);
124         intentGetMode.setPackage(TEST_MDM_PACKAGE_NAME);
125         ResolveInfo info = createFakeResolveInfo();
126         shadowOf(mContext.getPackageManager()).addResolveInfoForIntent(intentGetMode, info);
127         int requestCode = 1;
128         Activity parentActivity = Robolectric.buildActivity(Activity.class).create().get();
129         Bundle additionalExtras = new Bundle();
130         additionalExtras.putInt(INT_EXTRA_KEY, INT_EXTRA_VALUE);
131         additionalExtras.putString(STRING_EXTRA_KEY, STRING_EXTRA_VALUE);
132 
133         mProvisioningModeUtils.startGetProvisioningModeActivityIfResolved(
134                 parentActivity, PARAMS, additionalExtras, requestCode, mTransitionHelper);
135 
136         Bundle extras = shadowOf(parentActivity).peekNextStartedActivity().getExtras();
137         assertThat(extras.getInt(INT_EXTRA_KEY)).isEqualTo(INT_EXTRA_VALUE);
138         assertThat(extras.getString(STRING_EXTRA_KEY)).isEqualTo(STRING_EXTRA_VALUE);
139     }
140 
createFakeResolveInfo()141     private ResolveInfo createFakeResolveInfo() {
142         ResolveInfo info = new ResolveInfo();
143         ApplicationInfo applicationInfo = new ApplicationInfo();
144         applicationInfo.packageName = TEST_MDM_PACKAGE_NAME;
145         ActivityInfo activityInfo = new ActivityInfo();
146         activityInfo.applicationInfo = applicationInfo;
147         activityInfo.name = "SomeClassName";
148         info.activityInfo = activityInfo;
149         return info;
150     }
151 }
152