17079df5a3fb155947004843ee8ec25b36127e3edSteven Ng/*
27079df5a3fb155947004843ee8ec25b36127e3edSteven Ng * Copyright 2016, The Android Open Source Project
37079df5a3fb155947004843ee8ec25b36127e3edSteven Ng *
47079df5a3fb155947004843ee8ec25b36127e3edSteven Ng * Licensed under the Apache License, Version 2.0 (the "License");
57079df5a3fb155947004843ee8ec25b36127e3edSteven Ng * you may not use this file except in compliance with the License.
67079df5a3fb155947004843ee8ec25b36127e3edSteven Ng * You may obtain a copy of the License at
77079df5a3fb155947004843ee8ec25b36127e3edSteven Ng *
87079df5a3fb155947004843ee8ec25b36127e3edSteven Ng *     http://www.apache.org/licenses/LICENSE-2.0
97079df5a3fb155947004843ee8ec25b36127e3edSteven Ng *
107079df5a3fb155947004843ee8ec25b36127e3edSteven Ng * Unless required by applicable law or agreed to in writing, software
117079df5a3fb155947004843ee8ec25b36127e3edSteven Ng * distributed under the License is distributed on an "AS IS" BASIS,
127079df5a3fb155947004843ee8ec25b36127e3edSteven Ng * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137079df5a3fb155947004843ee8ec25b36127e3edSteven Ng * See the License for the specific language governing permissions and
147079df5a3fb155947004843ee8ec25b36127e3edSteven Ng * limitations under the License.
157079df5a3fb155947004843ee8ec25b36127e3edSteven Ng */
167079df5a3fb155947004843ee8ec25b36127e3edSteven Ngpackage com.android.managedprovisioning.parser;
177079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
187079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE;
197079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE;
207079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE;
217079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME;
227079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE;
237079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM;
247079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER;
257079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION;
267079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME;
277079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM;
287079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCALE;
297079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_LOCAL_TIME;
307079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR;
317079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_SKIP_ENCRYPTION;
327079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_TIME_ZONE;
337079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_HIDDEN;
347079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PAC_URL;
357079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PASSWORD;
367079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_BYPASS;
377079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_HOST;
387079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_PROXY_PORT;
397079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SECURITY_TYPE;
407079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_WIFI_SSID;
417079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC;
4290f58ca887207a527c80d7e9ccea97e205c960d4Victor Changimport static org.mockito.Mockito.when;
437079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
447079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.accounts.Account;
457079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.app.admin.DevicePolicyManager;
467079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.content.ComponentName;
477079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.content.Context;
487079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.content.Intent;
497079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.nfc.NdefMessage;
507079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.nfc.NdefRecord;
517079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.nfc.NfcAdapter;
527079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.os.PersistableBundle;
537079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.test.AndroidTestCase;
547079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.test.suitebuilder.annotation.SmallTest;
557079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.util.Base64;
567079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport com.android.managedprovisioning.common.IllegalProvisioningArgumentException;
5790f58ca887207a527c80d7e9ccea97e205c960d4Victor Changimport com.android.managedprovisioning.common.ManagedProvisioningSharedPreferences;
58d2aa11e5484f3e56cea4ac328b2a0a58c28d4047Nicolas Prevotimport com.android.managedprovisioning.common.StoreUtils;
597079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport com.android.managedprovisioning.common.Utils;
607079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport com.android.managedprovisioning.model.PackageDownloadInfo;
617079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport com.android.managedprovisioning.model.ProvisioningParams;
627079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport com.android.managedprovisioning.model.WifiInfo;
637079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport java.io.ByteArrayOutputStream;
647079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport java.util.Locale;
657079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport java.util.Properties;
667079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport org.mockito.Mock;
677079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport org.mockito.MockitoAnnotations;
687079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
697079df5a3fb155947004843ee8ec25b36127e3edSteven Ng/** Tests for {@link PropertiesProvisioningDataParser} */
707079df5a3fb155947004843ee8ec25b36127e3edSteven Ng@SmallTest
717079df5a3fb155947004843ee8ec25b36127e3edSteven Ngpublic class PropertiesProvisioningDataParserTest extends AndroidTestCase {
727079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final String TEST_PACKAGE_NAME = "com.afwsamples.testdpc";
737079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final ComponentName TEST_COMPONENT_NAME =
747079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            ComponentName.unflattenFromString(
757079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                    "com.afwsamples.testdpc/com.afwsamples.testdpc.DeviceAdminReceiver");
767079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final long TEST_LOCAL_TIME = 1456939524713L;
777079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final Locale TEST_LOCALE = Locale.UK;
787079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final String TEST_TIME_ZONE = "GMT";
797079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final Integer TEST_MAIN_COLOR = 65280;
807079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final boolean TEST_STARTED_BY_TRUSTED_SOURCE = true;
817079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final boolean TEST_LEAVE_ALL_SYSTEM_APP_ENABLED = true;
827079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final boolean TEST_SKIP_ENCRYPTION = true;
837079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final boolean TEST_SKIP_USER_SETUP = true;
8490f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    private static final long TEST_PROVISIONING_ID = 2000L;
857079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final Account TEST_ACCOUNT_TO_MIGRATE =
867079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            new Account("user@gmail.com", "com.google");
878a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra    private static final String INVALID_MIME_TYPE = "invalid-mime-type";
887079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
897079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    // Wifi info
907079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final String TEST_SSID = "TestWifi";
917079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final boolean TEST_HIDDEN = true;
927079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final String TEST_SECURITY_TYPE = "WPA2";
937079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final String TEST_PASSWORD = "GoogleRock";
947079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final String TEST_PROXY_HOST = "testhost.com";
957079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final int TEST_PROXY_PORT = 7689;
967079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final String TEST_PROXY_BYPASS_HOSTS = "http://host1.com;https://host2.com";
977079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final String TEST_PAC_URL = "pac.test.com";
987079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final WifiInfo TEST_WIFI_INFO = WifiInfo.Builder.builder()
997079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            .setSsid(TEST_SSID)
1007079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            .setHidden(TEST_HIDDEN)
1017079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            .setSecurityType(TEST_SECURITY_TYPE)
1027079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            .setPassword(TEST_PASSWORD)
1037079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            .setProxyHost(TEST_PROXY_HOST)
1047079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            .setProxyPort(TEST_PROXY_PORT)
1057079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            .setProxyBypassHosts(TEST_PROXY_BYPASS_HOSTS)
1067079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            .setPacUrl(TEST_PAC_URL)
1077079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            .build();
1087079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
1097079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    // Device admin package download info
1107079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final String TEST_DOWNLOAD_LOCATION =
1117079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            "http://example/dpc.apk";
1127079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final String TEST_COOKIE_HEADER =
1137079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            "Set-Cookie: sessionToken=foobar; Expires=Thu, 18 Feb 2016 23:59:59 GMT";
1147079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final byte[] TEST_PACKAGE_CHECKSUM = new byte[] { '1', '2', '3', '4', '5' };
1157079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final byte[] TEST_SIGNATURE_CHECKSUM = new byte[] { '5', '4', '3', '2', '1' };
1167079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final int TEST_MIN_SUPPORT_VERSION = 17689;
1177079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static final PackageDownloadInfo TEST_DOWNLOAD_INFO =
1187079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            PackageDownloadInfo.Builder.builder()
1197079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                    .setLocation(TEST_DOWNLOAD_LOCATION)
1207079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                    .setCookieHeader(TEST_COOKIE_HEADER)
1217079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                    .setPackageChecksum(TEST_PACKAGE_CHECKSUM)
1227079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                    .setSignatureChecksum(TEST_SIGNATURE_CHECKSUM)
1237079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                    .setMinVersion(TEST_MIN_SUPPORT_VERSION)
1247079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                    .build();
1257079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
1267079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    @Mock
1277079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private Context mContext;
1287079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
12990f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    @Mock
13090f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang    private ManagedProvisioningSharedPreferences mSharedPreferences;
13190f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang
1327079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private PropertiesProvisioningDataParser mPropertiesProvisioningDataParser;
1337079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
1347079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    @Override
1357079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    public void setUp() {
1367079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        // this is necessary for mockito to work
1377079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString());
1387079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
1397079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        MockitoAnnotations.initMocks(this);
1407079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
14190f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang        when(mSharedPreferences.incrementAndGetProvisioningId()).thenReturn(TEST_PROVISIONING_ID);
14290f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang        mPropertiesProvisioningDataParser = new PropertiesProvisioningDataParser(mContext,
14390f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang                new Utils(), mSharedPreferences);
1447079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    }
1457079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
1467079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    public void testParse_nfcProvisioningIntent() throws Exception {
1477079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        // GIVEN a NFC provisioning intent with all supported data.
1487079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        Properties props = new Properties();
1497079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        ByteArrayOutputStream stream = new ByteArrayOutputStream();
1507079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME);
1517079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(
1527079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME,
1537079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                TEST_COMPONENT_NAME.flattenToString());
1547079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        setTestWifiInfo(props);
1557079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        setTestTimeTimeZoneAndLocale(props);
1567079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        setTestDeviceAdminDownload(props);
1577079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_ADMIN_EXTRAS_BUNDLE, getTestAdminExtrasString());
1587079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(
1597079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                EXTRA_PROVISIONING_SKIP_ENCRYPTION,
1607079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                Boolean.toString(TEST_SKIP_ENCRYPTION));
1617079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        // GIVEN main color is supplied even though it is not supported in NFC provisioning.
1627079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_MAIN_COLOR, Integer.toString(TEST_MAIN_COLOR));
1637079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
1647079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.store(stream, "NFC provisioning intent" /* data description */);
1657079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
1667079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        NdefRecord record = NdefRecord.createMime(
1677079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC,
1687079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                stream.toByteArray());
1697079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        NdefMessage ndfMsg = new NdefMessage(new NdefRecord[]{record});
1707079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
1717079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        Intent intent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED)
1727079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                .setType(MIME_TYPE_PROVISIONING_NFC)
1737079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                .putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, new NdefMessage[]{ndfMsg});
1747079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
1757079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        // WHEN the intent is parsed by the parser.
17690f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang        ProvisioningParams params = mPropertiesProvisioningDataParser.parse(intent);
1777079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
1787079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
1797079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        // THEN ProvisionParams is constructed as expected.
1807079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        assertEquals(
1817079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                ProvisioningParams.Builder.builder()
1827079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        // THEN NFC provisioning is translated to ACTION_PROVISION_MANAGED_DEVICE
1837079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        // action.
1847079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setProvisioningAction(ACTION_PROVISION_MANAGED_DEVICE)
1857079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setDeviceAdminComponentName(TEST_COMPONENT_NAME)
1867079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setDeviceAdminPackageName(TEST_PACKAGE_NAME)
18790f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang                        .setProvisioningId(TEST_PROVISIONING_ID)
1887079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setDeviceAdminDownloadInfo(
1897079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                                PackageDownloadInfo.Builder.builder()
1907079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                                        .setLocation(TEST_DOWNLOAD_LOCATION)
1917079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                                        .setCookieHeader(TEST_COOKIE_HEADER)
1927079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                                        .setPackageChecksum(TEST_PACKAGE_CHECKSUM)
1937079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                                        .setSignatureChecksum(TEST_SIGNATURE_CHECKSUM)
1947079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                                        .setMinVersion(TEST_MIN_SUPPORT_VERSION)
1957079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                                        // THEN it supports SHA1 package checksum.
1967079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                                        .setPackageChecksumSupportsSha1(true)
1977079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                                        .build())
1987079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setLocalTime(TEST_LOCAL_TIME)
1997079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setLocale(TEST_LOCALE)
2007079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setTimeZone(TEST_TIME_ZONE)
2017079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        // THEN main color is not supported in NFC intent.
2027079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setMainColor(null)
2037079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setSkipEncryption(TEST_SKIP_ENCRYPTION)
2047079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setWifiInfo(TEST_WIFI_INFO)
2057079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setAdminExtrasBundle(getTestAdminExtrasPersistableBundle())
2067079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .setStartedByTrustedSource(true)
2078f9c7260d0e22cad72a943bf7b0949955dfc039fVictor Chang                        .setIsNfc(true)
2087079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        .build(),
2097079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                params);
2107079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    }
2117079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
2127079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    public void testParse_OtherIntentsThrowsException() {
2137079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        // GIVEN a managed device provisioning intent and some extras.
2147079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        Intent intent = new Intent(ACTION_PROVISION_MANAGED_DEVICE)
2157079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME)
2167079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME)
2177079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                .putExtra(EXTRA_PROVISIONING_SKIP_ENCRYPTION, TEST_SKIP_ENCRYPTION)
2187079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                .putExtra(EXTRA_PROVISIONING_MAIN_COLOR, TEST_MAIN_COLOR)
2197079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                .putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, TEST_ACCOUNT_TO_MIGRATE);
2207079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
2217079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        try {
2227079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            // WHEN the intent is parsed by the parser.
22390f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang            ProvisioningParams params = mPropertiesProvisioningDataParser.parse(intent);
2247079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            fail("PropertiesProvisioningDataParser doesn't support intent other than NFC. "
2257079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                    + "IllegalProvisioningArgumentException should be thrown");
2267079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        } catch (IllegalProvisioningArgumentException e) {
2277079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            // THEN IllegalProvisioningArgumentException is thrown.
2287079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        }
2297079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    }
2307079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
2318a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra    public void testGetFirstNdefRecord_nullNdefMessages() {
2328a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        // GIVEN nfc intent with no ndef messages
2338a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        Intent nfcIntent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED);
2348a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        // WHEN getting first ndef record
2358a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        // THEN it should return null
2368a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        assertNull(PropertiesProvisioningDataParser.getFirstNdefRecord(nfcIntent));
2378a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra    }
2388a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra
2398a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra    public void testGetFirstNdefRecord_noNfcMimeType() {
2408a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        // GIVEN nfc intent with no ndf message with a record with a valid mime type.
2418a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        ByteArrayOutputStream stream = new ByteArrayOutputStream();
2428a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        NdefRecord record = NdefRecord.createMime(INVALID_MIME_TYPE, stream.toByteArray());
2438a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        NdefMessage ndfMsg = new NdefMessage(new NdefRecord[]{record});
2448a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        Intent nfcIntent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED)
2458a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra                .setType(MIME_TYPE_PROVISIONING_NFC)
2468a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra                .putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, new NdefMessage[]{ndfMsg});
2478a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        // WHEN getting first ndef record
2488a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        // THEN it should return null
2498a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        assertNull(PropertiesProvisioningDataParser.getFirstNdefRecord(nfcIntent));
2508a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra    }
2518a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra
2528a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra    public void testGetFirstNdefRecord() {
2538a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        // GIVEN nfc intent with valid ndf message with a record with mime type nfc.
2548a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        ByteArrayOutputStream stream = new ByteArrayOutputStream();
2558a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        NdefRecord record = NdefRecord.createMime(
2568a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra                DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC,
2578a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra                stream.toByteArray());
2588a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        NdefMessage ndfMsg = new NdefMessage(new NdefRecord[]{record});
2598a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        Intent nfcIntent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED)
2608a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra                .setType(MIME_TYPE_PROVISIONING_NFC)
2618a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra                .putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, new NdefMessage[]{ndfMsg});
2628a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        // WHEN getting first ndef record
2638a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        // THEN valid record should be returned
2648a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra        assertEquals(PropertiesProvisioningDataParser.getFirstNdefRecord(nfcIntent), record);
2658a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra    }
2668a0cbf851f45b0df553854788a53902619af08f3Mahaver Chopra
2677079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static Properties setTestWifiInfo(Properties props) {
2687079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_WIFI_SSID, TEST_SSID);
2697079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_WIFI_SECURITY_TYPE, TEST_SECURITY_TYPE);
2707079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_WIFI_PASSWORD, TEST_PASSWORD);
2717079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_HOST, TEST_PROXY_HOST);
2727079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_BYPASS, TEST_PROXY_BYPASS_HOSTS);
2737079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_WIFI_PAC_URL, TEST_PAC_URL);
2747079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_WIFI_PROXY_PORT, Integer.toString(TEST_PROXY_PORT));
2757079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_WIFI_HIDDEN, Boolean.toString(TEST_HIDDEN));
2767079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        return props;
2777079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    }
2787079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
2797079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static Properties setTestTimeTimeZoneAndLocale(Properties props) {
2807079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_LOCAL_TIME, Long.toString(TEST_LOCAL_TIME));
2817079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_TIME_ZONE, TEST_TIME_ZONE);
282d2aa11e5484f3e56cea4ac328b2a0a58c28d4047Nicolas Prevot        props.setProperty(EXTRA_PROVISIONING_LOCALE, StoreUtils.localeToString(TEST_LOCALE));
2837079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        return props;
2847079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    }
2857079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
2867079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static Properties setTestDeviceAdminDownload(Properties props) {
2877079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(
2887079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                EXTRA_PROVISIONING_DEVICE_ADMIN_MINIMUM_VERSION_CODE,
2897079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                Integer.toString(TEST_MIN_SUPPORT_VERSION));
2907079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(
2917079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_LOCATION,
2927079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                TEST_DOWNLOAD_LOCATION);
2937079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_DOWNLOAD_COOKIE_HEADER,
2947079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                TEST_COOKIE_HEADER);
2957079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(
2967079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_CHECKSUM,
2977079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                Base64.encodeToString(TEST_PACKAGE_CHECKSUM,
2987079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP));
2997079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.setProperty(
3007079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                EXTRA_PROVISIONING_DEVICE_ADMIN_SIGNATURE_CHECKSUM,
3017079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                Base64.encodeToString(TEST_SIGNATURE_CHECKSUM,
3027079df5a3fb155947004843ee8ec25b36127e3edSteven Ng                        Base64.URL_SAFE | Base64.NO_PADDING | Base64.NO_WRAP));
3037079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        return props;
3047079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    }
3057079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
3067079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static String getTestAdminExtrasString() throws Exception {
3077079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        Properties props = new Properties();
3087079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        ByteArrayOutputStream stream = new ByteArrayOutputStream();
3097079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
3107079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        PersistableBundle bundle = getTestAdminExtrasPersistableBundle();
3117079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        for (String key : bundle.keySet()) {
3127079df5a3fb155947004843ee8ec25b36127e3edSteven Ng            props.setProperty(key, bundle.getString(key));
3137079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        }
3147079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        props.store(stream, "ADMIN_EXTRAS_BUNDLE" /* data description */);
3157079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
3167079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        return stream.toString();
3177079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    }
3187079df5a3fb155947004843ee8ec25b36127e3edSteven Ng
3197079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    private static PersistableBundle getTestAdminExtrasPersistableBundle() {
3207079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        PersistableBundle bundle = new PersistableBundle();
3217079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        bundle.putString("key1", "val1");
3227079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        bundle.putString("key2", "val2");
3237079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        bundle.putString("key3", "val3");
3247079df5a3fb155947004843ee8ec25b36127e3edSteven Ng        return bundle;
3257079df5a3fb155947004843ee8ec25b36127e3edSteven Ng    }
3267079df5a3fb155947004843ee8ec25b36127e3edSteven Ng}
327