blob: 59d5c243af730291302327d4e5e93df74654202e [file] [log] [blame]
Fabian Kozynski1f32cf02018-10-23 12:23:31 -04001/*
2 * Copyright (C) 2018 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
17package com.android.systemui.appops;
18
19import static org.junit.Assert.assertEquals;
Fabian Kozynski5c837102019-06-13 10:54:40 -040020import static org.junit.Assert.assertFalse;
Fabian Kozynskia4b41842019-05-28 11:19:17 -040021import static org.junit.Assert.assertTrue;
Fabian Kozynski510585d2018-12-19 13:59:17 -050022import static org.mockito.ArgumentMatchers.any;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040023import static org.mockito.ArgumentMatchers.anyBoolean;
24import static org.mockito.ArgumentMatchers.anyInt;
Fabian Kozynski510585d2018-12-19 13:59:17 -050025import static org.mockito.ArgumentMatchers.anyLong;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040026import static org.mockito.ArgumentMatchers.anyString;
27import static org.mockito.Mockito.never;
28import static org.mockito.Mockito.times;
29import static org.mockito.Mockito.verify;
30
31import android.app.AppOpsManager;
Philip P. Moltmanne3dbb5a2019-03-07 10:06:11 -080032import android.content.pm.PackageManager;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040033import android.os.UserHandle;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040034import android.testing.AndroidTestingRunner;
35import android.testing.TestableLooper;
36
Brett Chabot84151d92019-02-27 15:37:59 -080037import androidx.test.filters.SmallTest;
38
Fabian Kozynski5c837102019-06-13 10:54:40 -040039import com.android.systemui.Dependency;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040040import com.android.systemui.SysuiTestCase;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040041
42import org.junit.Before;
43import org.junit.Test;
44import org.junit.runner.RunWith;
45import org.mockito.Mock;
46import org.mockito.MockitoAnnotations;
47
48@SmallTest
49@RunWith(AndroidTestingRunner.class)
50@TestableLooper.RunWithLooper
51public class AppOpsControllerTest extends SysuiTestCase {
52 private static final String TEST_PACKAGE_NAME = "test";
Philip P. Moltmanne3dbb5a2019-03-07 10:06:11 -080053 private static final int TEST_UID = UserHandle.getUid(0, 0);
54 private static final int TEST_UID_OTHER = UserHandle.getUid(1, 0);
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040055
Fabian Kozynski510585d2018-12-19 13:59:17 -050056 @Mock
57 private AppOpsManager mAppOpsManager;
58 @Mock
Philip P. Moltmanne3dbb5a2019-03-07 10:06:11 -080059 private PackageManager mPackageManager;
60 @Mock
Fabian Kozynski510585d2018-12-19 13:59:17 -050061 private AppOpsController.Callback mCallback;
62 @Mock
63 private AppOpsControllerImpl.H mMockHandler;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040064
65 private AppOpsControllerImpl mController;
66
67 @Before
68 public void setUp() {
69 MockitoAnnotations.initMocks(this);
70
71 getContext().addMockSystemService(AppOpsManager.class, mAppOpsManager);
72
Fabian Kozynski5c837102019-06-13 10:54:40 -040073 mController = new AppOpsControllerImpl(mContext, Dependency.get(Dependency.BG_LOOPER));
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040074 }
75
76 @Test
77 public void testOnlyListenForFewOps() {
78 mController.setListening(true);
79 verify(mAppOpsManager, times(1)).startWatchingActive(AppOpsControllerImpl.OPS, mController);
80 }
81
82 @Test
83 public void testStopListening() {
84 mController.setListening(false);
85 verify(mAppOpsManager, times(1)).stopWatchingActive(mController);
86 }
87
88 @Test
89 public void addCallback_includedCode() {
Fabian Kozynski510585d2018-12-19 13:59:17 -050090 mController.addCallback(
91 new int[]{AppOpsManager.OP_RECORD_AUDIO, AppOpsManager.OP_FINE_LOCATION},
92 mCallback);
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040093 mController.onOpActiveChanged(
94 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -050095 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
Fabian Kozynski510585d2018-12-19 13:59:17 -050096 AppOpsManager.MODE_ALLOWED);
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040097 verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO,
98 TEST_UID, TEST_PACKAGE_NAME, true);
99 }
100
101 @Test
102 public void addCallback_notIncludedCode() {
103 mController.addCallback(new int[]{AppOpsManager.OP_FINE_LOCATION}, mCallback);
104 mController.onOpActiveChanged(
105 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
106 verify(mCallback, never()).onActiveStateChanged(
107 anyInt(), anyInt(), anyString(), anyBoolean());
108 }
109
110 @Test
111 public void removeCallback_sameCode() {
112 mController.addCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
113 mController.removeCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
114 mController.onOpActiveChanged(
115 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
116 verify(mCallback, never()).onActiveStateChanged(
117 anyInt(), anyInt(), anyString(), anyBoolean());
118 }
119
120 @Test
121 public void addCallback_notSameCode() {
122 mController.addCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
Fabian Kozynski510585d2018-12-19 13:59:17 -0500123 mController.removeCallback(new int[]{AppOpsManager.OP_CAMERA}, mCallback);
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400124 mController.onOpActiveChanged(
125 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
126 verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO,
127 TEST_UID, TEST_PACKAGE_NAME, true);
128 }
129
130 @Test
131 public void getActiveItems_sameDetails() {
132 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
133 TEST_UID, TEST_PACKAGE_NAME, true);
134 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
135 TEST_UID, TEST_PACKAGE_NAME, true);
136 assertEquals(1, mController.getActiveAppOps().size());
137 }
138
139 @Test
140 public void getActiveItems_differentDetails() {
141 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
142 TEST_UID, TEST_PACKAGE_NAME, true);
143 mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
144 TEST_UID, TEST_PACKAGE_NAME, true);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -0500145 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500146 TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
147 assertEquals(3, mController.getActiveAppOps().size());
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400148 }
149
Fabian Kozynski510585d2018-12-19 13:59:17 -0500150 @Test
151 public void getActiveItemsForUser() {
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400152 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
153 TEST_UID, TEST_PACKAGE_NAME, true);
154 mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
155 TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -0500156 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500157 TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
158 assertEquals(2,
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400159 mController.getActiveAppOpsForUser(UserHandle.getUserId(TEST_UID)).size());
160 assertEquals(1,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500161 mController.getActiveAppOpsForUser(UserHandle.getUserId(TEST_UID_OTHER)).size());
162 }
163
164 @Test
165 public void opNotedScheduledForRemoval() {
166 mController.setBGHandler(mMockHandler);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -0500167 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500168 AppOpsManager.MODE_ALLOWED);
169 verify(mMockHandler).scheduleRemoval(any(AppOpItem.class), anyLong());
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400170 }
Fabian Kozynskia4b41842019-05-28 11:19:17 -0400171
172 @Test
173 public void noItemsAfterStopListening() {
174 mController.setBGHandler(mMockHandler);
175
176 mController.setListening(true);
177 mController.onOpActiveChanged(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
178 true);
179 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
180 AppOpsManager.MODE_ALLOWED);
181 assertFalse(mController.getActiveAppOps().isEmpty());
182
183 mController.setListening(false);
184
185 verify(mMockHandler).removeCallbacksAndMessages(null);
186 assertTrue(mController.getActiveAppOps().isEmpty());
187 }
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400188}