1 /* 2 * Copyright (C) 2017 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.settings.applications; 18 19 import static com.google.common.truth.Truth.assertThat; 20 import static org.mockito.Matchers.anyInt; 21 import static org.mockito.Matchers.anyString; 22 import static org.mockito.Matchers.eq; 23 import static org.mockito.Mockito.never; 24 import static org.mockito.Mockito.spy; 25 import static org.mockito.Mockito.verify; 26 import static org.mockito.Mockito.when; 27 28 import android.content.Context; 29 import android.content.pm.PackageInfo; 30 import android.content.pm.PackageManager; 31 import android.content.pm.PackageManager.NameNotFoundException; 32 import android.content.pm.PermissionGroupInfo; 33 import android.content.pm.PermissionInfo; 34 import android.support.v7.preference.Preference; 35 36 import com.android.settings.testutils.SettingsRobolectricTestRunner; 37 38 import org.junit.Before; 39 import org.junit.Test; 40 import org.junit.runner.RunWith; 41 import org.mockito.Mock; 42 import org.mockito.MockitoAnnotations; 43 import org.robolectric.RuntimeEnvironment; 44 45 import java.util.ArrayList; 46 import java.util.List; 47 48 @RunWith(SettingsRobolectricTestRunner.class) 49 public class AppPermissionsPreferenceControllerTest { 50 51 private static final String PERM_LOCATION = "android.permission-group.LOCATION"; 52 private static final String PERM_MICROPHONE = "android.permission-group.MICROPHONE"; 53 private static final String PERM_CAMERA = "android.permission-group.CAMERA"; 54 private static final String PERM_SMS = "android.permission-group.SMS"; 55 private static final String PERM_CONTACTS = "android.permission-group.CONTACTS"; 56 private static final String PERM_PHONE = "android.permission-group.PHONE"; 57 private static final String LABEL_LOCATION = "Location"; 58 private static final String LABEL_MICROPHONE = "Microphone"; 59 private static final String LABEL_CAMERA = "Camera"; 60 private static final String LABEL_SMS = "Sms"; 61 private static final String LABEL_CONTACTS = "Contacts"; 62 private static final String LABEL_PHONE = "Phone"; 63 64 @Mock 65 private Preference mPreference; 66 @Mock 67 private PackageManager mPackageManager; 68 @Mock 69 private PermissionGroupInfo mGroupLocation; 70 @Mock 71 private PermissionGroupInfo mGroupMic; 72 @Mock 73 private PermissionGroupInfo mGroupCamera; 74 @Mock 75 private PermissionGroupInfo mGroupSms; 76 @Mock 77 private PermissionGroupInfo mGroupContacts; 78 @Mock 79 private PermissionGroupInfo mGroupPhone; 80 81 private Context mContext; 82 private AppPermissionsPreferenceController mController; 83 private PermissionInfo mPermLocation; 84 private PermissionInfo mPermMic; 85 private PermissionInfo mPermCamera; 86 private PermissionInfo mPermSms; 87 private PermissionInfo mPermContacts; 88 private PermissionInfo mPermPhone; 89 90 @Before setUp()91 public void setUp() throws NameNotFoundException { 92 MockitoAnnotations.initMocks(this); 93 mContext = spy(RuntimeEnvironment.application); 94 when(mContext.getPackageManager()).thenReturn(mPackageManager); 95 96 // create permission groups 97 when(mPackageManager.getPermissionGroupInfo(eq(PERM_LOCATION), anyInt())) 98 .thenReturn(mGroupLocation); 99 when(mGroupLocation.loadLabel(mPackageManager)).thenReturn(LABEL_LOCATION); 100 when(mPackageManager.getPermissionGroupInfo(eq(PERM_MICROPHONE), anyInt())) 101 .thenReturn(mGroupMic); 102 when(mGroupMic.loadLabel(mPackageManager)).thenReturn(LABEL_MICROPHONE); 103 when(mPackageManager.getPermissionGroupInfo(eq(PERM_CAMERA), anyInt())) 104 .thenReturn(mGroupCamera); 105 when(mGroupCamera.loadLabel(mPackageManager)).thenReturn(LABEL_CAMERA); 106 when(mPackageManager.getPermissionGroupInfo(eq(PERM_SMS), anyInt())).thenReturn(mGroupSms); 107 when(mGroupSms.loadLabel(mPackageManager)).thenReturn(LABEL_SMS); 108 when(mPackageManager.getPermissionGroupInfo(eq(PERM_CONTACTS), anyInt())) 109 .thenReturn(mGroupContacts); 110 when(mGroupContacts.loadLabel(mPackageManager)).thenReturn(LABEL_CONTACTS); 111 when(mPackageManager.getPermissionGroupInfo(eq(PERM_PHONE), anyInt())) 112 .thenReturn(mGroupPhone); 113 when(mGroupPhone.loadLabel(mPackageManager)).thenReturn(LABEL_PHONE); 114 115 // create permissions 116 mPermLocation = new PermissionInfo(); 117 mPermLocation.name = "Permission1"; 118 mPermLocation.group = PERM_LOCATION; 119 mPermMic = new PermissionInfo(); 120 mPermMic.name = "Permission2"; 121 mPermMic.group = PERM_MICROPHONE; 122 mPermCamera = new PermissionInfo(); 123 mPermCamera.name = "Permission3"; 124 mPermCamera.group = PERM_CAMERA; 125 mPermSms = new PermissionInfo(); 126 mPermSms.name = "Permission4"; 127 mPermSms.group = PERM_SMS; 128 mPermContacts = new PermissionInfo(); 129 mPermContacts.name = "Permission4"; 130 mPermContacts.group = PERM_CONTACTS; 131 mPermPhone = new PermissionInfo(); 132 mPermPhone.name = "Permission4"; 133 mPermPhone.group = PERM_PHONE; 134 final List<PermissionInfo> permissions = new ArrayList<>(); 135 permissions.add(mPermLocation); 136 permissions.add(mPermMic); 137 permissions.add(mPermCamera); 138 permissions.add(mPermSms); 139 permissions.add(mPermContacts); 140 permissions.add(mPermPhone); 141 when(mPackageManager.queryPermissionsByGroup(anyString(), anyInt())) 142 .thenReturn(permissions); 143 144 mController = spy(new AppPermissionsPreferenceController(mContext)); 145 } 146 147 @Test isAvailable_shouldAlwaysReturnTrue()148 public void isAvailable_shouldAlwaysReturnTrue() { 149 assertThat(mController.isAvailable()).isTrue(); 150 } 151 152 @Test updateState_noGrantedPermissions_shouldNotSetSummary()153 public void updateState_noGrantedPermissions_shouldNotSetSummary() { 154 final List<PackageInfo> installedPackages = new ArrayList<>(); 155 final PackageInfo info = new PackageInfo(); 156 installedPackages.add(info); 157 when(mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS)) 158 .thenReturn(installedPackages); 159 160 mController.updateState(mPreference); 161 162 verify(mPreference, never()).setSummary(anyString()); 163 } 164 165 @Test updateState_hasPermissions_shouldSetSummary()166 public void updateState_hasPermissions_shouldSetSummary() { 167 final List<PackageInfo> installedPackages = new ArrayList<>(); 168 final PackageInfo info = new PackageInfo(); 169 installedPackages.add(info); 170 when(mPackageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS)) 171 .thenReturn(installedPackages); 172 PermissionInfo[] permissions = new PermissionInfo[4]; 173 info.permissions = permissions; 174 175 permissions[0] = mPermLocation; 176 permissions[1] = mPermMic; 177 permissions[2] = mPermCamera; 178 permissions[3] = mPermSms; 179 mController.updateState(mPreference); 180 verify(mPreference).setSummary("Apps using location, microphone, camera"); 181 182 permissions[0] = mPermPhone; 183 permissions[1] = mPermMic; 184 permissions[2] = mPermCamera; 185 permissions[3] = mPermSms; 186 mController.updateState(mPreference); 187 verify(mPreference).setSummary("Apps using microphone, camera, sms"); 188 189 permissions[0] = mPermPhone; 190 permissions[1] = mPermMic; 191 permissions[2] = mPermContacts; 192 permissions[3] = mPermSms; 193 mController.updateState(mPreference); 194 verify(mPreference).setSummary("Apps using microphone, sms, contacts"); 195 196 permissions = new PermissionInfo[2]; 197 info.permissions = permissions; 198 permissions[0] = mPermLocation; 199 permissions[1] = mPermCamera; 200 mController.updateState(mPreference); 201 verify(mPreference).setSummary("Apps using location, camera"); 202 203 permissions = new PermissionInfo[1]; 204 info.permissions = permissions; 205 permissions[0] = mPermCamera; 206 mController.updateState(mPreference); 207 verify(mPreference).setSummary("Apps using camera"); 208 } 209 } 210