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