blob: 2582946333c0ce66f08d07277adc0b3b9e967987 [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 Kozynski510585d2018-12-19 13:59:17 -050020import static org.mockito.ArgumentMatchers.any;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040021import static org.mockito.ArgumentMatchers.anyBoolean;
22import static org.mockito.ArgumentMatchers.anyInt;
Fabian Kozynski510585d2018-12-19 13:59:17 -050023import static org.mockito.ArgumentMatchers.anyLong;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040024import static org.mockito.ArgumentMatchers.anyString;
25import static org.mockito.Mockito.never;
26import static org.mockito.Mockito.times;
27import static org.mockito.Mockito.verify;
28
29import android.app.AppOpsManager;
30import android.os.UserHandle;
31import android.support.test.filters.SmallTest;
32import android.testing.AndroidTestingRunner;
33import android.testing.TestableLooper;
34
35import com.android.systemui.Dependency;
36import com.android.systemui.SysuiTestCase;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040037
38import org.junit.Before;
39import org.junit.Test;
40import org.junit.runner.RunWith;
41import org.mockito.Mock;
42import org.mockito.MockitoAnnotations;
43
44@SmallTest
45@RunWith(AndroidTestingRunner.class)
46@TestableLooper.RunWithLooper
47public class AppOpsControllerTest extends SysuiTestCase {
48 private static final String TEST_PACKAGE_NAME = "test";
49 private static final int TEST_UID = 0;
50 private static final int TEST_UID_OTHER = 500000;
51
Fabian Kozynski510585d2018-12-19 13:59:17 -050052 @Mock
53 private AppOpsManager mAppOpsManager;
54 @Mock
55 private AppOpsController.Callback mCallback;
56 @Mock
57 private AppOpsControllerImpl.H mMockHandler;
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040058
59 private AppOpsControllerImpl mController;
60
61 @Before
62 public void setUp() {
63 MockitoAnnotations.initMocks(this);
64
65 getContext().addMockSystemService(AppOpsManager.class, mAppOpsManager);
66
67 mController = new AppOpsControllerImpl(mContext, Dependency.get(Dependency.BG_LOOPER));
68 }
69
70 @Test
71 public void testOnlyListenForFewOps() {
72 mController.setListening(true);
73 verify(mAppOpsManager, times(1)).startWatchingActive(AppOpsControllerImpl.OPS, mController);
74 }
75
76 @Test
77 public void testStopListening() {
78 mController.setListening(false);
79 verify(mAppOpsManager, times(1)).stopWatchingActive(mController);
80 }
81
82 @Test
83 public void addCallback_includedCode() {
Fabian Kozynski510585d2018-12-19 13:59:17 -050084 mController.addCallback(
85 new int[]{AppOpsManager.OP_RECORD_AUDIO, AppOpsManager.OP_FINE_LOCATION},
86 mCallback);
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040087 mController.onOpActiveChanged(
88 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -050089 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
Fabian Kozynski510585d2018-12-19 13:59:17 -050090 AppOpsManager.MODE_ALLOWED);
Fabian Kozynski1f32cf02018-10-23 12:23:31 -040091 verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO,
92 TEST_UID, TEST_PACKAGE_NAME, true);
93 }
94
95 @Test
96 public void addCallback_notIncludedCode() {
97 mController.addCallback(new int[]{AppOpsManager.OP_FINE_LOCATION}, mCallback);
98 mController.onOpActiveChanged(
99 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
100 verify(mCallback, never()).onActiveStateChanged(
101 anyInt(), anyInt(), anyString(), anyBoolean());
102 }
103
104 @Test
105 public void removeCallback_sameCode() {
106 mController.addCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
107 mController.removeCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
108 mController.onOpActiveChanged(
109 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
110 verify(mCallback, never()).onActiveStateChanged(
111 anyInt(), anyInt(), anyString(), anyBoolean());
112 }
113
114 @Test
115 public void addCallback_notSameCode() {
116 mController.addCallback(new int[]{AppOpsManager.OP_RECORD_AUDIO}, mCallback);
Fabian Kozynski510585d2018-12-19 13:59:17 -0500117 mController.removeCallback(new int[]{AppOpsManager.OP_CAMERA}, mCallback);
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400118 mController.onOpActiveChanged(
119 AppOpsManager.OP_RECORD_AUDIO, TEST_UID, TEST_PACKAGE_NAME, true);
120 verify(mCallback).onActiveStateChanged(AppOpsManager.OP_RECORD_AUDIO,
121 TEST_UID, TEST_PACKAGE_NAME, true);
122 }
123
124 @Test
125 public void getActiveItems_sameDetails() {
126 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
127 TEST_UID, TEST_PACKAGE_NAME, true);
128 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
129 TEST_UID, TEST_PACKAGE_NAME, true);
130 assertEquals(1, mController.getActiveAppOps().size());
131 }
132
133 @Test
134 public void getActiveItems_differentDetails() {
135 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
136 TEST_UID, TEST_PACKAGE_NAME, true);
137 mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
138 TEST_UID, TEST_PACKAGE_NAME, true);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -0500139 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500140 TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
141 assertEquals(3, mController.getActiveAppOps().size());
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400142 }
143
Fabian Kozynski510585d2018-12-19 13:59:17 -0500144 @Test
145 public void getActiveItemsForUser() {
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400146 mController.onOpActiveChanged(AppOpsManager.OP_RECORD_AUDIO,
147 TEST_UID, TEST_PACKAGE_NAME, true);
148 mController.onOpActiveChanged(AppOpsManager.OP_CAMERA,
149 TEST_UID_OTHER, TEST_PACKAGE_NAME, true);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -0500150 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500151 TEST_UID, TEST_PACKAGE_NAME, AppOpsManager.MODE_ALLOWED);
152 assertEquals(2,
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400153 mController.getActiveAppOpsForUser(UserHandle.getUserId(TEST_UID)).size());
154 assertEquals(1,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500155 mController.getActiveAppOpsForUser(UserHandle.getUserId(TEST_UID_OTHER)).size());
156 }
157
158 @Test
159 public void opNotedScheduledForRemoval() {
160 mController.setBGHandler(mMockHandler);
Fabian Kozynski0b4592c2018-12-20 12:58:45 -0500161 mController.onOpNoted(AppOpsManager.OP_FINE_LOCATION, TEST_UID, TEST_PACKAGE_NAME,
Fabian Kozynski510585d2018-12-19 13:59:17 -0500162 AppOpsManager.MODE_ALLOWED);
163 verify(mMockHandler).scheduleRemoval(any(AppOpItem.class), anyLong());
Fabian Kozynski1f32cf02018-10-23 12:23:31 -0400164 }
165}