blob: bd7f897dc1c01b508e29c28ae3bc54919b4829b0 [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
Fabian Kozynskia4b41842019-05-28 11:19:17 -040019import static junit.framework.TestCase.assertFalse;
20
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040021import static org.junit.Assert.assertEquals;
Fabian Kozynskia4b41842019-05-28 11:19:17 -040022import static org.junit.Assert.assertTrue;
Fabian Kozynski510585d2018-12-19 13:59:17 -050023import static org.mockito.ArgumentMatchers.any;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040024import static org.mockito.ArgumentMatchers.anyBoolean;
25import static org.mockito.ArgumentMatchers.anyInt;
Fabian Kozynski510585d2018-12-19 13:59:17 -050026import static org.mockito.ArgumentMatchers.anyLong;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040027import static org.mockito.ArgumentMatchers.anyString;
28import static org.mockito.Mockito.never;
29import static org.mockito.Mockito.times;
30import static org.mockito.Mockito.verify;
31
32import android.app.AppOpsManager;
Philip P. Moltmanne3dbb5a2019-03-07 10:06:11 -080033import android.content.pm.PackageManager;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040034import android.os.UserHandle;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040035import android.testing.AndroidTestingRunner;
36import android.testing.TestableLooper;
37
Brett Chabot84151d92019-02-27 15:37:59 -080038import androidx.test.filters.SmallTest;
39
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040040import com.android.systemui.Dependency;
41import com.android.systemui.SysuiTestCase;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040042
43import org.junit.Before;
44import org.junit.Test;
45import org.junit.runner.RunWith;
46import org.mockito.Mock;
47import org.mockito.MockitoAnnotations;
48
49@SmallTest
50@RunWith(AndroidTestingRunner.class)
51@TestableLooper.RunWithLooper
52public class AppOpsControllerTest extends SysuiTestCase {
53 private static final String TEST_PACKAGE_NAME = "test";
Philip P. Moltmanne3dbb5a2019-03-07 10:06:11 -080054 private static final int TEST_UID = UserHandle.getUid(0, 0);
55 private static final int TEST_UID_OTHER = UserHandle.getUid(1, 0);
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040056
Fabian Kozynski510585d2018-12-19 13:59:17 -050057 @Mock
58 private AppOpsManager mAppOpsManager;
59 @Mock
Philip P. Moltmanne3dbb5a2019-03-07 10:06:11 -080060 private PackageManager mPackageManager;
61 @Mock
Fabian Kozynski510585d2018-12-19 13:59:17 -050062 private AppOpsController.Callback mCallback;
63 @Mock
64 private AppOpsControllerImpl.H mMockHandler;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040065
66 private AppOpsControllerImpl mController;
67
68 @Before
69 public void setUp() {
70 MockitoAnnotations.initMocks(this);
71
72 getContext().addMockSystemService(AppOpsManager.class, mAppOpsManager);
73
74 mController = new AppOpsControllerImpl(mContext, Dependency.get(Dependency.BG_LOOPER));
75 }
76
77 @Test
78 public void testOnlyListenForFewOps() {
79 mController.setListening(true);
80 verify(mAppOpsManager, times(1)).startWatchingActive(AppOpsControllerImpl.OPS, mController);
81 }
82
83 @Test
84 public void testStopListening() {
85 mController.setListening(false);
86 verify(mAppOpsManager, times(1)).stopWatchingActive(mController);
87 }
88
89 @Test
90 public void addCallback_includedCode() {
Fabian Kozynski510585d2018-12-19 13:59:17 -050091 mController.addCallback(
92 new int[]{AppOpsManager.OP_RECORD_AUDIO, AppOpsManager.OP_FINE_LOCATION},
93 mCallback);
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040094 mController.onOpActiveChanged(
95 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -050096 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
Fabian Kozynski510585d2018-12-19 13:59:17 -050097 AppOpsManager.MODE_ALLOWED);
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040098 verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO,
99 TEST_UID, TEST_PACKAGE_NAME, true);
100 }
101
102 @Test
103 public void addCallback_notIncludedCode() {
104 mController.addCallback(new int[]{AppOpsManager.OP_FINE_LOCATION}, mCallback);
105 mController.onOpActiveChanged(
106 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
107 verify(mCallback, never()).onActiveStateChanged(
108 anyInt(), anyInt(), anyString(), anyBoolean());
109 }
110
111 @Test
112 public void removeCallback_sameCode() {
113 mController.addCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
114 mController.removeCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
115 mController.onOpActiveChanged(
116 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
117 verify(mCallback, never()).onActiveStateChanged(
118 anyInt(), anyInt(), anyString(), anyBoolean());
119 }
120
121 @Test
122 public void addCallback_notSameCode() {
123 mController.addCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
Fabian Kozynski510585d2018-12-19 13:59:17 -0500124 mController.removeCallback(new int[]{AppOpsManager.OP_CAMERA}, mCallback);
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400125 mController.onOpActiveChanged(
126 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
127 verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO,
128 TEST_UID, TEST_PACKAGE_NAME, true);
129 }
130
131 @Test
132 public void getActiveItems_sameDetails() {
133 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
134 TEST_UID, TEST_PACKAGE_NAME, true);
135 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
136 TEST_UID, TEST_PACKAGE_NAME, true);
137 assertEquals(1, mController.getActiveAppOps().size());
138 }
139
140 @Test
141 public void getActiveItems_differentDetails() {
142 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
143 TEST_UID, TEST_PACKAGE_NAME, true);
144 mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
145 TEST_UID, TEST_PACKAGE_NAME, true);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -0500146 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500147 TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
148 assertEquals(3, mController.getActiveAppOps().size());
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400149 }
150
Fabian Kozynski510585d2018-12-19 13:59:17 -0500151 @Test
152 public void getActiveItemsForUser() {
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400153 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
154 TEST_UID, TEST_PACKAGE_NAME, true);
155 mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
156 TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -0500157 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500158 TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
159 assertEquals(2,
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400160 mController.getActiveAppOpsForUser(UserHandle.getUserId(TEST_UID)).size());
161 assertEquals(1,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500162 mController.getActiveAppOpsForUser(UserHandle.getUserId(TEST_UID_OTHER)).size());
163 }
164
165 @Test
166 public void opNotedScheduledForRemoval() {
167 mController.setBGHandler(mMockHandler);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -0500168 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500169 AppOpsManager.MODE_ALLOWED);
170 verify(mMockHandler).scheduleRemoval(any(AppOpItem.class), anyLong());
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400171 }
Fabian Kozynskia4b41842019-05-28 11:19:17 -0400172
173 @Test
174 public void noItemsAfterStopListening() {
175 mController.setBGHandler(mMockHandler);
176
177 mController.setListening(true);
178 mController.onOpActiveChanged(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
179 true);
180 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
181 AppOpsManager.MODE_ALLOWED);
182 assertFalse(mController.getActiveAppOps().isEmpty());
183
184 mController.setListening(false);
185
186 verify(mMockHandler).removeCallbacksAndMessages(null);
187 assertTrue(mController.getActiveAppOps().isEmpty());
188 }
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400189}