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