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