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.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_DEVICE_ADMIN_MINIMUM_VERSION_CODE; 23 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM; 24 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER; 25 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION; 26 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME; 27 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM; 28 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DISCLAIMERS; 29 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DISCLAIMER_CONTENT; 30 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DISCLAIMER_HEADER; 31 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION; 32 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED; 33 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCALE; 34 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCAL_TIME; 35 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI; 36 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ORGANIZATION_NAME; 37 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_RETURN_BEFORE_POLICY_COMPLIANCE; 38 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT; 39 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION; 40 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SUPPORT_URL; 41 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_TIME_ZONE; 42 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_USE_MOBILE_DATA; 43 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_ANONYMOUS_IDENTITY; 44 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_CA_CERTIFICATE; 45 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_DOMAIN; 46 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_EAP_METHOD; 47 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_HIDDEN; 48 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_IDENTITY; 49 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PAC_URL; 50 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PASSWORD; 51 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PHASE2_AUTH; 52 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_BYPASS; 53 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_HOST; 54 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_PORT; 55 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SECURITY_TYPE; 56 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SSID; 57 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_USER_CERTIFICATE; 58 import static android.app.admin.DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC; 59 60 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE_SHORT; 61 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE_SHORT; 62 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME_SHORT; 63 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE_SHORT; 64 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM_SHORT; 65 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER_SHORT; 66 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION_SHORT; 67 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME_SHORT; 68 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM_SHORT; 69 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_DISCLAIMERS_SHORT; 70 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_DISCLAIMER_CONTENT_SHORT; 71 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_DISCLAIMER_HEADER_SHORT; 72 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION_SHORT; 73 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED_SHORT; 74 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_LOCALE_SHORT; 75 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_LOCAL_TIME_SHORT; 76 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_LOGO_URI_SHORT; 77 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_ORGANIZATION_NAME_SHORT; 78 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT_SHORT; 79 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_SKIP_ENCRYPTION_SHORT; 80 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_SUPPORT_URL_SHORT; 81 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_TIME_ZONE_SHORT; 82 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_USE_MOBILE_DATA_SHORT; 83 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_ANONYMOUS_IDENTITY_SHORT; 84 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_CA_CERTIFICATE_SHORT; 85 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_DOMAIN_SHORT; 86 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_EAP_METHOD_SHORT; 87 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_HIDDEN_SHORT; 88 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_IDENTITY_SHORT; 89 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_PAC_URL_SHORT; 90 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_PASSWORD_SHORT; 91 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_PHASE2_AUTH_SHORT; 92 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_PROXY_BYPASS_SHORT; 93 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_PROXY_HOST_SHORT; 94 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_PROXY_PORT_SHORT; 95 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_SECURITY_TYPE_SHORT; 96 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_SSID_SHORT; 97 import static com.android.managedprovisioning.parser.ExtrasProvisioningDataParser.EXTRA_PROVISIONING_WIFI_USER_CERTIFICATE_SHORT; 98 99 import static com.google.common.truth.Truth.assertThat; 100 101 import static org.mockito.Mockito.when; 102 103 import android.app.admin.DevicePolicyManager; 104 import android.content.ComponentName; 105 import android.content.Context; 106 import android.content.Intent; 107 import android.net.Uri; 108 import android.nfc.NdefMessage; 109 import android.nfc.NdefRecord; 110 import android.nfc.NfcAdapter; 111 import android.os.Bundle; 112 import android.os.Parcelable; 113 import android.os.PersistableBundle; 114 import android.test.AndroidTestCase; 115 import android.util.Base64; 116 117 import androidx.test.filters.SmallTest; 118 119 import com.android.managedprovisioning.common.IllegalProvisioningArgumentException; 120 import com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences; 121 import com.android.managedprovisioning.common.SettingsFacade; 122 import com.android.managedprovisioning.common.StoreUtils; 123 import com.android.managedprovisioning.model.PackageDownloadInfo; 124 import com.android.managedprovisioning.model.ProvisioningParams; 125 import com.android.managedprovisioning.model.WifiInfo; 126 127 import org.mockito.Mock; 128 import org.mockito.MockitoAnnotations; 129 130 import java.io.ByteArrayOutputStream; 131 import java.io.IOException; 132 import java.util.Locale; 133 import java.util.Properties; 134 135 /** Tests for {@link PropertiesProvisioningDataParser} */ 136 @SmallTest 137 public class PropertiesProvisioningDataParserTest extends AndroidTestCase { 138 private static final String TEST_PACKAGE_NAME = "com.afwsamples.testdpc"; 139 private static final ComponentName TEST_COMPONENT_NAME = 140 ComponentName.unflattenFromString( 141 "com.afwsamples.testdpc/com.afwsamples.testdpc.DeviceAdminReceiver"); 142 private static final long TEST_LOCAL_TIME = 1456939524713L; 143 private static final Locale TEST_LOCALE = Locale.UK; 144 private static final String TEST_TIME_ZONE = "GMT"; 145 private static final String TEST_LEAVE_ALL_SYSTEM_APP_ENABLED = "true"; 146 private static final boolean TEST_SKIP_ENCRYPTION = true; 147 private static final boolean TEST_USE_MOBILE_DATA = false; 148 private static final long TEST_PROVISIONING_ID = 2000L; 149 private static final String TEST_ACCOUNT_TO_MIGRATE ="user@gmail.com"; 150 private static final String INVALID_MIME_TYPE = "invalid-mime-type"; 151 152 // Wifi info 153 private static final String TEST_SSID = "TestWifi"; 154 private static final boolean TEST_HIDDEN = true; 155 private static final String TEST_SECURITY_TYPE = "WPA2"; 156 private static final String TEST_SECURITY_TYPE_EAP = "EAP"; 157 private static final String TEST_PASSWORD = "GoogleRock"; 158 private static final String TEST_EAP_METHOD = "TTLS"; 159 private static final String TEST_PHASE2_AUTH = "PAP"; 160 private static final String TEST_CA_CERT = "caCertificate"; 161 private static final String TEST_USER_CERT = "userCertificate"; 162 private static final String TEST_IDENTITY = "TestUser"; 163 private static final String TEST_ANONYMOUS_IDENTITY = "TestAUser"; 164 private static final String TEST_DOMAIN = "google.com"; 165 private static final String TEST_PROXY_HOST = "testhost.com"; 166 private static final int TEST_PROXY_PORT = 7689; 167 private static final String TEST_PROXY_BYPASS_HOSTS = "http://host1.com;https://host2.com"; 168 private static final String TEST_PAC_URL = "pac.test.com"; 169 private static final WifiInfo TEST_WIFI_INFO = WifiInfo.Builder.builder() 170 .setSsid(TEST_SSID) 171 .setHidden(TEST_HIDDEN) 172 .setSecurityType(TEST_SECURITY_TYPE) 173 .setPassword(TEST_PASSWORD) 174 .setProxyHost(TEST_PROXY_HOST) 175 .setProxyPort(TEST_PROXY_PORT) 176 .setProxyBypassHosts(TEST_PROXY_BYPASS_HOSTS) 177 .setPacUrl(TEST_PAC_URL) 178 .build(); 179 180 // Device admin package download info 181 private static final String TEST_DOWNLOAD_LOCATION = 182 "http://example/dpc.apk"; 183 private static final String TEST_COOKIE_HEADER = 184 "Set-Cookie: sessionToken=foobar; Expires=Thu, 18 Feb 2016 23:59:59 GMT"; 185 private static final byte[] TEST_PACKAGE_CHECKSUM = new byte[] { '1', '2', '3', '4', '5' }; 186 private static final byte[] TEST_SIGNATURE_CHECKSUM = new byte[] { '5', '4', '3', '2', '1' }; 187 private static final int TEST_MIN_SUPPORT_VERSION = 17689; 188 private static final PackageDownloadInfo TEST_DOWNLOAD_INFO = 189 PackageDownloadInfo.Builder.builder() 190 .setLocation(TEST_DOWNLOAD_LOCATION) 191 .setCookieHeader(TEST_COOKIE_HEADER) 192 .setPackageChecksum(TEST_PACKAGE_CHECKSUM) 193 .setSignatureChecksum(TEST_SIGNATURE_CHECKSUM) 194 .setMinVersion(TEST_MIN_SUPPORT_VERSION) 195 .build(); 196 private static final String TEST_KEEP_ACCOUNT_MIGRATED = "true"; 197 private static final String TEST_ORGANIZATION_NAME = "TestOrganizationName"; 198 private static final String TEST_SUPPORT_URL = "https://www.support.url/"; 199 private static final Uri TEST_URI = Uri.parse("https://www.google.com/"); 200 private static final String TEST_URI_STRING = "https://www.google.com/"; 201 private static final String TEST_DISCLAMER_HEADER = "Google"; 202 private static final boolean TEST_OPT_OUT_OF_PERMISSION_CONTROL = true; 203 204 @Mock 205 private Context mContext; 206 207 @Mock 208 private ManagedProvisioningSharedPreferences mSharedPreferences; 209 210 private PropertiesProvisioningDataParser mPropertiesProvisioningDataParser; 211 212 @Override setUp()213 public void setUp() { 214 // this is necessary for mockito to work 215 System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString()); 216 217 MockitoAnnotations.initMocks(this); 218 219 when(mSharedPreferences.incrementAndGetProvisioningId()).thenReturn(TEST_PROVISIONING_ID); 220 mPropertiesProvisioningDataParser = new PropertiesProvisioningDataParser(mContext, 221 new ParserUtils(), new SettingsFacade(), mSharedPreferences); 222 } 223 224 // TODO(alexkershaw): split this huge test into individual tests using 225 // buildNfcProvisioningProperties and buildNfcProvisioningIntent. testParse_nfcProvisioningIntent()226 public void testParse_nfcProvisioningIntent() throws Exception { 227 // GIVEN a NFC provisioning intent with all supported data. 228 Properties props = new Properties(); 229 props.setProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME); 230 props.setProperty( 231 EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, 232 TEST_COMPONENT_NAME.flattenToString()); 233 setTestWifiInfo(props); 234 setTestTimeTimeZoneAndLocale(props); 235 setTestDeviceAdminDownload(props); 236 props.setProperty(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, getTestAdminExtrasString()); 237 props.setProperty( 238 EXTRA_PROVISIONING_SKIP_ENCRYPTION, 239 Boolean.toString(TEST_SKIP_ENCRYPTION)); 240 241 Intent intent = buildNfcProvisioningIntent(props); 242 243 // WHEN the intent is parsed by the parser. 244 ProvisioningParams params = mPropertiesProvisioningDataParser.parse(intent); 245 246 247 // THEN ProvisionParams is constructed as expected. 248 assertThat( 249 ProvisioningParams.Builder.builder() 250 // THEN NFC provisioning is translated to ACTION_PROVISION_MANAGED_DEVICE 251 // action. 252 .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE) 253 .setDeviceAdminComponentName(TEST_COMPONENT_NAME) 254 .setDeviceAdminPackageName(TEST_PACKAGE_NAME) 255 .setProvisioningId(TEST_PROVISIONING_ID) 256 .setDeviceAdminDownloadInfo( 257 PackageDownloadInfo.Builder.builder() 258 .setLocation(TEST_DOWNLOAD_LOCATION) 259 .setCookieHeader(TEST_COOKIE_HEADER) 260 .setPackageChecksum(TEST_PACKAGE_CHECKSUM) 261 .setSignatureChecksum(TEST_SIGNATURE_CHECKSUM) 262 .setMinVersion(TEST_MIN_SUPPORT_VERSION) 263 .build()) 264 .setLocalTime(TEST_LOCAL_TIME) 265 .setLocale(TEST_LOCALE) 266 .setTimeZone(TEST_TIME_ZONE) 267 .setSkipEncryption(TEST_SKIP_ENCRYPTION) 268 .setWifiInfo(TEST_WIFI_INFO) 269 .setAdminExtrasBundle(getTestAdminExtrasPersistableBundle()) 270 .setStartedByTrustedSource(true) 271 .setIsNfc(true) 272 .setIsOrganizationOwnedProvisioning(true) 273 .setReturnBeforePolicyCompliance(true) 274 .build()) 275 .isEqualTo(params); 276 } 277 testParse_shortExtras_sameAsLongExtras()278 public void testParse_shortExtras_sameAsLongExtras() throws Exception { 279 assertThat(mPropertiesProvisioningDataParser.parse(buildIntentWithAllLongExtras())) 280 .isEqualTo(mPropertiesProvisioningDataParser.parse(buildIntentWithAllShortExtras())); 281 } 282 testParse_nfcProvisioningIntent_setUseMobileDataTrue()283 public void testParse_nfcProvisioningIntent_setUseMobileDataTrue() 284 throws Exception { 285 Properties properties = buildNfcProvisioningProperties(); 286 properties.setProperty(EXTRA_PROVISIONING_USE_MOBILE_DATA, Boolean.toString(true)); 287 Intent intent = buildNfcProvisioningIntent(properties); 288 289 assertThat(mPropertiesProvisioningDataParser.parse(intent).useMobileData).isTrue(); 290 } 291 testParse_nfcProvisioningIntent_setUseMobileDataFalse()292 public void testParse_nfcProvisioningIntent_setUseMobileDataFalse() 293 throws Exception { 294 Properties properties = buildNfcProvisioningProperties(); 295 properties.setProperty(EXTRA_PROVISIONING_USE_MOBILE_DATA, Boolean.toString(false)); 296 Intent intent = buildNfcProvisioningIntent(properties); 297 298 assertThat(mPropertiesProvisioningDataParser.parse(intent).useMobileData).isFalse(); 299 } 300 testParse_nfcProvisioningIntent_useMobileDataDefaultsToFalse()301 public void testParse_nfcProvisioningIntent_useMobileDataDefaultsToFalse() throws Exception { 302 Properties properties = buildNfcProvisioningProperties(); 303 properties.remove(EXTRA_PROVISIONING_USE_MOBILE_DATA); 304 Intent intent = buildNfcProvisioningIntent(properties); 305 306 assertThat(mPropertiesProvisioningDataParser.parse(intent).useMobileData).isFalse(); 307 } 308 testParse_nfcProvisioning_wifiWithCertificates()309 public void testParse_nfcProvisioning_wifiWithCertificates() throws Exception { 310 Properties props = new Properties(); 311 props.setProperty( 312 EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, 313 TEST_COMPONENT_NAME.flattenToString()); 314 props.setProperty(EXTRA_PROVISIONING_WIFI_SSID, TEST_SSID); 315 props.setProperty(EXTRA_PROVISIONING_WIFI_HIDDEN, Boolean.toString(TEST_HIDDEN)); 316 props.setProperty(EXTRA_PROVISIONING_WIFI_SECURITY_TYPE, TEST_SECURITY_TYPE_EAP); 317 props.setProperty(EXTRA_PROVISIONING_WIFI_PASSWORD, TEST_PASSWORD); 318 props.setProperty(EXTRA_PROVISIONING_WIFI_EAP_METHOD, TEST_EAP_METHOD); 319 props.setProperty(EXTRA_PROVISIONING_WIFI_PHASE2_AUTH, TEST_PHASE2_AUTH); 320 props.setProperty(EXTRA_PROVISIONING_WIFI_CA_CERTIFICATE, TEST_CA_CERT); 321 props.setProperty(EXTRA_PROVISIONING_WIFI_USER_CERTIFICATE, TEST_USER_CERT); 322 props.setProperty(EXTRA_PROVISIONING_WIFI_IDENTITY, TEST_IDENTITY); 323 props.setProperty(EXTRA_PROVISIONING_WIFI_ANONYMOUS_IDENTITY, TEST_ANONYMOUS_IDENTITY); 324 props.setProperty(EXTRA_PROVISIONING_WIFI_DOMAIN, TEST_DOMAIN); 325 props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_HOST, TEST_PROXY_HOST); 326 props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_PORT, Integer.toString(TEST_PROXY_PORT)); 327 props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_BYPASS, TEST_PROXY_BYPASS_HOSTS); 328 props.setProperty(EXTRA_PROVISIONING_WIFI_PAC_URL, TEST_PAC_URL); 329 Intent intent = buildNfcProvisioningIntent(props); 330 331 ProvisioningParams params = mPropertiesProvisioningDataParser.parse(intent); 332 333 assertThat(params).isEqualTo(createTestProvisioningParamsBuilder() 334 .setDeviceAdminComponentName(TEST_COMPONENT_NAME) 335 .setReturnBeforePolicyCompliance(true) 336 .setWifiInfo(WifiInfo.Builder.builder() 337 .setSsid(TEST_SSID) 338 .setHidden(TEST_HIDDEN) 339 .setSecurityType(TEST_SECURITY_TYPE_EAP) 340 .setPassword(TEST_PASSWORD) 341 .setEapMethod(TEST_EAP_METHOD) 342 .setPhase2Auth(TEST_PHASE2_AUTH) 343 .setCaCertificate(TEST_CA_CERT) 344 .setUserCertificate(TEST_USER_CERT) 345 .setIdentity(TEST_IDENTITY) 346 .setAnonymousIdentity(TEST_ANONYMOUS_IDENTITY) 347 .setDomain(TEST_DOMAIN) 348 .setProxyHost(TEST_PROXY_HOST) 349 .setProxyPort(TEST_PROXY_PORT) 350 .setProxyBypassHosts(TEST_PROXY_BYPASS_HOSTS) 351 .setPacUrl(TEST_PAC_URL) 352 .build()) 353 .build()); 354 } 355 createTestProvisioningParamsBuilder()356 private ProvisioningParams.Builder createTestProvisioningParamsBuilder() { 357 return ProvisioningParams.Builder.builder() 358 .setProvisioningId(TEST_PROVISIONING_ID) 359 .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE) 360 .setStartedByTrustedSource(true) 361 .setIsNfc(true) 362 .setIsOrganizationOwnedProvisioning(true); 363 } 364 testParse_OtherIntentsThrowsException()365 public void testParse_OtherIntentsThrowsException() { 366 // GIVEN a managed device provisioning intent and some extras. 367 Intent intent = new Intent(ACTION_PROVISION_MANAGED_DEVICE) 368 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME) 369 .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME) 370 .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION) 371 .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE); 372 373 try { 374 // WHEN the intent is parsed by the parser. 375 ProvisioningParams params = mPropertiesProvisioningDataParser.parse(intent); 376 fail("PropertiesProvisioningDataParser doesn't support intent other than NFC. " 377 + "IllegalProvisioningArgumentException should be thrown"); 378 } catch (IllegalProvisioningArgumentException e) { 379 // THEN IllegalProvisioningArgumentException is thrown. 380 } 381 } 382 testGetFirstNdefRecord_nullNdefMessages()383 public void testGetFirstNdefRecord_nullNdefMessages() { 384 // GIVEN nfc intent with no ndef messages 385 Intent nfcIntent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED); 386 // WHEN getting first ndef record 387 // THEN it should return null 388 assertThat(PropertiesProvisioningDataParser.getFirstNdefRecord(nfcIntent)).isNull(); 389 } 390 testGetFirstNdefRecord_noNfcMimeType()391 public void testGetFirstNdefRecord_noNfcMimeType() { 392 // GIVEN nfc intent with no ndf message with a record with a valid mime type. 393 ByteArrayOutputStream stream = new ByteArrayOutputStream(); 394 NdefRecord record = NdefRecord.createMime(INVALID_MIME_TYPE, stream.toByteArray()); 395 NdefMessage ndfMsg = new NdefMessage(new NdefRecord[]{record}); 396 Intent nfcIntent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED) 397 .setType(MIME_TYPE_PROVISIONING_NFC) 398 .putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, new NdefMessage[]{ndfMsg}); 399 // WHEN getting first ndef record 400 // THEN it should return null 401 assertThat(PropertiesProvisioningDataParser.getFirstNdefRecord(nfcIntent)).isNull(); 402 } 403 testGetFirstNdefRecord()404 public void testGetFirstNdefRecord() { 405 // GIVEN nfc intent with valid ndf message with a record with mime type nfc. 406 ByteArrayOutputStream stream = new ByteArrayOutputStream(); 407 NdefRecord record = NdefRecord.createMime( 408 DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC, 409 stream.toByteArray()); 410 NdefMessage ndfMsg = new NdefMessage(new NdefRecord[]{record}); 411 Intent nfcIntent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED) 412 .setType(MIME_TYPE_PROVISIONING_NFC) 413 .putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, new NdefMessage[]{ndfMsg}); 414 // WHEN getting first ndef record 415 // THEN valid record should be returned 416 assertThat(PropertiesProvisioningDataParser.getFirstNdefRecord(nfcIntent)) 417 .isEqualTo(record); 418 } 419 testParse_nfcProvisioningWithReturnBeforePolicyComplianceFalse_isTrue()420 public void testParse_nfcProvisioningWithReturnBeforePolicyComplianceFalse_isTrue() 421 throws Exception { 422 Intent intent = buildNfcProvisioningIntent(buildNfcProvisioningProperties()) 423 .putExtra(EXTRA_PROVISIONING_RETURN_BEFORE_POLICY_COMPLIANCE, false); 424 425 ProvisioningParams params = mPropertiesProvisioningDataParser.parse(intent); 426 427 assertThat(params.returnBeforePolicyCompliance).isTrue(); 428 } 429 testParse_nfcProvisioningWithReturnBeforePolicyComplianceTrue_isTrue()430 public void testParse_nfcProvisioningWithReturnBeforePolicyComplianceTrue_isTrue() 431 throws Exception { 432 Intent intent = buildNfcProvisioningIntent(buildNfcProvisioningProperties()) 433 .putExtra(EXTRA_PROVISIONING_RETURN_BEFORE_POLICY_COMPLIANCE, true); 434 435 ProvisioningParams params = mPropertiesProvisioningDataParser.parse(intent); 436 437 assertThat(params.returnBeforePolicyCompliance).isTrue(); 438 } 439 testParse_nfcProvisioningWithReturnBeforePolicyComplianceNotSet_isTrue()440 public void testParse_nfcProvisioningWithReturnBeforePolicyComplianceNotSet_isTrue() 441 throws Exception { 442 Intent intent = buildNfcProvisioningIntent(buildNfcProvisioningProperties()); 443 444 ProvisioningParams params = mPropertiesProvisioningDataParser.parse(intent); 445 446 assertThat(params.returnBeforePolicyCompliance).isTrue(); 447 } 448 buildIntentWithAllShortExtras()449 private Intent buildIntentWithAllShortExtras() throws Exception { 450 Properties propsShort = new Properties(); 451 Bundle bundleShort = new Bundle(); 452 bundleShort.putString( 453 EXTRA_PROVISIONING_DISCLAIMER_HEADER_SHORT, TEST_DISCLAMER_HEADER); 454 bundleShort.putParcelable(EXTRA_PROVISIONING_DISCLAIMER_CONTENT_SHORT, TEST_URI); 455 Parcelable[] parcelablesShort = {bundleShort}; 456 propsShort.setProperty( 457 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME_SHORT, TEST_PACKAGE_NAME); 458 propsShort.setProperty( 459 EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME_SHORT, 460 TEST_COMPONENT_NAME.flattenToString()); 461 setAllShortTestWifiInfo(propsShort); 462 setShortTestTimeTimeZoneAndLocale(propsShort); 463 setShortTestDeviceAdminDownload(propsShort); 464 propsShort.setProperty( 465 EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE_SHORT, getTestAdminExtrasString()); 466 propsShort.setProperty( 467 EXTRA_PROVISIONING_SKIP_ENCRYPTION_SHORT, 468 Boolean.toString(TEST_SKIP_ENCRYPTION)); 469 propsShort.setProperty(EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED_SHORT, 470 TEST_LEAVE_ALL_SYSTEM_APP_ENABLED); 471 propsShort.setProperty( 472 EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE_SHORT, TEST_ACCOUNT_TO_MIGRATE); 473 propsShort.setProperty( 474 EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION_SHORT, 475 TEST_KEEP_ACCOUNT_MIGRATED); 476 propsShort.setProperty( 477 EXTRA_PROVISIONING_ORGANIZATION_NAME_SHORT, TEST_ORGANIZATION_NAME); 478 propsShort.setProperty(EXTRA_PROVISIONING_SUPPORT_URL_SHORT, TEST_SUPPORT_URL); 479 propsShort.setProperty( 480 EXTRA_PROVISIONING_USE_MOBILE_DATA_SHORT, 481 Boolean.toString(TEST_USE_MOBILE_DATA)); 482 propsShort.setProperty(EXTRA_PROVISIONING_LOGO_URI_SHORT, TEST_URI_STRING); 483 propsShort.setProperty(EXTRA_PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT_SHORT, 484 Boolean.toString(TEST_OPT_OUT_OF_PERMISSION_CONTROL)); 485 486 Intent intentShort = buildNfcProvisioningIntent(propsShort); 487 intentShort.putExtra(EXTRA_PROVISIONING_DISCLAIMERS_SHORT, parcelablesShort); 488 return intentShort; 489 } 490 buildIntentWithAllLongExtras()491 private Intent buildIntentWithAllLongExtras() throws Exception { 492 Properties propsLong = new Properties(); 493 Bundle bundleLong = new Bundle(); 494 bundleLong.putString(EXTRA_PROVISIONING_DISCLAIMER_HEADER, TEST_DISCLAMER_HEADER); 495 bundleLong.putParcelable(EXTRA_PROVISIONING_DISCLAIMER_CONTENT, TEST_URI); 496 Parcelable[] parcelablesLong = {bundleLong}; 497 propsLong.setProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME); 498 propsLong.setProperty( 499 EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, 500 TEST_COMPONENT_NAME.flattenToString()); 501 setAllTestWifiInfo(propsLong); 502 setTestTimeTimeZoneAndLocale(propsLong); 503 setTestDeviceAdminDownload(propsLong); 504 propsLong.setProperty(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, getTestAdminExtrasString()); 505 propsLong.setProperty( 506 EXTRA_PROVISIONING_SKIP_ENCRYPTION, 507 Boolean.toString(TEST_SKIP_ENCRYPTION)); 508 propsLong.setProperty( 509 EXTRA_PROVISIONING_LEAVE_ALL_SYSTEM_APPS_ENABLED, 510 TEST_LEAVE_ALL_SYSTEM_APP_ENABLED); 511 propsLong.setProperty(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE); 512 513 propsLong.setProperty( 514 EXTRA_PROVISIONING_KEEP_ACCOUNT_ON_MIGRATION, TEST_KEEP_ACCOUNT_MIGRATED); 515 propsLong.setProperty(EXTRA_PROVISIONING_ORGANIZATION_NAME, TEST_ORGANIZATION_NAME); 516 propsLong.setProperty(EXTRA_PROVISIONING_SUPPORT_URL, TEST_SUPPORT_URL); 517 propsLong.setProperty( 518 EXTRA_PROVISIONING_USE_MOBILE_DATA, Boolean.toString(TEST_USE_MOBILE_DATA)); 519 propsLong.setProperty(EXTRA_PROVISIONING_LOGO_URI, TEST_URI_STRING); 520 propsLong.setProperty(EXTRA_PROVISIONING_SENSORS_PERMISSION_GRANT_OPT_OUT, 521 Boolean.toString(TEST_OPT_OUT_OF_PERMISSION_CONTROL)); 522 523 Intent intentLong = buildNfcProvisioningIntent(propsLong); 524 intentLong.putExtra(EXTRA_PROVISIONING_DISCLAIMERS, parcelablesLong); 525 return intentLong; 526 } 527 setTestWifiInfo(Properties props)528 private static Properties setTestWifiInfo(Properties props) { 529 props.setProperty(EXTRA_PROVISIONING_WIFI_SSID, TEST_SSID); 530 props.setProperty(EXTRA_PROVISIONING_WIFI_SECURITY_TYPE, TEST_SECURITY_TYPE); 531 props.setProperty(EXTRA_PROVISIONING_WIFI_PASSWORD, TEST_PASSWORD); 532 props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_HOST, TEST_PROXY_HOST); 533 props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_BYPASS, TEST_PROXY_BYPASS_HOSTS); 534 props.setProperty(EXTRA_PROVISIONING_WIFI_PAC_URL, TEST_PAC_URL); 535 props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_PORT, Integer.toString(TEST_PROXY_PORT)); 536 props.setProperty(EXTRA_PROVISIONING_WIFI_HIDDEN, Boolean.toString(TEST_HIDDEN)); 537 return props; 538 } 539 setAllTestWifiInfo(Properties props)540 private static Properties setAllTestWifiInfo(Properties props) { 541 props.setProperty(EXTRA_PROVISIONING_WIFI_SSID, TEST_SSID); 542 props.setProperty(EXTRA_PROVISIONING_WIFI_SECURITY_TYPE, TEST_SECURITY_TYPE); 543 props.setProperty(EXTRA_PROVISIONING_WIFI_PASSWORD, TEST_PASSWORD); 544 props.setProperty(EXTRA_PROVISIONING_WIFI_EAP_METHOD, TEST_EAP_METHOD); 545 props.setProperty(EXTRA_PROVISIONING_WIFI_PHASE2_AUTH, TEST_PHASE2_AUTH); 546 props.setProperty(EXTRA_PROVISIONING_WIFI_CA_CERTIFICATE, TEST_CA_CERT); 547 props.setProperty(EXTRA_PROVISIONING_WIFI_USER_CERTIFICATE, TEST_USER_CERT); 548 props.setProperty(EXTRA_PROVISIONING_WIFI_IDENTITY, TEST_IDENTITY); 549 props.setProperty( 550 EXTRA_PROVISIONING_WIFI_ANONYMOUS_IDENTITY, TEST_ANONYMOUS_IDENTITY); 551 props.setProperty(EXTRA_PROVISIONING_WIFI_DOMAIN, TEST_DOMAIN); 552 props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_HOST, TEST_PROXY_HOST); 553 props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_BYPASS, TEST_PROXY_BYPASS_HOSTS); 554 props.setProperty(EXTRA_PROVISIONING_WIFI_PAC_URL, TEST_PAC_URL); 555 props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_PORT, Integer.toString(TEST_PROXY_PORT)); 556 props.setProperty(EXTRA_PROVISIONING_WIFI_HIDDEN, Boolean.toString(TEST_HIDDEN)); 557 return props; 558 } 559 setAllShortTestWifiInfo(Properties props)560 private static Properties setAllShortTestWifiInfo(Properties props) { 561 props.setProperty( 562 EXTRA_PROVISIONING_WIFI_SSID_SHORT, TEST_SSID); 563 props.setProperty( 564 EXTRA_PROVISIONING_WIFI_SECURITY_TYPE_SHORT, TEST_SECURITY_TYPE); 565 props.setProperty( 566 EXTRA_PROVISIONING_WIFI_PASSWORD_SHORT, TEST_PASSWORD); 567 props.setProperty(EXTRA_PROVISIONING_WIFI_EAP_METHOD_SHORT, TEST_EAP_METHOD); 568 props.setProperty(EXTRA_PROVISIONING_WIFI_PHASE2_AUTH_SHORT, TEST_PHASE2_AUTH); 569 props.setProperty(EXTRA_PROVISIONING_WIFI_CA_CERTIFICATE_SHORT, TEST_CA_CERT); 570 props.setProperty(EXTRA_PROVISIONING_WIFI_USER_CERTIFICATE_SHORT, TEST_USER_CERT); 571 props.setProperty(EXTRA_PROVISIONING_WIFI_IDENTITY_SHORT, TEST_IDENTITY); 572 props.setProperty( 573 EXTRA_PROVISIONING_WIFI_ANONYMOUS_IDENTITY_SHORT, TEST_ANONYMOUS_IDENTITY); 574 props.setProperty(EXTRA_PROVISIONING_WIFI_DOMAIN_SHORT, TEST_DOMAIN); 575 576 props.setProperty( 577 EXTRA_PROVISIONING_WIFI_PROXY_HOST_SHORT, TEST_PROXY_HOST); 578 props.setProperty( 579 EXTRA_PROVISIONING_WIFI_PROXY_BYPASS_SHORT, TEST_PROXY_BYPASS_HOSTS); 580 props.setProperty( 581 EXTRA_PROVISIONING_WIFI_PAC_URL_SHORT, TEST_PAC_URL); 582 props.setProperty( 583 EXTRA_PROVISIONING_WIFI_PROXY_PORT_SHORT, 584 Integer.toString(TEST_PROXY_PORT)); 585 props.setProperty( 586 EXTRA_PROVISIONING_WIFI_HIDDEN_SHORT, Boolean.toString(TEST_HIDDEN)); 587 return props; 588 } 589 setTestTimeTimeZoneAndLocale(Properties props)590 private static Properties setTestTimeTimeZoneAndLocale(Properties props) { 591 props.setProperty(EXTRA_PROVISIONING_LOCAL_TIME, Long.toString(TEST_LOCAL_TIME)); 592 props.setProperty(EXTRA_PROVISIONING_TIME_ZONE, TEST_TIME_ZONE); 593 props.setProperty(EXTRA_PROVISIONING_LOCALE, StoreUtils.localeToString(TEST_LOCALE)); 594 return props; 595 } 596 setShortTestTimeTimeZoneAndLocale(Properties props)597 private static Properties setShortTestTimeTimeZoneAndLocale(Properties props) { 598 props.setProperty( 599 EXTRA_PROVISIONING_LOCAL_TIME_SHORT, Long.toString(TEST_LOCAL_TIME)); 600 props.setProperty( 601 EXTRA_PROVISIONING_TIME_ZONE_SHORT, TEST_TIME_ZONE); 602 props.setProperty( 603 EXTRA_PROVISIONING_LOCALE_SHORT, StoreUtils.localeToString(TEST_LOCALE)); 604 return props; 605 } 606 setTestDeviceAdminDownload(Properties props)607 private static Properties setTestDeviceAdminDownload(Properties props) { 608 props.setProperty( 609 EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE, 610 Integer.toString(TEST_MIN_SUPPORT_VERSION)); 611 props.setProperty( 612 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION, 613 TEST_DOWNLOAD_LOCATION); 614 props.setProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER, 615 TEST_COOKIE_HEADER); 616 props.setProperty( 617 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM, buildTestPackageChecksum()); 618 props.setProperty( 619 EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM, buildTestSignatureChecksum()); 620 return props; 621 } 622 setShortTestDeviceAdminDownload(Properties props)623 private static Properties setShortTestDeviceAdminDownload(Properties props) { 624 props.setProperty( 625 EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE_SHORT, 626 Integer.toString(TEST_MIN_SUPPORT_VERSION)); 627 props.setProperty( 628 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION_SHORT, 629 TEST_DOWNLOAD_LOCATION); 630 props.setProperty( 631 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER_SHORT, 632 TEST_COOKIE_HEADER); 633 props.setProperty( 634 EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM_SHORT, buildTestPackageChecksum()); 635 props.setProperty( 636 EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM_SHORT, 637 buildTestSignatureChecksum()); 638 return props; 639 } 640 getTestAdminExtrasString()641 private static String getTestAdminExtrasString() throws Exception { 642 Properties props = new Properties(); 643 ByteArrayOutputStream stream = new ByteArrayOutputStream(); 644 645 PersistableBundle bundle = getTestAdminExtrasPersistableBundle(); 646 for (String key : bundle.keySet()) { 647 props.setProperty(key, bundle.getString(key)); 648 } 649 props.store(stream, "ADMIN_EXTRAS_BUNDLE" /* data description */); 650 651 return stream.toString(); 652 } 653 getTestAdminExtrasPersistableBundle()654 private static PersistableBundle getTestAdminExtrasPersistableBundle() { 655 PersistableBundle bundle = new PersistableBundle(); 656 bundle.putString("key1", "val1"); 657 bundle.putString("key2", "val2"); 658 bundle.putString("key3", "val3"); 659 return bundle; 660 } 661 buildNfcProvisioningProperties()662 private Properties buildNfcProvisioningProperties() throws Exception { 663 Properties properties = new Properties(); 664 properties.setProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME); 665 properties.setProperty( 666 EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, 667 TEST_COMPONENT_NAME.flattenToString()); 668 setTestWifiInfo(properties); 669 setTestTimeTimeZoneAndLocale(properties); 670 setTestDeviceAdminDownload(properties); 671 properties.setProperty(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, getTestAdminExtrasString()); 672 properties.setProperty( 673 EXTRA_PROVISIONING_SKIP_ENCRYPTION, 674 Boolean.toString(TEST_SKIP_ENCRYPTION)); 675 properties.setProperty( 676 EXTRA_PROVISIONING_USE_MOBILE_DATA, Boolean.toString(TEST_USE_MOBILE_DATA)); 677 return properties; 678 } 679 buildNfcProvisioningIntent(Properties properties)680 private Intent buildNfcProvisioningIntent(Properties properties) throws IOException { 681 NdefMessage[] ndefMessages = new NdefMessage[] { 682 new NdefMessage(new NdefRecord[] { 683 NdefRecord.createMime( 684 DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC, 685 buildNfcProvisioningMimeData(properties)) 686 }) 687 }; 688 return new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED) 689 .setType(MIME_TYPE_PROVISIONING_NFC) 690 .putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, ndefMessages); 691 692 } 693 buildNfcProvisioningMimeData(Properties properties)694 private byte[] buildNfcProvisioningMimeData(Properties properties) 695 throws IOException { 696 ByteArrayOutputStream stream = new ByteArrayOutputStream(); 697 properties.store(stream, /* comments= */ "NFC provisioning intent"); 698 return stream.toByteArray(); 699 } 700 buildTestPackageChecksum()701 private static String buildTestPackageChecksum() { 702 return Base64.encodeToString(TEST_PACKAGE_CHECKSUM, 703 Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP); 704 } 705 buildTestSignatureChecksum()706 private static String buildTestSignatureChecksum() { 707 return Base64.encodeToString(TEST_SIGNATURE_CHECKSUM, 708 Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP); 709 } 710 } 711