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