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