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