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