/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.internal.telephony; import android.content.pm.ApplicationInfo; import android.content.pm.IPackageManager; import android.content.pm.PackageManager; import android.telephony.TelephonyManager; import android.test.InstrumentationTestCase; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; public class CarrierAppUtilsTest extends InstrumentationTestCase { private static final String CARRIER_APP = "com.example.carrier"; private static final String[] CARRIER_APPS = new String[] { CARRIER_APP }; private static final int USER_ID = 12345; private static final String CALLING_PACKAGE = "phone"; @Mock private IPackageManager mPackageManager; @Mock private TelephonyManager mTelephonyManager; @Override public void setUp() throws Exception { super.setUp(); System.setProperty("dexmaker.dexcache", getInstrumentation().getTargetContext().getCacheDir().getPath()); Thread.currentThread().setContextClassLoader(getClass().getClassLoader()); MockitoAnnotations.initMocks(this); } /** No apps configured - should do nothing. */ public void testDisableCarrierAppsUntilPrivileged_EmptyList() { CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, new String[0]); Mockito.verifyNoMoreInteractions(mPackageManager, mTelephonyManager); } /** Configured app is missing - should do nothing. */ public void testDisableCarrierAppsUntilPrivileged_MissingApp() throws Exception { Mockito.when(mPackageManager.getApplicationInfo("com.example.missing.app", PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(null); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, new String[] { "com.example.missing.app" }); Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting( Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()); Mockito.verify(mPackageManager, Mockito.never()) .grantDefaultPermissionsToEnabledCarrierApps(Mockito.any(String[].class), Mockito.anyInt()); Mockito.verifyNoMoreInteractions(mTelephonyManager); } /** Configured app is not bundled with the system - should do nothing. */ public void testDisableCarrierAppsUntilPrivileged_NonSystemApp() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting( Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()); Mockito.verify(mPackageManager, Mockito.never()) .grantDefaultPermissionsToEnabledCarrierApps( Mockito.any(String[].class), Mockito.anyInt()); Mockito.verifyNoMoreInteractions(mTelephonyManager); } /** * Configured app has privileges, but was disabled by the user - should only grant * permissions. */ public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_DisabledUser() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting( Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()); Mockito.verify(mPackageManager).grantDefaultPermissionsToEnabledCarrierApps( new String[] {appInfo.packageName}, USER_ID); } /** Configured app has privileges, but was disabled - should only grant permissions. */ public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_Disabled() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting( Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()); Mockito.verify(mPackageManager).grantDefaultPermissionsToEnabledCarrierApps( new String[] {appInfo.packageName}, USER_ID); } /** Configured app has privileges, and is already enabled - should only grant permissions. */ public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_Enabled() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_ENABLED; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting( Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()); Mockito.verify(mPackageManager).grantDefaultPermissionsToEnabledCarrierApps( new String[] {appInfo.packageName}, USER_ID); } /** Configured /data app has privileges - should only grant permissions. */ public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_UpdatedApp() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_ENABLED; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting( Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()); Mockito.verify(mPackageManager).grantDefaultPermissionsToEnabledCarrierApps( new String[] {appInfo.packageName}, USER_ID); } /** Configured app has privileges, and is in the default state - should enable. */ public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_Default() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager).setApplicationEnabledSetting( CARRIER_APP, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP, USER_ID, CALLING_PACKAGE); Mockito.verify(mPackageManager).grantDefaultPermissionsToEnabledCarrierApps( new String[] {appInfo.packageName}, USER_ID); } /** Configured app has privileges, and is disabled until used - should enable. */ public void testDisableCarrierAppsUntilPrivileged_HasPrivileges_DisabledUntilUsed() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager).setApplicationEnabledSetting( CARRIER_APP, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP, USER_ID, CALLING_PACKAGE); Mockito.verify(mPackageManager).grantDefaultPermissionsToEnabledCarrierApps( new String[] {appInfo.packageName}, USER_ID); } /** Configured app has no privileges, and was disabled by the user - should do nothing. */ public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_DisabledUser() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting( Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()); Mockito.verify(mPackageManager, Mockito.never()) .grantDefaultPermissionsToEnabledCarrierApps( Mockito.any(String[].class), Mockito.anyInt()); } /** Configured app has no privileges, and was disabled - should do nothing. */ public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_Disabled() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting( Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()); Mockito.verify(mPackageManager, Mockito.never()) .grantDefaultPermissionsToEnabledCarrierApps( Mockito.any(String[].class), Mockito.anyInt()); } /** Configured app has no privileges, and is explicitly enabled - should do nothing. */ public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_Enabled() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_ENABLED; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting( Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()); Mockito.verify(mPackageManager, Mockito.never()) .grantDefaultPermissionsToEnabledCarrierApps( Mockito.any(String[].class), Mockito.anyInt()); } /** Configured /data app has no privileges - should do nothing. */ public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_UpdatedApp() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM | ApplicationInfo.FLAG_UPDATED_SYSTEM_APP; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_ENABLED; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting( Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()); Mockito.verify(mPackageManager, Mockito.never()) .grantDefaultPermissionsToEnabledCarrierApps( Mockito.any(String[].class), Mockito.anyInt()); } /** Configured app has no privileges, and is in the default state - should disable until use. */ public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_Default() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DEFAULT; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager).setApplicationEnabledSetting( CARRIER_APP, PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED, 0, USER_ID, CALLING_PACKAGE); Mockito.verify(mPackageManager, Mockito.never()) .grantDefaultPermissionsToEnabledCarrierApps( Mockito.any(String[].class), Mockito.anyInt()); } /** Configured app has no privileges, and is disabled until used - should do nothing. */ public void testDisableCarrierAppsUntilPrivileged_NoPrivileges_DisabledUntilUsed() throws Exception { ApplicationInfo appInfo = new ApplicationInfo(); appInfo.packageName = CARRIER_APP; appInfo.flags |= ApplicationInfo.FLAG_SYSTEM; appInfo.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED_UNTIL_USED; Mockito.when(mPackageManager.getApplicationInfo(CARRIER_APP, PackageManager.GET_DISABLED_UNTIL_USED_COMPONENTS, USER_ID)).thenReturn(appInfo); Mockito.when(mTelephonyManager.checkCarrierPrivilegesForPackageAnyPhone(CARRIER_APP)) .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_NO_ACCESS); CarrierAppUtils.disableCarrierAppsUntilPrivileged(CALLING_PACKAGE, mPackageManager, mTelephonyManager, USER_ID, CARRIER_APPS); Mockito.verify(mPackageManager, Mockito.never()).setApplicationEnabledSetting( Mockito.anyString(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyInt(), Mockito.anyString()); Mockito.verify(mPackageManager, Mockito.never()) .grantDefaultPermissionsToEnabledCarrierApps( Mockito.any(String[].class), Mockito.anyInt()); } }