1 /*
2  * Copyright (C) 2021 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.server.statusbar;
18 
19 import static org.junit.Assert.assertEquals;
20 import static org.junit.Assert.assertFalse;
21 import static org.junit.Assert.assertNotNull;
22 import static org.junit.Assert.assertNull;
23 import static org.junit.Assert.assertTrue;
24 
25 import android.content.ComponentName;
26 import android.content.Intent;
27 import android.content.IntentFilter;
28 import android.net.Uri;
29 import android.os.UserHandle;
30 
31 import androidx.test.InstrumentationRegistry;
32 
33 import org.junit.Before;
34 import org.junit.Rule;
35 import org.junit.Test;
36 import org.junit.runner.RunWith;
37 import org.junit.runners.JUnit4;
38 import org.mockito.MockitoAnnotations;
39 
40 @RunWith(JUnit4.class)
41 public class TileRequestTrackerTest {
42 
43     private static final String TEST_PACKAGE = "test_pkg";
44     private static final String TEST_SERVICE = "test_svc";
45     private static final String TEST_SERVICE_OTHER = "test_svc_other";
46     private static final ComponentName TEST_COMPONENT = new ComponentName(TEST_PACKAGE,
47             TEST_SERVICE);
48     private static final ComponentName TEST_COMPONENT_OTHER = new ComponentName(TEST_PACKAGE,
49             TEST_SERVICE_OTHER);
50     private static final ComponentName TEST_COMPONENT_OTHER_PACKAGE = new ComponentName("other",
51             TEST_SERVICE);
52     private static final int USER_ID = 0;
53     private static final int USER_ID_OTHER = 10;
54     private static final int APP_UID = 12345;
55     private static final int USER_UID = UserHandle.getUid(USER_ID, APP_UID);
56     private static final int USER_OTHER_UID = UserHandle.getUid(USER_ID_OTHER, APP_UID);
57 
58     @Rule
59     public final NoBroadcastContextWrapper mContext =
60             new NoBroadcastContextWrapper(InstrumentationRegistry.getContext());
61 
62     private TileRequestTracker mTileRequestTracker;
63 
64     @Before
setUp()65     public void setUp() {
66         MockitoAnnotations.initMocks(this);
67 
68         mTileRequestTracker = new TileRequestTracker(mContext);
69     }
70 
71     @Test
testBroadcastReceiverRegistered()72     public void testBroadcastReceiverRegistered() {
73         NoBroadcastContextWrapper.BroadcastReceiverRegistration reg = getReceiverRegistration();
74 
75         assertEquals(UserHandle.ALL, reg.mUser);
76         assertNull(reg.mBroadcastPermission);
77         assertNotNull(reg.mReceiver);
78 
79         IntentFilter filter = reg.mIntentFilter;
80         assertEquals(2, filter.countActions());
81         assertTrue(filter.hasAction(Intent.ACTION_PACKAGE_REMOVED));
82         assertTrue(filter.hasAction(Intent.ACTION_PACKAGE_DATA_CLEARED));
83         assertTrue(filter.hasDataScheme("package"));
84     }
85 
86     @Test
testNoDenialsFromStart()87     public void testNoDenialsFromStart() {
88         // Certainly not an exhaustive test
89         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT));
90         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID_OTHER, TEST_COMPONENT));
91         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT_OTHER));
92         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID_OTHER, TEST_COMPONENT_OTHER));
93     }
94 
95     @Test
testNoDenialBeforeMax()96     public void testNoDenialBeforeMax() {
97         for (int i = 1; i < TileRequestTracker.MAX_NUM_DENIALS; i++) {
98             mTileRequestTracker.addDenial(USER_ID, TEST_COMPONENT);
99         }
100 
101         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT));
102     }
103 
104     @Test
testDenialOnMax()105     public void testDenialOnMax() {
106         for (int i = 1; i <= TileRequestTracker.MAX_NUM_DENIALS; i++) {
107             mTileRequestTracker.addDenial(USER_ID, TEST_COMPONENT);
108         }
109         assertTrue(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT));
110     }
111 
112     @Test
testDenialPerUser()113     public void testDenialPerUser() {
114         for (int i = 1; i <= TileRequestTracker.MAX_NUM_DENIALS; i++) {
115             mTileRequestTracker.addDenial(USER_ID, TEST_COMPONENT);
116         }
117 
118         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID_OTHER, TEST_COMPONENT));
119     }
120 
121     @Test
testDenialPerComponent()122     public void testDenialPerComponent() {
123         for (int i = 1; i <= TileRequestTracker.MAX_NUM_DENIALS; i++) {
124             mTileRequestTracker.addDenial(USER_ID, TEST_COMPONENT);
125         }
126 
127         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT_OTHER));
128     }
129 
130     @Test
testPackageUninstallRemovesDenials_allComponents()131     public void testPackageUninstallRemovesDenials_allComponents() {
132         for (int i = 1; i <= TileRequestTracker.MAX_NUM_DENIALS; i++) {
133             mTileRequestTracker.addDenial(USER_ID, TEST_COMPONENT);
134             mTileRequestTracker.addDenial(USER_ID, TEST_COMPONENT_OTHER);
135         }
136 
137         Intent intent = new Intent(Intent.ACTION_PACKAGE_REMOVED);
138         intent.putExtra(Intent.EXTRA_UID, USER_UID);
139         intent.setData(Uri.parse("package:" + TEST_PACKAGE));
140         getReceiverRegistration().mReceiver.onReceive(mContext, intent);
141 
142         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT));
143         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT_OTHER));
144     }
145 
146     @Test
testPackageUninstallRemoveDenials_differentUsers()147     public void testPackageUninstallRemoveDenials_differentUsers() {
148         for (int i = 1; i <= TileRequestTracker.MAX_NUM_DENIALS; i++) {
149             mTileRequestTracker.addDenial(USER_ID, TEST_COMPONENT);
150             mTileRequestTracker.addDenial(USER_ID_OTHER, TEST_COMPONENT);
151         }
152 
153         Intent intent = new Intent(Intent.ACTION_PACKAGE_REMOVED);
154         intent.putExtra(Intent.EXTRA_UID, USER_OTHER_UID);
155         intent.setData(Uri.parse("package:" + TEST_PACKAGE));
156         getReceiverRegistration().mReceiver.onReceive(mContext, intent);
157 
158         // User 0 package was not removed
159         assertTrue(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT));
160         // User 10 package was removed
161         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID_OTHER, TEST_COMPONENT));
162     }
163 
164     @Test
testPackageUninstallRemoveDenials_differentPackages()165     public void testPackageUninstallRemoveDenials_differentPackages() {
166         for (int i = 1; i <= TileRequestTracker.MAX_NUM_DENIALS; i++) {
167             mTileRequestTracker.addDenial(USER_ID, TEST_COMPONENT);
168             mTileRequestTracker.addDenial(USER_ID, TEST_COMPONENT_OTHER_PACKAGE);
169         }
170 
171         Intent intent = new Intent(Intent.ACTION_PACKAGE_REMOVED);
172         intent.putExtra(Intent.EXTRA_UID, USER_UID);
173         intent.setData(Uri.parse("package:" + TEST_PACKAGE));
174         getReceiverRegistration().mReceiver.onReceive(mContext, intent);
175 
176         // Package TEST_PACKAGE removed
177         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT));
178         // Package "other" not removed
179         assertTrue(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT_OTHER_PACKAGE));
180     }
181 
182     @Test
testPackageUpdateDoesntRemoveDenials()183     public void testPackageUpdateDoesntRemoveDenials() {
184         for (int i = 1; i <= TileRequestTracker.MAX_NUM_DENIALS; i++) {
185             mTileRequestTracker.addDenial(USER_ID, TEST_COMPONENT);
186         }
187 
188         Intent intent = new Intent(Intent.ACTION_PACKAGE_REMOVED);
189         intent.putExtra(Intent.EXTRA_REPLACING, true);
190         intent.putExtra(Intent.EXTRA_UID, USER_UID);
191         intent.setData(Uri.parse("package:" + TEST_PACKAGE));
192         getReceiverRegistration().mReceiver.onReceive(mContext, intent);
193 
194         assertTrue(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT));
195     }
196 
197     @Test
testClearPackageDataRemovesDenials()198     public void testClearPackageDataRemovesDenials() {
199         for (int i = 1; i <= TileRequestTracker.MAX_NUM_DENIALS; i++) {
200             mTileRequestTracker.addDenial(USER_ID, TEST_COMPONENT);
201         }
202 
203         Intent intent = new Intent(Intent.ACTION_PACKAGE_DATA_CLEARED);
204         intent.putExtra(Intent.EXTRA_UID, USER_UID);
205         intent.setData(Uri.parse("package:" + TEST_PACKAGE));
206         getReceiverRegistration().mReceiver.onReceive(mContext, intent);
207 
208         assertFalse(mTileRequestTracker.shouldBeDenied(USER_ID, TEST_COMPONENT));
209     }
210 
getReceiverRegistration()211     private NoBroadcastContextWrapper.BroadcastReceiverRegistration getReceiverRegistration() {
212         assertEquals(1, mContext.mRegistrationList.size());
213         return mContext.mRegistrationList.get(0);
214     }
215 }
216