1 /* 2 * Copyright (C) 2017 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 package com.android.cts.managedprofile; 17 18 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE; 19 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE; 20 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE; 21 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME; 22 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION; 23 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION; 24 25 import static org.junit.Assert.assertEquals; 26 import static org.junit.Assert.assertNotNull; 27 import static org.junit.Assert.assertTrue; 28 import static org.junit.Assert.fail; 29 30 import android.accounts.Account; 31 import android.accounts.AccountManager; 32 import android.app.admin.DeviceAdminReceiver; 33 import android.app.admin.DevicePolicyManager; 34 import android.content.ComponentName; 35 import android.content.Context; 36 import android.content.Intent; 37 import android.content.SharedPreferences; 38 import android.os.PersistableBundle; 39 import android.util.Log; 40 41 import androidx.test.InstrumentationRegistry; 42 import androidx.test.filters.SmallTest; 43 44 import com.android.compatibility.common.util.devicepolicy.provisioning.SilentProvisioningTestManager; 45 46 import org.junit.Before; 47 import org.junit.Test; 48 49 @SmallTest 50 public class ProvisioningTest { 51 private static final String TAG = ProvisioningTest.class.getSimpleName(); 52 53 private static final String SHARED_PREFERENCE_FILE_NAME = "shared-preferences-file-name"; 54 55 private static final PersistableBundle ADMIN_EXTRAS_BUNDLE = new PersistableBundle(); 56 private static final String ADMIN_EXTRAS_BUNDLE_KEY_1 = "KEY_1"; 57 private static final String ADMIN_EXTRAS_BUNDLE_VALUE_1 = "VALUE_1"; 58 static { ADMIN_EXTRAS_BUNDLE.putString(ADMIN_EXTRAS_BUNDLE_KEY_1, ADMIN_EXTRAS_BUNDLE_VALUE_1)59 ADMIN_EXTRAS_BUNDLE.putString(ADMIN_EXTRAS_BUNDLE_KEY_1, ADMIN_EXTRAS_BUNDLE_VALUE_1); 60 } 61 62 public static final String KEY_PROVISIONING_SUCCESSFUL_RECEIVED = 63 "key-provisioning-successful-received"; 64 65 private static final ComponentName ADMIN_RECEIVER_COMPONENT = new ComponentName( 66 ProvisioningAdminReceiver.class.getPackage().getName(), 67 ProvisioningAdminReceiver.class.getName()); 68 69 public static class ProvisioningAdminReceiver extends DeviceAdminReceiver { 70 @Override onProfileProvisioningComplete(Context context, Intent intent)71 public void onProfileProvisioningComplete(Context context, Intent intent) { 72 super.onProfileProvisioningComplete(context, intent); 73 // Enabled profile 74 getManager(context).setProfileName(ADMIN_RECEIVER_COMPONENT, "Managed Profile"); 75 getManager(context).setProfileEnabled(ADMIN_RECEIVER_COMPONENT); 76 Log.i(TAG, "onProfileProvisioningComplete"); 77 78 saveBundle(context, intent.getParcelableExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE)); 79 } 80 } 81 82 private Context mContext; 83 private DevicePolicyManager mDpm; 84 85 @Before setUp()86 public void setUp() { 87 mContext = InstrumentationRegistry.getTargetContext(); 88 mDpm = mContext.getSystemService(DevicePolicyManager.class); 89 } 90 91 @Test testIsManagedProfile()92 public void testIsManagedProfile() { 93 assertTrue(mDpm.isManagedProfile(ADMIN_RECEIVER_COMPONENT)); 94 Log.i(TAG, "managed profile app: " + ADMIN_RECEIVER_COMPONENT.getPackageName()); 95 } 96 97 @Test testProvisionManagedProfile()98 public void testProvisionManagedProfile() throws InterruptedException { 99 provisionManagedProfile(createBaseProvisioningIntent()); 100 } 101 102 @Test testProvisionManagedProfile_accountCopy()103 public void testProvisionManagedProfile_accountCopy() throws InterruptedException { 104 provisionManagedProfile(createBaseProvisioningIntent() 105 .putExtra(EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, true)); 106 } 107 108 @Test testVerifyAdminExtraBundle()109 public void testVerifyAdminExtraBundle() { 110 PersistableBundle bundle = loadBundle(mContext); 111 assertNotNull(bundle); 112 assertEquals(ADMIN_EXTRAS_BUNDLE_VALUE_1, bundle.getString(ADMIN_EXTRAS_BUNDLE_KEY_1)); 113 } 114 115 @Test testVerifySuccessfulIntentWasReceived()116 public void testVerifySuccessfulIntentWasReceived() { 117 assertTrue(getSharedPreferences(mContext).getBoolean(KEY_PROVISIONING_SUCCESSFUL_RECEIVED, 118 false)); 119 } 120 121 @Test testAccountExist()122 public void testAccountExist() { 123 AccountManager am = AccountManager.get(mContext); 124 for (Account account : am.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE)) { 125 if (AccountAuthenticator.TEST_ACCOUNT.equals(account)) { 126 return; 127 } 128 } 129 fail("can't find migrated account"); 130 } 131 132 @Test testAccountNotExist()133 public void testAccountNotExist() { 134 AccountManager am = AccountManager.get(mContext); 135 assertTrue("test account still exists after account migration", 136 am.getAccountsByType(AccountAuthenticator.ACCOUNT_TYPE).length == 0); 137 } 138 createBaseProvisioningIntent()139 private Intent createBaseProvisioningIntent() { 140 return new Intent(ACTION_PROVISION_MANAGED_PROFILE) 141 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, ADMIN_RECEIVER_COMPONENT) 142 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, true) 143 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, ADMIN_EXTRAS_BUNDLE) 144 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, addAndGetTestAccount()); 145 } 146 provisionManagedProfile(Intent intent)147 private void provisionManagedProfile(Intent intent) throws InterruptedException { 148 SilentProvisioningTestManager provisioningManager = new SilentProvisioningTestManager(mContext); 149 assertTrue(provisioningManager.startProvisioningAndWait(intent)); 150 Log.i(TAG, "managed profile provisioning successful"); 151 } 152 addAndGetTestAccount()153 private Account addAndGetTestAccount() { 154 Account account = AccountAuthenticator.TEST_ACCOUNT; 155 AccountManager.get(mContext).addAccountExplicitly(account, null, null); 156 return account; 157 } 158 saveBundle(Context context, PersistableBundle bundle)159 private static void saveBundle(Context context, PersistableBundle bundle) { 160 if (bundle == null) { 161 Log.e(TAG, "null saveBundle"); 162 return; 163 } 164 165 getSharedPreferences(context).edit() 166 .putString(ADMIN_EXTRAS_BUNDLE_KEY_1, bundle.getString(ADMIN_EXTRAS_BUNDLE_KEY_1)) 167 .commit(); 168 } 169 loadBundle(Context context)170 private static PersistableBundle loadBundle(Context context) { 171 SharedPreferences pref = getSharedPreferences(context); 172 PersistableBundle bundle = new PersistableBundle(); 173 bundle.putString(ADMIN_EXTRAS_BUNDLE_KEY_1, 174 pref.getString(ADMIN_EXTRAS_BUNDLE_KEY_1, null)); 175 return bundle; 176 } 177 getSharedPreferences(Context context)178 public static SharedPreferences getSharedPreferences(Context context) { 179 return context.getSharedPreferences(SHARED_PREFERENCE_FILE_NAME, 0); 180 } 181 182 } 183