Home | History | Annotate | Download | only in analytics
      1 /*
      2  * Copyright (C) 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 
     17 package com.android.managedprovisioning.analytics;
     18 
     19 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE;
     20 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME;
     21 import static android.app.admin.DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR;
     22 import static android.app.admin.DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC;
     23 import static com.android.managedprovisioning.common.Globals.ACTION_RESUME_PROVISIONING;
     24 import static org.mockito.Mockito.when;
     25 
     26 import android.app.admin.DevicePolicyManager;
     27 import android.content.Context;
     28 import android.content.Intent;
     29 import android.content.pm.PackageManager;
     30 import android.nfc.NdefMessage;
     31 import android.nfc.NdefRecord;
     32 import android.nfc.NfcAdapter;
     33 import android.test.AndroidTestCase;
     34 import android.test.suitebuilder.annotation.SmallTest;
     35 
     36 import java.io.ByteArrayOutputStream;
     37 import java.util.List;
     38 import java.util.Properties;
     39 
     40 import org.mockito.Mock;
     41 import org.mockito.MockitoAnnotations;
     42 
     43 /**
     44  * Unit-tests for {@link AnalyticsUtils}.
     45  */
     46 @SmallTest
     47 public class AnalyticsUtilsTest extends AndroidTestCase {
     48     private static final String INVALID_PACKAGE_NAME = "invalid-package-name";
     49     private static final String VALID_PACKAGE_NAME = "valid-package-name";
     50     private static final String VALID_INSTALLER_PACKAGE = "valid-installer-package";
     51     private static final String INVALID_PROVISIONING_EXTRA = "invalid-provisioning-extra";
     52 
     53     @Mock private Context mockContext;
     54     @Mock private PackageManager mockPackageManager;
     55 
     56     @Override
     57     public void setUp() {
     58         // this is necessary for mockito to work
     59         System.setProperty("dexmaker.dexcache", getContext().getCacheDir().toString());
     60 
     61         MockitoAnnotations.initMocks(this);
     62 
     63         when(mockContext.getPackageManager()).thenReturn(mockPackageManager);
     64     }
     65 
     66     public void testGetInstallerPackageName_invalidPackage() {
     67         // WHEN getting installer package name for an invalid package.
     68         when(mockPackageManager.getInstallerPackageName(INVALID_PACKAGE_NAME))
     69                 .thenThrow(new IllegalArgumentException());
     70         // THEN null should be returned and exception should be digested.
     71         assertNull(AnalyticsUtils.getInstallerPackageName(mockContext, INVALID_PACKAGE_NAME));
     72     }
     73 
     74     public void testGetInstallerPackageName_validPackage() {
     75         // WHEN getting installer package name for a valid package.
     76         when(mockPackageManager.getInstallerPackageName(VALID_PACKAGE_NAME))
     77                 .thenReturn(VALID_INSTALLER_PACKAGE);
     78         // THEN valid installer package name should be returned.
     79         assertEquals(VALID_INSTALLER_PACKAGE,
     80                 AnalyticsUtils.getInstallerPackageName(mockContext, VALID_PACKAGE_NAME));
     81     }
     82 
     83     public void testGetAllProvisioningExtras_NullIntent() {
     84         // WHEN getting provisioning extras using null Intent.
     85         List<String> provisioningExtras = AnalyticsUtils.getAllProvisioningExtras(null);
     86         // THEN an empty list of valid provisioning extras should be returned.
     87         assertEquals(0, provisioningExtras.size());
     88     }
     89 
     90     public void testGetAllProvisioningExtras_ProvisioningResume() {
     91         // GIVEN provisioning was resumed
     92         Intent intent = new Intent(ACTION_RESUME_PROVISIONING);
     93         // WHEN getting provisioning extras using resume provisioning intent.
     94         List<String> provisioningExtras = AnalyticsUtils.getAllProvisioningExtras(intent);
     95         // THEN an empty list of valid provisioning extras should be returned.
     96         assertEquals(0, provisioningExtras.size());
     97     }
     98 
     99     public void testGetAllProvisioningExtras_NullBundleExtras() {
    100         // GIVEN intent has null extras
    101         Intent intent = new Intent(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE);
    102         // WHEN getting provisioning extras with null extras
    103         List<String> provisioningExtras = AnalyticsUtils.getAllProvisioningExtras(intent);
    104         // THEN an empty list of valid provisioning extras should be returned.
    105         assertEquals(0, provisioningExtras.size());
    106     }
    107 
    108     public void testGetAllProvisioningExtras_NullNfcProperties() throws Exception {
    109         // GIVEN intent has null extras
    110         Intent intent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED);
    111         // WHEN getting provisioning extras with null extras
    112         List<String> provisioningExtras = AnalyticsUtils.getAllProvisioningExtras(intent);
    113         // THEN an empty list of valid provisioning extras should be returned.
    114         assertEquals(0, provisioningExtras.size());
    115     }
    116 
    117     public void testGetAllProvisioningExtras() {
    118         // GIVEN intent with both valid and invalid provisioning extras
    119         Intent intent = new Intent(DevicePolicyManager.ACTION_PROVISION_MANAGED_PROFILE);
    120         intent.putExtra(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE, "");
    121         intent.putExtra(INVALID_PROVISIONING_EXTRA, "");
    122         intent.putExtra(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, "");
    123         // WHEN getting provisioning extras using the intent
    124         List<String> provisioningExtras = AnalyticsUtils.getAllProvisioningExtras(intent);
    125         // THEN a list of valid provisioning extras should be returned.
    126         assertEquals(2, provisioningExtras.size());
    127         provisioningExtras.contains(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME);
    128         provisioningExtras.contains(EXTRA_PROVISIONING_ACCOUNT_TO_MIGRATE);
    129     }
    130 
    131     public void testGetAllProvisioningExtras_Nfc() throws Exception {
    132         // GIVEN a Nfc intent with both valid and invalid provisioning extras
    133         Properties props = new Properties();
    134         ByteArrayOutputStream stream = new ByteArrayOutputStream();
    135         props.setProperty(EXTRA_PROVISIONING_MAIN_COLOR, "");
    136         props.setProperty(INVALID_PROVISIONING_EXTRA, "");
    137         props.setProperty(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME, "");
    138         props.store(stream, "NFC provisioning intent" /* data description */);
    139 
    140         NdefRecord record = NdefRecord.createMime(
    141                 DevicePolicyManager.MIME_TYPE_PROVISIONING_NFC,
    142                 stream.toByteArray());
    143         NdefMessage ndfMsg = new NdefMessage(new NdefRecord[]{record});
    144 
    145         Intent intent = new Intent(NfcAdapter.ACTION_NDEF_DISCOVERED)
    146                 .setType(MIME_TYPE_PROVISIONING_NFC)
    147                 .putExtra(NfcAdapter.EXTRA_NDEF_MESSAGES, new NdefMessage[]{ndfMsg});
    148 
    149         // WHEN getting provisioning extras using the intent
    150         List<String> provisioningExtras = AnalyticsUtils.getAllProvisioningExtras(intent);
    151         // THEN a list of valid provisioning extras should be returned.
    152         assertEquals(2, provisioningExtras.size());
    153         provisioningExtras.contains(EXTRA_PROVISIONING_DEVICE_ADMIN_COMPONENT_NAME);
    154         provisioningExtras.contains(EXTRA_PROVISIONING_MAIN_COLOR);
    155     }
    156 }
    157