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 
21 import static org.mockito.ArgumentMatchers.anyString;
22 import static org.mockito.Mockito.doNothing;
23 import static org.mockito.Mockito.never;
24 import static org.mockito.Mockito.spy;
25 import static org.mockito.Mockito.verify;
26 
27 import android.content.Context;
28 import android.content.pm.PackageManager.NameNotFoundException;
29 
30 import androidx.preference.Preference;
31 
32 import com.android.settings.R;
33 
34 import org.junit.Before;
35 import org.junit.Test;
36 import org.junit.runner.RunWith;
37 import org.robolectric.RobolectricTestRunner;
38 import org.robolectric.RuntimeEnvironment;
39 
40 import java.util.ArrayList;
41 import java.util.List;
42 
43 @RunWith(RobolectricTestRunner.class)
44 public class AppPermissionsPreferenceControllerTest {
45 
46     private Context mContext;
47     private AppPermissionsPreferenceController mController;
48     private Preference mPreference;
49 
50     @Before
setUp()51     public void setUp() throws NameNotFoundException {
52         mContext = RuntimeEnvironment.application;
53         mPreference = spy(new Preference(mContext));
54         mController = spy(new AppPermissionsPreferenceController(mContext, "pref_key"));
55     }
56 
57     @Test
isAvailable_shouldAlwaysReturnTrue()58     public void isAvailable_shouldAlwaysReturnTrue() {
59         assertThat(mController.isAvailable()).isTrue();
60     }
61 
62     @Test
updateState_shouldResetNumPackageChecked()63     public void updateState_shouldResetNumPackageChecked() {
64         doNothing().when(mController).queryPermissionSummary();
65         mController.mNumPackageChecked = 3;
66 
67         mController.updateState(mPreference);
68 
69         assertThat(mController.mNumPackageChecked).isEqualTo(0);
70     }
71 
72     @Test
updateSummary_noGrantedPermission_shouldSetNoPermissionGrantedSummary()73     public void updateSummary_noGrantedPermission_shouldSetNoPermissionGrantedSummary() {
74         doNothing().when(mController).queryPermissionSummary();
75         mController.updateState(mPreference);
76         mController.mNumPackageChecked = 3;
77 
78         mController.updateSummary(new ArrayList<>());
79 
80         assertThat(mPreference.getSummary()).isEqualTo(
81                 mContext.getString(R.string.runtime_permissions_summary_no_permissions_granted));
82     }
83 
84     @Test
updateSummary_hasOnePermission_shouldSetPermissionAsSummary()85     public void updateSummary_hasOnePermission_shouldSetPermissionAsSummary() {
86         doNothing().when(mController).queryPermissionSummary();
87         mController.updateState(mPreference);
88         final String permission = "location";
89         final ArrayList<CharSequence> labels = new ArrayList<>();
90         labels.add(permission);
91         final String summary = "Apps using " + permission;
92         mController.mNumPackageChecked = 3;
93 
94         mController.updateSummary(labels);
95 
96         assertThat(mPreference.getSummary()).isEqualTo(summary);
97     }
98 
99     @Test
updateSummary_hasThreePermissions_shouldShowThreePermissionAsSummary()100     public void updateSummary_hasThreePermissions_shouldShowThreePermissionAsSummary() {
101         doNothing().when(mController).queryPermissionSummary();
102         mController.updateState(mPreference);
103         mController.mNumPackageChecked = 3;
104         final List<CharSequence> labels = new ArrayList<>();
105         labels.add("Phone");
106         labels.add("SMS");
107         labels.add("Microphone");
108 
109         mController.updateSummary(labels);
110 
111         final String summary = "Apps using microphone, sms, and phone";
112         assertThat(mPreference.getSummary()).isEqualTo(summary);
113     }
114 
115     @Test
updateSummary_hasFivePermissions_shouldShowThreePermissionsAndMoreAsSummary()116     public void updateSummary_hasFivePermissions_shouldShowThreePermissionsAndMoreAsSummary() {
117         doNothing().when(mController).queryPermissionSummary();
118         mController.updateState(mPreference);
119         mController.mNumPackageChecked = 3;
120         final List<CharSequence> labels = new ArrayList<>();
121         labels.add("Phone");
122         labels.add("SMS");
123         labels.add("Microphone");
124         labels.add("Contacts");
125         labels.add("Camera");
126         labels.add("Location");
127 
128         mController.updateSummary(labels);
129 
130         final String summary = "Apps using microphone, contacts, and sms, and more";
131         assertThat(mPreference.getSummary()).isEqualTo(summary);
132     }
133 
134     @Test
updateSummary_notReachCallbackCount_shouldNotSetSummary()135     public void updateSummary_notReachCallbackCount_shouldNotSetSummary() {
136         doNothing().when(mController).queryPermissionSummary();
137         mController.updateState(mPreference);
138         final String permission = "location";
139         final ArrayList<CharSequence> labels = new ArrayList<>();
140         labels.add(permission);
141 
142         mController.updateSummary(labels);
143 
144         verify(mPreference, never()).setSummary(anyString());
145     }
146 }
147