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 package com.android.managedprovisioning.parser; 17 18 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE; 19 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE; 20 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE; 21 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE; 22 import static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_USER; 23 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE; 24 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE; 25 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME; 26 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE; 27 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM; 28 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER; 29 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION; 30 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL; 31 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME; 32 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM; 33 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED; 34 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCALE; 35 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCAL_TIME; 36 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR; 37 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION; 38 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ORGANIZATION_NAME; 39 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION; 40 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_USER_CONSENT; 41 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SUPPORT_URL; 42 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_TIME_ZONE; 43 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_HIDDEN; 44 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PAC_URL; 45 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PASSWORD; 46 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_BYPASS; 47 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_HOST; 48 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_PORT; 49 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SECURITY_TYPE; 50 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SSID; 51 import static android.nfc.NfcAdapter.ACTION_NDEF_DISCOVERED; 52 import static com.android.managedprovisioning.TestUtils.createTestAdminExtras; 53 import static org.mockito.Mockito.doReturn; 54 import static org.mockito.Mockito.spy; 55 import static org.mockito.Mockito.when; 56 57 import android.accounts.Account; 58 import android.app.admin.DevicePolicyManager; 59 import android.content.ComponentName; 60 import android.content.Context; 61 import android.content.Intent; 62 import android.os.Bundle; 63 import android.os.UserHandle; 64 import android.test.AndroidTestCase; 65 import android.test.suitebuilder.annotation.SmallTest; 66 import android.util.Base64; 67 import com.android.managedprovisioning.common.Globals; 68 import com.android.managedprovisioning.common.IllegalProvisioningArgumentException; 69 import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences; 70 import com.android.managedprovisioning.common.StoreUtils; 71 import com.android.managedprovisioning.common.Utils; 72 import com.android.managedprovisioning.model.PackageDownloadInfo; 73 import com.android.managedprovisioning.model.ProvisioningParams; 74 import com.android.managedprovisioning.model.WifiInfo; 75 import java.util.Locale; 76 import org.mockito.Mock; 77 import org.mockito.MockitoAnnotations; 78 79 /** Tests for {@link ExtrasProvisioningDataParser}. */ 80 @SmallTest 81 public class ExtrasProvisioningDataParserTest extends AndroidTestCase { 82 private static final String TEST_PACKAGE_NAME = "com.afwsamples.testdpc"; 83 private static final ComponentName TEST_COMPONENT_NAME = 84 ComponentName.unflattenFromString( 85 "com.afwsamples.testdpc/com.afwsamples.testdpc.DeviceAdminReceiver"); 86 private static final ComponentName TEST_COMPONENT_NAME_2 = 87 ComponentName.unflattenFromString( 88 "com.afwsamples.testdpc2/com.afwsamples.testdpc.DeviceAdminReceiver"); 89 private static final long TEST_LOCAL_TIME = 1456939524713L; 90 private static final Locale TEST_LOCALE = Locale.UK; 91 private static final String TEST_TIME_ZONE = "GMT"; 92 private static final Integer TEST_MAIN_COLOR = 65280; 93 private static final boolean TEST_STARTED_BY_TRUSTED_SOURCE = true; 94 private static final boolean TEST_LEAVE_ALL_SYSTEM_APP_ENABLED = true; 95 private static final boolean TEST_SKIP_ENCRYPTION = true; 96 private static final boolean TEST_SKIP_USER_CONSENT = true; 97 private static final boolean TEST_KEEP_ACCOUNT_MIGRATED = true; 98 private static final boolean TEST_SKIP_USER_SETUP = true; 99 private static final long TEST_PROVISIONING_ID = 1000L; 100 private static final Account TEST_ACCOUNT_TO_MIGRATE = 101 new Account("user@gmail.com", "com.google"); 102 private static final String TEST_SHARED_PREFERENCE = "ExtrasProvisioningDataParserTest"; 103 private static final String TEST_DEVICE_ADMIN_PACKAGE_LABEL = "TestPackage"; 104 private static final String TEST_ORGANIZATION_NAME = "TestOrganizationName"; 105 private static final String TEST_SUPPORT_URL = "https://www.support.url/"; 106 private static final String TEST_ILL_FORMED_LOCALE = "aaa_"; 107 108 // Wifi info 109 private static final String TEST_SSID = "TestWifi"; 110 private static final boolean TEST_HIDDEN = true; 111 private static final String TEST_SECURITY_TYPE = "WPA2"; 112 private static final String TEST_PASSWORD = "GoogleRock"; 113 private static final String TEST_PROXY_HOST = "testhost.com"; 114 private static final int TEST_PROXY_PORT = 7689; 115 private static final String TEST_PROXY_BYPASS_HOSTS = "http://host1.com;https://host2.com"; 116 private static final String TEST_PAC_URL = "pac.test.com"; 117 private static final WifiInfo TEST_WIFI_INFO = WifiInfo.Builder.builder() 118 .setSsid(TEST_SSID) 119 .setHidden(TEST_HIDDEN) 120 .setSecurityType(TEST_SECURITY_TYPE) 121 .setPassword(TEST_PASSWORD) 122 .setProxyHost(TEST_PROXY_HOST) 123 .setProxyPort(TEST_PROXY_PORT) 124 .setProxyBypassHosts(TEST_PROXY_BYPASS_HOSTS) 125 .setPacUrl(TEST_PAC_URL) 126 .build(); 127 128 // Device admin package download info 129 private static final String TEST_DOWNLOAD_LOCATION = 130 "http://example/dpc.apk"; 131 private static final String TEST_COOKIE_HEADER = 132 "Set-Cookie: sessionToken=foobar; Expires=Thu, 18 Feb 2016 23:59:59 GMT"; 133 private static final byte[] TEST_PACKAGE_CHECKSUM = new byte[] { '1', '2', '3', '4', '5' }; 134 private static final byte[] TEST_SIGNATURE_CHECKSUM = new byte[] { '5', '4', '3', '2', '1' }; 135 private static final int TEST_MIN_SUPPORT_VERSION = 17689; 136 private static final PackageDownloadInfo TEST_DOWNLOAD_INFO = 137 PackageDownloadInfo.Builder.builder() 138 .setLocation(TEST_DOWNLOAD_LOCATION) 139 .setCookieHeader(TEST_COOKIE_HEADER) 140 .setPackageChecksum(TEST_PACKAGE_CHECKSUM) 141 .setSignatureChecksum(TEST_SIGNATURE_CHECKSUM) 142 .setMinVersion(TEST_MIN_SUPPORT_VERSION) 143 .build(); 144 @Mock 145 private Context mContext; 146 147 @Mock 148 private DevicePolicyManager mDpm; 149 150 @Mock 151 private ManagedProvisioningSharedPreferences mSharedPreferences; 152 153 private ExtrasProvisioningDataParser mExtrasProvisioningDataParser; 154 155 private Utils mUtils; 156 157 @Override setUp()158 public void setUp() { 159 // this is necessary for mockito to work 160 System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString()); 161 162 MockitoAnnotations.initMocks(this); 163 when(mContext.getSystemServiceName(DevicePolicyManager.class)) 164 .thenReturn(Context.DEVICE_POLICY_SERVICE); 165 when(mContext.getSystemService(Context.DEVICE_POLICY_SERVICE)).thenReturn(mDpm); 166 when(mSharedPreferences.incrementAndGetProvisioningId()).thenReturn(TEST_PROVISIONING_ID); 167 mUtils = spy(new Utils()); 168 mExtrasProvisioningDataParser = new ExtrasProvisioningDataParser(mContext, mUtils, 169 mSharedPreferences); 170 } 171 testParse_trustedSourceProvisioningIntent()172 public void testParse_trustedSourceProvisioningIntent() throws Exception { 173 // GIVEN a ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE intent and other extras. 174 Intent intent = new Intent(ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE) 175 // GIVEN a device admin package name and component name 176 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME) 177 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME) 178 .putExtras(getTestTimeTimeZoneAndLocaleExtras()) 179 .putExtras(getTestWifiInfoExtras()) 180 .putExtras(getTestDeviceAdminDownloadExtras()) 181 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras()) 182 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION) 183 .putExtra(EXTRA_PROVISIONING_SKIP_USER_CONSENT, TEST_SKIP_USER_CONSENT) 184 .putExtra(EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, TEST_KEEP_ACCOUNT_MIGRATED) 185 .putExtra(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED, 186 TEST_LEAVE_ALL_SYSTEM_APP_ENABLED) 187 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR) 188 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE) 189 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_LABEL, 190 TEST_DEVICE_ADMIN_PACKAGE_LABEL) 191 .putExtra(EXTRA_PROVISIONING_ORGANIZATION_NAME, TEST_ORGANIZATION_NAME) 192 .putExtra(EXTRA_PROVISIONING_SUPPORT_URL, TEST_SUPPORT_URL); 193 194 // WHEN the intent is parsed by the parser. 195 ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent); 196 197 // THEN ProvisionParams is constructed as expected. 198 assertEquals( 199 ProvisioningParams.Builder.builder() 200 // THEN ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE is translated to 201 // ACTION_PROVISION_MANAGED_DEVICE 202 .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE) 203 .setDeviceAdminComponentName(TEST_COMPONENT_NAME) 204 .setDeviceAdminDownloadInfo(TEST_DOWNLOAD_INFO) 205 .setProvisioningId(TEST_PROVISIONING_ID) 206 .setLocalTime(TEST_LOCAL_TIME) 207 .setLocale(TEST_LOCALE) 208 .setTimeZone(TEST_TIME_ZONE) 209 // THEN customizable color is not supported. 210 .setMainColor(ProvisioningParams.DEFAULT_MAIN_COLOR) 211 // THEN the trusted source is set to true. 212 .setStartedByTrustedSource(true) 213 .setSkipEncryption(TEST_SKIP_ENCRYPTION) 214 // THEN skipping user consent flag is ignored 215 .setSkipUserConsent(false) 216 // THEN keep account migrated flag is ignored 217 .setKeepAccountMigrated(false) 218 .setLeaveAllSystemAppsEnabled(true) 219 .setWifiInfo(TEST_WIFI_INFO) 220 .setAdminExtrasBundle(createTestAdminExtras()) 221 .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE) 222 .setDeviceAdminLabel(TEST_DEVICE_ADMIN_PACKAGE_LABEL) 223 .setOrganizationName(TEST_ORGANIZATION_NAME) 224 .setSupportUrl(TEST_SUPPORT_URL) 225 .build(), 226 params); 227 } 228 testParse_resumeProvisioningIntent()229 public void testParse_resumeProvisioningIntent() throws Exception { 230 // GIVEN a ProvisioningParams stored in an intent 231 ProvisioningParams expected = ProvisioningParams.Builder.builder() 232 .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE) 233 .setDeviceAdminComponentName(TEST_COMPONENT_NAME) 234 .build(); 235 Intent intent = new Intent(Globals.ACTION_RESUME_PROVISIONING) 236 .putExtra(ProvisioningParams.EXTRA_PROVISIONING_PARAMS, expected); 237 // WHEN the intent is parsed by the parser 238 ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent); 239 // THEN we get back the original ProvisioningParams. 240 assertEquals(expected, params); 241 } 242 testParse_managedProfileIntent()243 public void testParse_managedProfileIntent() throws Exception { 244 // GIVEN a managed profile provisioning intent and other extras. 245 Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE) 246 // GIVEN a device admin package name and component name 247 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME) 248 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME) 249 .putExtras(getTestTimeTimeZoneAndLocaleExtras()) 250 .putExtras(getTestWifiInfoExtras()) 251 .putExtras(getTestDeviceAdminDownloadExtras()) 252 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras()) 253 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION) 254 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR) 255 .putExtra(EXTRA_PROVISIONING_SKIP_USER_CONSENT, TEST_SKIP_USER_CONSENT) 256 .putExtra(EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, TEST_KEEP_ACCOUNT_MIGRATED) 257 .putExtra(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED, 258 TEST_LEAVE_ALL_SYSTEM_APP_ENABLED) 259 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE); 260 261 // GIVEN the device admin is installed. 262 doReturn(TEST_COMPONENT_NAME) 263 .when(mUtils) 264 .findDeviceAdmin( 265 TEST_PACKAGE_NAME, TEST_COMPONENT_NAME, mContext, UserHandle.myUserId()); 266 267 // WHEN the intent is parsed by the parser. 268 ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent); 269 270 // THEN ProvisionParams is constructed as expected. 271 assertEquals( 272 ProvisioningParams.Builder.builder() 273 // THEN provisioning action is ACTION_PROVISION_MANAGED_PROFILE 274 .setProvisioningAction(ACTION_PROVISION_MANAGED_PROFILE) 275 .setDeviceAdminComponentName(TEST_COMPONENT_NAME) 276 .setProvisioningId(TEST_PROVISIONING_ID) 277 // THEN device admin package name is not supported. 278 .setDeviceAdminPackageName(null) 279 // THEN device admin download info is not supported. 280 .setDeviceAdminDownloadInfo(null) 281 // THEN wifi info is not supported. 282 .setWifiInfo(null) 283 .setMainColor(TEST_MAIN_COLOR) 284 .setSkipEncryption(TEST_SKIP_ENCRYPTION) 285 // THEN leave all system apps flag is ignored 286 .setLeaveAllSystemAppsEnabled(false) 287 // THEN skipping user consent flag is ignored 288 .setSkipUserConsent(false) 289 .setKeepAccountMigrated(TEST_KEEP_ACCOUNT_MIGRATED) 290 .setAdminExtrasBundle(createTestAdminExtras()) 291 .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE) 292 .build(), 293 params); 294 } 295 testParse_managedProfileIntent_CompProvisioning()296 public void testParse_managedProfileIntent_CompProvisioning() throws Exception { 297 // GIVEN a managed profile provisioning intent and other extras. 298 Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE) 299 // GIVEN a device admin package name and component name 300 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME) 301 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME) 302 .putExtras(getTestTimeTimeZoneAndLocaleExtras()) 303 .putExtras(getTestWifiInfoExtras()) 304 .putExtras(getTestDeviceAdminDownloadExtras()) 305 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras()) 306 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION) 307 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR) 308 .putExtra(EXTRA_PROVISIONING_SKIP_USER_CONSENT, TEST_SKIP_USER_CONSENT) 309 .putExtra(EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, TEST_KEEP_ACCOUNT_MIGRATED) 310 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE); 311 312 // GIVEN the device admin is installed. 313 doReturn(TEST_COMPONENT_NAME) 314 .when(mUtils) 315 .findDeviceAdmin( 316 TEST_PACKAGE_NAME, TEST_COMPONENT_NAME, mContext, UserHandle.myUserId()); 317 318 // GIVEN the device admin is also device owner in primary user. 319 when(mDpm.getDeviceOwnerComponentOnCallingUser()).thenReturn(TEST_COMPONENT_NAME); 320 321 // WHEN the intent is parsed by the parser. 322 ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent); 323 324 // THEN ProvisionParams is constructed as expected. 325 assertEquals( 326 ProvisioningParams.Builder.builder() 327 // THEN provisioning action is ACTION_PROVISION_MANAGED_PROFILE 328 .setProvisioningAction(ACTION_PROVISION_MANAGED_PROFILE) 329 .setDeviceAdminComponentName(TEST_COMPONENT_NAME) 330 .setProvisioningId(TEST_PROVISIONING_ID) 331 // THEN device admin package name is not supported. 332 .setDeviceAdminPackageName(null) 333 // THEN device admin download info is not supported. 334 .setDeviceAdminDownloadInfo(null) 335 // THEN wifi info is not supported. 336 .setWifiInfo(null) 337 .setMainColor(TEST_MAIN_COLOR) 338 .setSkipEncryption(TEST_SKIP_ENCRYPTION) 339 .setSkipUserConsent(TEST_SKIP_USER_CONSENT) 340 .setKeepAccountMigrated(TEST_KEEP_ACCOUNT_MIGRATED) 341 .setAdminExtrasBundle(createTestAdminExtras()) 342 .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE) 343 .build(), 344 params); 345 } 346 testParse_managedProfileIntent_DeviceOwnerWithByodProvisioning()347 public void testParse_managedProfileIntent_DeviceOwnerWithByodProvisioning() throws Exception { 348 // GIVEN a managed profile provisioning intent and other extras. 349 Intent intent = new Intent(ACTION_PROVISION_MANAGED_PROFILE) 350 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME) 351 .putExtra(EXTRA_PROVISIONING_SKIP_USER_CONSENT, TEST_SKIP_USER_CONSENT) 352 .putExtra(EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, TEST_KEEP_ACCOUNT_MIGRATED); 353 354 // GIVEN the device admin is installed. 355 doReturn(TEST_COMPONENT_NAME) 356 .when(mUtils) 357 .findDeviceAdmin(null, TEST_COMPONENT_NAME, mContext, UserHandle.myUserId()); 358 359 // GIVEN a different device admin is a device owner in primary user. 360 when(mDpm.getDeviceOwnerComponentOnCallingUser()).thenReturn(TEST_COMPONENT_NAME_2); 361 362 // WHEN the intent is parsed by the parser. 363 ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent); 364 365 // THEN ProvisionParams is constructed as expected. 366 assertEquals( 367 ProvisioningParams.Builder.builder() 368 .setProvisioningAction(ACTION_PROVISION_MANAGED_PROFILE) 369 .setDeviceAdminComponentName(TEST_COMPONENT_NAME) 370 .setProvisioningId(TEST_PROVISIONING_ID) 371 // THEN skipping user consent flag is ignored 372 .setSkipUserConsent(false) 373 .setKeepAccountMigrated(TEST_KEEP_ACCOUNT_MIGRATED) 374 .build(), 375 params); 376 } 377 testParse_managedUserIntent()378 public void testParse_managedUserIntent() throws Exception { 379 // GIVEN a managed user provisioning intent and other extras. 380 Intent intent = new Intent(ACTION_PROVISION_MANAGED_USER) 381 // GIVEN a device admin package name and component name 382 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME) 383 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME) 384 .putExtras(getTestTimeTimeZoneAndLocaleExtras()) 385 .putExtras(getTestWifiInfoExtras()) 386 .putExtras(getTestDeviceAdminDownloadExtras()) 387 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras()) 388 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION) 389 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR) 390 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE); 391 392 // WHEN the intent is parsed by the parser. 393 ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent); 394 395 // THEN ProvisionParams is constructed as expected. 396 assertEquals( 397 ProvisioningParams.Builder.builder() 398 // THEN provisioning action is ACTION_PROVISION_MANAGED_USER 399 .setProvisioningAction(ACTION_PROVISION_MANAGED_USER) 400 .setDeviceAdminComponentName(TEST_COMPONENT_NAME) 401 .setProvisioningId(TEST_PROVISIONING_ID) 402 // THEN device admin package name is not supported in Managed User 403 // provisioning. 404 .setDeviceAdminPackageName(null) 405 // THEN device admin download info is not supported. 406 .setDeviceAdminDownloadInfo(null) 407 // THEN wifi info is not supported. 408 .setWifiInfo(null) 409 .setMainColor(TEST_MAIN_COLOR) 410 .setSkipEncryption(TEST_SKIP_ENCRYPTION) 411 .setAdminExtrasBundle(createTestAdminExtras()) 412 .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE) 413 .build(), 414 params); 415 } 416 testParse_managedDeviceIntent()417 public void testParse_managedDeviceIntent() throws Exception { 418 // GIVEN a managed device provisioning intent and other extras. 419 Intent intent = new Intent(ACTION_PROVISION_MANAGED_DEVICE) 420 // GIVEN a device admin package name and component name 421 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME) 422 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME) 423 .putExtras(getTestTimeTimeZoneAndLocaleExtras()) 424 .putExtras(getTestWifiInfoExtras()) 425 .putExtras(getTestDeviceAdminDownloadExtras()) 426 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras()) 427 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION) 428 .putExtra(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED, 429 TEST_LEAVE_ALL_SYSTEM_APP_ENABLED) 430 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR) 431 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE); 432 433 // WHEN the intent is parsed by the parser. 434 ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent); 435 436 // THEN ProvisionParams is constructed as expected. 437 assertEquals( 438 ProvisioningParams.Builder.builder() 439 // THEN provisioning action is ACTION_PROVISION_MANAGED_DEVICE 440 .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE) 441 .setDeviceAdminComponentName(TEST_COMPONENT_NAME) 442 .setProvisioningId(TEST_PROVISIONING_ID) 443 // THEN device admin package name is not supported in Device Owner 444 // provisioning. 445 .setDeviceAdminPackageName(null) 446 // THEN Device Admin download info is not supported. 447 .setDeviceAdminDownloadInfo(null) 448 // THEN time, time zone and locale are not supported. 449 .setMainColor(TEST_MAIN_COLOR) 450 .setSkipEncryption(TEST_SKIP_ENCRYPTION) 451 .setLeaveAllSystemAppsEnabled(true) 452 // THEN wifi configuration is not supported. 453 .setWifiInfo(null) 454 .setAdminExtrasBundle(createTestAdminExtras()) 455 .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE) 456 .build(), 457 params); 458 } 459 testParse_managedSharableDeviceIntent()460 public void testParse_managedSharableDeviceIntent() throws Exception { 461 // GIVEN a managed device provisioning intent and other extras. 462 Intent intent = new Intent(ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE) 463 // GIVEN a device admin package name and component name 464 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME) 465 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME) 466 .putExtras(getTestTimeTimeZoneAndLocaleExtras()) 467 .putExtras(getTestWifiInfoExtras()) 468 .putExtras(getTestDeviceAdminDownloadExtras()) 469 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras()) 470 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION) 471 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR) 472 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE); 473 474 // WHEN the intent is parsed by the parser. 475 ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent); 476 477 // THEN ProvisionParams is constructed as expected. 478 assertEquals( 479 ProvisioningParams.Builder.builder() 480 // THEN provisioning action is ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE 481 .setProvisioningAction(ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE) 482 .setDeviceAdminComponentName(TEST_COMPONENT_NAME) 483 .setProvisioningId(TEST_PROVISIONING_ID) 484 // THEN device admin package name is not supported in Device Owner 485 // provisioning. 486 .setDeviceAdminPackageName(null) 487 // THEN Device Admin download info is not supported. 488 .setDeviceAdminDownloadInfo(null) 489 // THEN time, time zone and locale are not supported. 490 .setMainColor(TEST_MAIN_COLOR) 491 .setSkipEncryption(TEST_SKIP_ENCRYPTION) 492 // THEN wifi configuration is not supported. 493 .setWifiInfo(null) 494 .setAdminExtrasBundle(createTestAdminExtras()) 495 .setAccountToMigrate(TEST_ACCOUNT_TO_MIGRATE) 496 .build(), 497 params); 498 } 499 testParse_nfcProvisioningIntentThrowsException()500 public void testParse_nfcProvisioningIntentThrowsException() { 501 // GIVEN a NFC provisioning intent and other extras. 502 Intent intent = new Intent(ACTION_NDEF_DISCOVERED) 503 // GIVEN a device admin package name and component name 504 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME) 505 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME) 506 .putExtras(getTestTimeTimeZoneAndLocaleExtras()) 507 .putExtras(getTestWifiInfoExtras()) 508 .putExtras(getTestDeviceAdminDownloadExtras()) 509 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras()) 510 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION) 511 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR) 512 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE); 513 514 try { 515 // WHEN the intent is parsed by the parser. 516 ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent); 517 fail("ExtrasProvisioningDataParser doesn't support NFC intent. " 518 + "IllegalProvisioningArgumentException should be thrown"); 519 } catch (IllegalProvisioningArgumentException e) { 520 // THEN IllegalProvisioningArgumentException is thrown. 521 } 522 } 523 testParse_illFormedLocaleThrowsException()524 public void testParse_illFormedLocaleThrowsException() throws Exception { 525 // GIVEN a managed device provisioning intent and other extras. 526 Intent intent = new Intent(ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE) 527 // GIVEN a device admin package name and component name 528 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME) 529 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME) 530 // GIVEN a ill formed locale string. 531 .putExtras(getTestTimeTimeZoneAndLocaleExtras(TEST_ILL_FORMED_LOCALE)) 532 .putExtras(getTestWifiInfoExtras()) 533 .putExtras(getTestDeviceAdminDownloadExtras()) 534 .putExtra(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, createTestAdminExtras()) 535 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION) 536 .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR) 537 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE); 538 539 try { 540 // WHEN the intent is parsed by the parser. 541 ProvisioningParams params = mExtrasProvisioningDataParser.parse(intent); 542 fail("ExtrasProvisioningDataParser parsing an ill formed locale string. " 543 + "IllegalProvisioningArgumentException should be thrown"); 544 } catch (IllegalProvisioningArgumentException e) { 545 // THEN IllegalProvisioningArgumentException is thrown. 546 } 547 } 548 getTestWifiInfoExtras()549 private static Bundle getTestWifiInfoExtras() { 550 Bundle wifiInfoExtras = new Bundle(); 551 wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_SSID, TEST_SSID); 552 wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_SECURITY_TYPE, TEST_SECURITY_TYPE); 553 wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_PASSWORD, TEST_PASSWORD); 554 wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_PROXY_HOST, TEST_PROXY_HOST); 555 wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_PROXY_BYPASS, TEST_PROXY_BYPASS_HOSTS); 556 wifiInfoExtras.putString(EXTRA_PROVISIONING_WIFI_PAC_URL, TEST_PAC_URL); 557 wifiInfoExtras.putInt(EXTRA_PROVISIONING_WIFI_PROXY_PORT, TEST_PROXY_PORT); 558 wifiInfoExtras.putBoolean(EXTRA_PROVISIONING_WIFI_HIDDEN, TEST_HIDDEN); 559 return wifiInfoExtras; 560 } 561 getTestTimeTimeZoneAndLocaleExtras()562 private static Bundle getTestTimeTimeZoneAndLocaleExtras() { 563 return getTestTimeTimeZoneAndLocaleExtrasInternal(StoreUtils.localeToString(TEST_LOCALE)); 564 } 565 getTestTimeTimeZoneAndLocaleExtras(String locale)566 private static Bundle getTestTimeTimeZoneAndLocaleExtras(String locale) { 567 return getTestTimeTimeZoneAndLocaleExtrasInternal(locale); 568 } 569 getTestTimeTimeZoneAndLocaleExtrasInternal(String locale)570 private static Bundle getTestTimeTimeZoneAndLocaleExtrasInternal(String locale){ 571 Bundle timeTimezoneAndLocaleExtras = new Bundle(); 572 timeTimezoneAndLocaleExtras.putLong(EXTRA_PROVISIONING_LOCAL_TIME, TEST_LOCAL_TIME); 573 timeTimezoneAndLocaleExtras.putString(EXTRA_PROVISIONING_TIME_ZONE, TEST_TIME_ZONE); 574 timeTimezoneAndLocaleExtras.putString(EXTRA_PROVISIONING_LOCALE, locale); 575 return timeTimezoneAndLocaleExtras; 576 } 577 getTestDeviceAdminDownloadExtras()578 private static Bundle getTestDeviceAdminDownloadExtras() { 579 Bundle downloadInfoExtras = new Bundle(); 580 downloadInfoExtras.putInt( 581 EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE, TEST_MIN_SUPPORT_VERSION); 582 downloadInfoExtras.putString( 583 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, TEST_DOWNLOAD_LOCATION); 584 downloadInfoExtras.putString( 585 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER, TEST_COOKIE_HEADER); 586 downloadInfoExtras.putString( 587 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, 588 Base64.encodeToString(TEST_PACKAGE_CHECKSUM, 589 Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP)); 590 downloadInfoExtras.putString( 591 EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM, 592 Base64.encodeToString(TEST_SIGNATURE_CHECKSUM, 593 Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP)); 594 return downloadInfoExtras; 595 } 596 } 597