1e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot/* 27079df5a3fb155947004843ee8ec25b36127e3edSteven Ng * Copyright 2016, The Android Open Source Project 3e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * 4e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * Licensed under the Apache License, Version 2.0 (the "License"); 5e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * you may not use this file except in compliance with the License. 6e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * You may obtain a copy of the License at 7e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * 8e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * http://www.apache.org/licenses/LICENSE-2.0 9e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * 10e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * Unless required by applicable law or agreed to in writing, software 11e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * distributed under the License is distributed on an "AS IS" BASIS, 12e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * See the License for the specific language governing permissions and 14e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot * limitations under the License. 15e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot */ 167079df5a3fb155947004843ee8ec25b36127e3edSteven Ngpackage com.android.managedprovisioning.parser; 17e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot 187079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE; 197079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE; 20e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevotimport static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE; 217079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE; 229b26a5adee4f3d9f674c8b9dc1a185ea290dc624Benjamin Franzimport static android.app.admin.DevicePolicyManager.ACTION_PROVISION_MANAGED_USER; 2377bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME; 2477bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ngimport static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME; 257079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport static android.app.admin.DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC; 2677bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ngimport static org.mockito.Mockito.doReturn; 2777bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ngimport static org.mockito.Mockito.spy; 28e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot 2977bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ngimport android.accounts.Account; 30e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevotimport android.app.admin.DevicePolicyManager; 3177bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ngimport android.content.ComponentName; 3277bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ngimport android.content.Context; 33e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevotimport android.content.Intent; 347079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.nfc.NdefMessage; 357079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.nfc.NdefRecord; 367079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport android.nfc.NfcAdapter; 37e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevotimport android.test.AndroidTestCase; 38e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevotimport android.test.suitebuilder.annotation.SmallTest; 39e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot 4077bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ngimport com.android.managedprovisioning.common.Utils; 41d1784bd4d917bb36125e6faf125a2425c343838bSteven Ng 4277bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ngimport org.mockito.Mock; 4377bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ngimport org.mockito.MockitoAnnotations; 4477bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng 457079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport java.io.ByteArrayOutputStream; 467079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport java.util.Locale; 477079df5a3fb155947004843ee8ec25b36127e3edSteven Ngimport java.util.Properties; 487079df5a3fb155947004843ee8ec25b36127e3edSteven Ng 4977bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng/** Tests {@link MessageParser} */ 5077bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng@SmallTest 51e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevotpublic class MessageParserTest extends AndroidTestCase { 5277bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng private static final String TEST_PACKAGE_NAME = "com.afwsamples.testdpc"; 5377bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng private static final ComponentName TEST_COMPONENT_NAME = 5477bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng ComponentName.unflattenFromString( 5577bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng "com.afwsamples.testdpc/com.afwsamples.testdpc.DeviceAdminReceiver"); 5677bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng private static final long TEST_LOCAL_TIME = 1456939524713L; 5777bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng private static final Locale TEST_LOCALE = Locale.UK; 5877bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng private static final String TEST_TIME_ZONE = "GMT"; 5977bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng private static final Integer TEST_MAIN_COLOR = 65280; 6077bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng private static final boolean TEST_SKIP_ENCRYPTION = true; 6177bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng private static final Account TEST_ACCOUNT_TO_MIGRATE = 6277bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng new Account("user@gmail.com", "com.google"); 6377bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng 647079df5a3fb155947004843ee8ec25b36127e3edSteven Ng @Mock 657079df5a3fb155947004843ee8ec25b36127e3edSteven Ng private Context mContext; 6677bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng 6777bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng private Utils mUtils; 6877bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng 697079df5a3fb155947004843ee8ec25b36127e3edSteven Ng private MessageParser mMessageParser; 7077bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng 7177bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng @Override 7277bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng public void setUp() { 7377bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng // this is necessary for mockito to work 7477bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString()); 7577bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng 7677bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng MockitoAnnotations.initMocks(this); 7777bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng 7890f58ca887207a527c80d7e9ccea97e205c960d4Victor Chang mMessageParser = new MessageParser(mContext, mUtils = spy(new Utils())); 7977bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng } 8077bac595693aa1aa6e4832f278d5b3b35a3ffd53Steven Ng 817079df5a3fb155947004843ee8ec25b36127e3edSteven Ng public void test_correctParserUsedToParseNfcIntent() throws Exception { 827079df5a3fb155947004843ee8ec25b36127e3edSteven Ng // GIVEN a NFC provisioning intent with some supported data. 837079df5a3fb155947004843ee8ec25b36127e3edSteven Ng Properties props = new Properties(); 847079df5a3fb155947004843ee8ec25b36127e3edSteven Ng ByteArrayOutputStream stream = new ByteArrayOutputStream(); 857079df5a3fb155947004843ee8ec25b36127e3edSteven Ng props.setProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_PACKAGE_NAME, TEST_PACKAGE_NAME); 867079df5a3fb155947004843ee8ec25b36127e3edSteven Ng props.setProperty( 877079df5a3fb155947004843ee8ec25b36127e3edSteven Ng EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, 887079df5a3fb155947004843ee8ec25b36127e3edSteven Ng TEST_COMPONENT_NAME.flattenToString()); 897079df5a3fb155947004843ee8ec25b36127e3edSteven Ng props.store(stream, "NFC provisioning intent" /* data description */); 907079df5a3fb155947004843ee8ec25b36127e3edSteven Ng NdefRecord record = NdefRecord.createMime( 917079df5a3fb155947004843ee8ec25b36127e3edSteven Ng DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC, 927079df5a3fb155947004843ee8ec25b36127e3edSteven Ng stream.toByteArray()); 937079df5a3fb155947004843ee8ec25b36127e3edSteven Ng NdefMessage ndfMsg = new NdefMessage(new NdefRecord[]{record}); 947079df5a3fb155947004843ee8ec25b36127e3edSteven Ng 957079df5a3fb155947004843ee8ec25b36127e3edSteven Ng Intent intent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED) 967079df5a3fb155947004843ee8ec25b36127e3edSteven Ng .setType(MIME_TYPE_PROVISIONING_NFC) 977079df5a3fb155947004843ee8ec25b36127e3edSteven Ng .putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, new NdefMessage[]{ndfMsg}); 987079df5a3fb155947004843ee8ec25b36127e3edSteven Ng 997079df5a3fb155947004843ee8ec25b36127e3edSteven Ng // WHEN the mMessageParser.getParser is invoked. 1007079df5a3fb155947004843ee8ec25b36127e3edSteven Ng ProvisioningDataParser parser = mMessageParser.getParser(intent); 1017079df5a3fb155947004843ee8ec25b36127e3edSteven Ng 1027079df5a3fb155947004843ee8ec25b36127e3edSteven Ng // THEN the properties parser is returned. 1037079df5a3fb155947004843ee8ec25b36127e3edSteven Ng assertTrue(parser instanceof PropertiesProvisioningDataParser); 1047079df5a3fb155947004843ee8ec25b36127e3edSteven Ng } 1057079df5a3fb155947004843ee8ec25b36127e3edSteven Ng 1067079df5a3fb155947004843ee8ec25b36127e3edSteven Ng public void test_correctParserUsedToParseOtherSupportedProvisioningIntent() throws Exception { 1077079df5a3fb155947004843ee8ec25b36127e3edSteven Ng // GIVEN the device admin app is installed. 1087079df5a3fb155947004843ee8ec25b36127e3edSteven Ng doReturn(TEST_COMPONENT_NAME) 1097079df5a3fb155947004843ee8ec25b36127e3edSteven Ng .when(mUtils) 1107079df5a3fb155947004843ee8ec25b36127e3edSteven Ng .findDeviceAdmin(null, TEST_COMPONENT_NAME, mContext); 1117079df5a3fb155947004843ee8ec25b36127e3edSteven Ng // GIVEN a list of supported provisioning actions, except NFC. 1127079df5a3fb155947004843ee8ec25b36127e3edSteven Ng String[] supportedProvisioningActions = new String[] { 1137079df5a3fb155947004843ee8ec25b36127e3edSteven Ng ACTION_PROVISION_MANAGED_DEVICE, 1147079df5a3fb155947004843ee8ec25b36127e3edSteven Ng ACTION_PROVISION_MANAGED_DEVICE_FROM_TRUSTED_SOURCE, 1157079df5a3fb155947004843ee8ec25b36127e3edSteven Ng ACTION_PROVISION_MANAGED_USER, 1167079df5a3fb155947004843ee8ec25b36127e3edSteven Ng ACTION_PROVISION_MANAGED_PROFILE, 1177079df5a3fb155947004843ee8ec25b36127e3edSteven Ng ACTION_PROVISION_MANAGED_SHAREABLE_DEVICE 1187079df5a3fb155947004843ee8ec25b36127e3edSteven Ng }; 1197079df5a3fb155947004843ee8ec25b36127e3edSteven Ng 1207079df5a3fb155947004843ee8ec25b36127e3edSteven Ng for (String provisioningAction : supportedProvisioningActions) { 1217079df5a3fb155947004843ee8ec25b36127e3edSteven Ng Intent intent = new Intent(provisioningAction) 1227079df5a3fb155947004843ee8ec25b36127e3edSteven Ng .putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, TEST_COMPONENT_NAME); 1237079df5a3fb155947004843ee8ec25b36127e3edSteven Ng 1247079df5a3fb155947004843ee8ec25b36127e3edSteven Ng // WHEN the mMessageParser.getParser is invoked. 1257079df5a3fb155947004843ee8ec25b36127e3edSteven Ng ProvisioningDataParser parser = mMessageParser.getParser(intent); 1267079df5a3fb155947004843ee8ec25b36127e3edSteven Ng 1277079df5a3fb155947004843ee8ec25b36127e3edSteven Ng // THEN the extras parser is returned. 1287079df5a3fb155947004843ee8ec25b36127e3edSteven Ng assertTrue(parser instanceof ExtrasProvisioningDataParser); 1297079df5a3fb155947004843ee8ec25b36127e3edSteven Ng } 1307079df5a3fb155947004843ee8ec25b36127e3edSteven Ng } 131e35cc9733194b380637728d39c14dcfc0adee84bNicolas Prevot} 132