1 /*
2  * Copyright 2016, 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.finalization;
18 
19 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE;
20 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE;
21 import static android.app.admin.DevicePolicyManager.STATE_USER_PROFILE_COMPLETE;
22 import static android.app.admin.DevicePolicyManager.STATE_USER_PROFILE_FINALIZED;
23 import static android.app.admin.DevicePolicyManager.STATE_USER_SETUP_COMPLETE;
24 import static android.app.admin.DevicePolicyManager.STATE_USER_SETUP_FINALIZED;
25 import static android.app.admin.DevicePolicyManager.STATE_USER_SETUP_INCOMPLETE;
26 import static android.app.admin.DevicePolicyManager.STATE_USER_UNMANAGED;
27 import static android.content.Context.DEVICE_POLICY_SERVICE;
28 
29 import static org.mockito.Mockito.anyInt;
30 import static org.mockito.Mockito.never;
31 import static org.mockito.Mockito.verify;
32 import static org.mockito.Mockito.when;
33 
34 import android.app.admin.DevicePolicyManager;
35 import android.content.Context;
36 import android.os.UserHandle;
37 import android.test.AndroidTestCase;
38 import android.test.suitebuilder.annotation.SmallTest;
39 
40 import com.android.managedprovisioning.common.SettingsFacade;
41 import com.android.managedprovisioning.common.Utils;
42 import com.android.managedprovisioning.model.ProvisioningParams;
43 
44 import org.mockito.Mock;
45 import org.mockito.MockitoAnnotations;
46 
47 /**
48  * Unit tests for {@link UserProvisioningStateHelper}.
49  */
50 public class UserProvisioningStateHelperTest extends AndroidTestCase {
51     private static final int SYSTEM_USER_ID = 0;
52     private static final int PRIMARY_USER_ID = 1;
53     private static final int MANAGED_PROFILE_USER_ID = 2;
54     private static final String TEST_MDM_PACKAGE_NAME = "mdm.package.name";
55 
56     @Mock private Context mContext;
57     @Mock private DevicePolicyManager mDevicePolicyManager;
58     @Mock private Utils mUtils;
59     @Mock private SettingsFacade mSettingsFacade;
60 
61     private UserProvisioningStateHelper mHelper;
62 
setUp()63     public void setUp() {
64         // this is necessary for mockito to work
65         System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString());
66         MockitoAnnotations.initMocks(this);
67 
68         when(mContext.getSystemService(DEVICE_POLICY_SERVICE)).thenReturn(mDevicePolicyManager);
69 
70         mHelper = new UserProvisioningStateHelper(
71                 mContext,
72                 mUtils,
73                 mSettingsFacade,
74                 PRIMARY_USER_ID);
75     }
76 
77     @SmallTest
testInitiallyDone_ProfileAfterSuw()78     public void testInitiallyDone_ProfileAfterSuw() {
79         // GIVEN that we've provisioned a managed profile after SUW
80         final ProvisioningParams params =
81                 createProvisioningParams(ACTION_PROVISION_MANAGED_PROFILE);
82         markUserSetupCompleted(true);
83         when(mUtils.getManagedProfile(mContext)).thenReturn(UserHandle.of(MANAGED_PROFILE_USER_ID));
84 
85         // WHEN calling markUserProvisioningStateInitiallyDone
86         mHelper.markUserProvisioningStateInitiallyDone(params);
87 
88         // THEN the managed profile's state should be set to FINALIZED
89         verifyUserProvisioningStateSet(STATE_USER_SETUP_FINALIZED, MANAGED_PROFILE_USER_ID);
90     }
91 
92     @SmallTest
testInitiallyDone_ProfileDuringSuw()93     public void testInitiallyDone_ProfileDuringSuw() {
94         // GIVEN that we've provisioned a managed profile during SUW
95         final ProvisioningParams params =
96                 createProvisioningParams(ACTION_PROVISION_MANAGED_PROFILE);
97         markUserSetupCompleted(false);
98         when(mUtils.getManagedProfile(mContext)).thenReturn(UserHandle.of(MANAGED_PROFILE_USER_ID));
99 
100         // WHEN calling markUserProvisioningStateInitiallyDone
101         mHelper.markUserProvisioningStateInitiallyDone(params);
102 
103         // THEN the managed profile's state should be set to COMPLETE
104         verifyUserProvisioningStateSet(STATE_USER_SETUP_COMPLETE, MANAGED_PROFILE_USER_ID);
105         // THEN the primary user's state should be set to PROFILE_COMPLETE
106         verifyUserProvisioningStateSet(STATE_USER_PROFILE_COMPLETE, PRIMARY_USER_ID);
107     }
108 
109     @SmallTest
testInitiallyDone_DeviceAfterSuw()110     public void testInitiallyDone_DeviceAfterSuw() {
111         final ProvisioningParams params =
112                 createProvisioningParams(ACTION_PROVISION_MANAGED_DEVICE);
113         markUserSetupCompleted(true);
114 
115         mHelper.markUserProvisioningStateInitiallyDone(params);
116 
117         verify(mDevicePolicyManager, never()).setUserProvisioningState(anyInt(), anyInt());
118     }
119 
120     @SmallTest
testInitiallyDone_DeviceAfterSuw_allowedByParams()121     public void testInitiallyDone_DeviceAfterSuw_allowedByParams() {
122         final ProvisioningParams params =
123                 createProvisioningParams(ACTION_PROVISION_MANAGED_DEVICE)
124                         .toBuilder()
125                         .setAllowProvisioningAfterUserSetupComplete(true)
126                         .build();
127         markUserSetupCompleted(true);
128 
129         mHelper.markUserProvisioningStateInitiallyDone(params);
130 
131         verifyUserProvisioningStateSet(STATE_USER_SETUP_COMPLETE, PRIMARY_USER_ID);
132     }
133 
134     @SmallTest
testFinalized_ManagedProfile()135     public void testFinalized_ManagedProfile() {
136         // GIVEN that we've provisioned a managed profile
137         final ProvisioningParams params =
138                 createProvisioningParams(ACTION_PROVISION_MANAGED_PROFILE);
139         when(mUtils.getManagedProfile(mContext)).thenReturn(UserHandle.of(MANAGED_PROFILE_USER_ID));
140 
141         // WHEN calling markUserProvisioningStateFinalized
142         mHelper.markUserProvisioningStateFinalized(params);
143 
144         // THEN the managed profile's state should be set to FINALIZED
145         verifyUserProvisioningStateSet(STATE_USER_SETUP_FINALIZED, MANAGED_PROFILE_USER_ID);
146         // THEN the primary user's state should be set to STATE_USER_PROFILE_FINALIZED
147         verifyUserProvisioningStateSet(STATE_USER_PROFILE_FINALIZED, PRIMARY_USER_ID);
148     }
149 
150     @SmallTest
testFinalized_DeviceOwner()151     public void testFinalized_DeviceOwner() {
152         // GIVEN that we've provisioned a device owner with skip user setup false
153         final ProvisioningParams params = createProvisioningParams(ACTION_PROVISION_MANAGED_DEVICE);
154 
155         // WHEN calling markUserProvisioningStateFinalized
156         mHelper.markUserProvisioningStateFinalized(params);
157 
158         // THEN the primary user's state should be set to FINALIZED
159         verifyUserProvisioningStateSet(STATE_USER_SETUP_FINALIZED, PRIMARY_USER_ID);
160     }
161 
162     @SmallTest
testFinalized_DeviceOwner_HeadlessSystemUser()163     public void testFinalized_DeviceOwner_HeadlessSystemUser() {
164         setHeadlessSystemUserMode();
165         // GIVEN that we've provisioned a device owner with skip user setup false
166         final ProvisioningParams params = createProvisioningParams(ACTION_PROVISION_MANAGED_DEVICE);
167 
168         // WHEN calling markUserProvisioningStateFinalized
169         mHelper.markUserProvisioningStateFinalized(params);
170 
171         // THEN both the user who is setting DO and the headless system user's states
172         // should be set to FINALIZED
173         verifyUserProvisioningStateSet(STATE_USER_SETUP_FINALIZED, PRIMARY_USER_ID);
174         verifyUserProvisioningStateSet(STATE_USER_SETUP_FINALIZED, SYSTEM_USER_ID);
175     }
176 
177 
178     @SmallTest
testIsStateUnmanagedOrFinalized()179     public void testIsStateUnmanagedOrFinalized() {
180         assertTrue(isStateUnmanagedOrFinalizedWithCurrentState(STATE_USER_UNMANAGED));
181         assertTrue(isStateUnmanagedOrFinalizedWithCurrentState(STATE_USER_SETUP_FINALIZED));
182         assertFalse(isStateUnmanagedOrFinalizedWithCurrentState(STATE_USER_PROFILE_COMPLETE));
183         assertFalse(isStateUnmanagedOrFinalizedWithCurrentState(STATE_USER_SETUP_INCOMPLETE));
184         assertTrue(isStateUnmanagedOrFinalizedWithCurrentState(STATE_USER_PROFILE_FINALIZED));
185     }
186 
verifyUserProvisioningStateSet(int state, int userId)187     private void verifyUserProvisioningStateSet(int state, int userId) {
188         verify(mDevicePolicyManager).setUserProvisioningState(state, userId);
189     }
190 
markUserSetupCompleted(boolean completed)191     private void markUserSetupCompleted(boolean completed) {
192         when(mSettingsFacade.isUserSetupCompleted(mContext)).thenReturn(completed);
193     }
194 
isStateUnmanagedOrFinalizedWithCurrentState(int currentState)195     private boolean isStateUnmanagedOrFinalizedWithCurrentState(int currentState) {
196         when(mDevicePolicyManager.getUserProvisioningState()).thenReturn(currentState);
197         return mHelper.isStateUnmanagedOrFinalized();
198     }
199 
createProvisioningParams(String action)200     private ProvisioningParams createProvisioningParams(String action) {
201         return new ProvisioningParams.Builder()
202                 .setDeviceAdminPackageName(TEST_MDM_PACKAGE_NAME)
203                 .setProvisioningAction(action)
204                 .build();
205     }
206 
setHeadlessSystemUserMode()207     private void setHeadlessSystemUserMode() {
208         when(mUtils.isHeadlessSystemUserMode()).thenReturn(true);
209     }
210 }
211