• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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