Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2019 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.systemui.broadcast |
| 18 | |
| 19 | import android.content.BroadcastReceiver |
| 20 | import android.content.Context |
| 21 | import android.content.Intent |
| 22 | import android.content.IntentFilter |
| 23 | import android.os.Handler |
| 24 | import android.os.UserHandle |
| 25 | import android.test.suitebuilder.annotation.SmallTest |
| 26 | import android.testing.AndroidTestingRunner |
| 27 | import android.testing.TestableLooper |
| 28 | import com.android.systemui.SysuiTestCase |
| 29 | import junit.framework.Assert.assertEquals |
| 30 | import junit.framework.Assert.assertFalse |
| 31 | import junit.framework.Assert.assertTrue |
| 32 | import org.junit.Before |
| 33 | import org.junit.Test |
| 34 | import org.junit.runner.RunWith |
| 35 | import org.mockito.ArgumentCaptor |
| 36 | import org.mockito.ArgumentMatchers.any |
| 37 | import org.mockito.ArgumentMatchers.anyInt |
| 38 | import org.mockito.ArgumentMatchers.eq |
| 39 | import org.mockito.Captor |
| 40 | import org.mockito.Mock |
| 41 | import org.mockito.Mockito.anyString |
| 42 | import org.mockito.Mockito.atLeastOnce |
| 43 | import org.mockito.Mockito.never |
| 44 | import org.mockito.Mockito.reset |
| 45 | import org.mockito.Mockito.times |
| 46 | import org.mockito.Mockito.verify |
| 47 | import org.mockito.MockitoAnnotations |
| 48 | |
| 49 | @RunWith(AndroidTestingRunner::class) |
| 50 | @TestableLooper.RunWithLooper |
| 51 | @SmallTest |
| 52 | class UserBroadcastDispatcherTest : SysuiTestCase() { |
| 53 | |
| 54 | companion object { |
| 55 | private const val ACTION_1 = "com.android.systemui.tests.ACTION_1" |
| 56 | private const val ACTION_2 = "com.android.systemui.tests.ACTION_2" |
| 57 | private const val CATEGORY_1 = "com.android.systemui.tests.CATEGORY_1" |
| 58 | private const val CATEGORY_2 = "com.android.systemui.tests.CATEGORY_2" |
| 59 | private const val USER_ID = 0 |
| 60 | private val USER_HANDLE = UserHandle.of(USER_ID) |
| 61 | |
| 62 | fun <T> capture(argumentCaptor: ArgumentCaptor<T>): T = argumentCaptor.capture() |
| 63 | } |
| 64 | |
| 65 | @Mock |
| 66 | private lateinit var broadcastReceiver: BroadcastReceiver |
| 67 | @Mock |
| 68 | private lateinit var broadcastReceiverOther: BroadcastReceiver |
| 69 | @Mock |
| 70 | private lateinit var mockContext: Context |
| 71 | @Mock |
| 72 | private lateinit var mockHandler: Handler |
Fabian Kozynski | ff5e91f | 2019-09-24 15:38:08 -0400 | [diff] [blame] | 73 | @Mock |
| 74 | private lateinit var mPendingResult: BroadcastReceiver.PendingResult |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 75 | |
| 76 | @Captor |
| 77 | private lateinit var argumentCaptor: ArgumentCaptor<IntentFilter> |
| 78 | |
| 79 | private lateinit var testableLooper: TestableLooper |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 80 | private lateinit var userBroadcastDispatcher: UserBroadcastDispatcher |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 81 | private lateinit var intentFilter: IntentFilter |
| 82 | private lateinit var intentFilterOther: IntentFilter |
| 83 | private lateinit var handler: Handler |
| 84 | |
| 85 | @Before |
| 86 | fun setUp() { |
| 87 | MockitoAnnotations.initMocks(this) |
| 88 | testableLooper = TestableLooper.get(this) |
| 89 | handler = Handler(testableLooper.looper) |
| 90 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 91 | userBroadcastDispatcher = UserBroadcastDispatcher( |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 92 | mockContext, USER_ID, handler, testableLooper.looper) |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 93 | userBroadcastDispatcher.pendingResult = mPendingResult |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 94 | } |
| 95 | |
| 96 | @Test |
| 97 | fun testNotRegisteredOnStart() { |
| 98 | testableLooper.processAllMessages() |
| 99 | verify(mockContext, never()).registerReceiver(any(), any()) |
| 100 | verify(mockContext, never()).registerReceiver(any(), any(), anyInt()) |
| 101 | verify(mockContext, never()).registerReceiver(any(), any(), anyString(), any()) |
| 102 | verify(mockContext, never()).registerReceiver(any(), any(), anyString(), any(), anyInt()) |
| 103 | verify(mockContext, never()).registerReceiverAsUser(any(), any(), any(), anyString(), any()) |
| 104 | } |
| 105 | |
| 106 | @Test |
| 107 | fun testSingleReceiverRegistered() { |
| 108 | intentFilter = IntentFilter(ACTION_1) |
| 109 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 110 | userBroadcastDispatcher.registerReceiver( |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 111 | ReceiverData(broadcastReceiver, intentFilter, mockHandler, USER_HANDLE)) |
| 112 | testableLooper.processAllMessages() |
| 113 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 114 | assertTrue(userBroadcastDispatcher.isRegistered()) |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 115 | verify(mockContext).registerReceiverAsUser( |
| 116 | any(), |
| 117 | eq(USER_HANDLE), |
| 118 | capture(argumentCaptor), |
| 119 | any(), |
| 120 | any()) |
| 121 | assertEquals(1, argumentCaptor.value.countActions()) |
| 122 | assertTrue(argumentCaptor.value.hasAction(ACTION_1)) |
| 123 | assertEquals(0, argumentCaptor.value.countCategories()) |
| 124 | } |
| 125 | |
| 126 | @Test |
| 127 | fun testSingleReceiverUnregistered() { |
| 128 | intentFilter = IntentFilter(ACTION_1) |
| 129 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 130 | userBroadcastDispatcher.registerReceiver( |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 131 | ReceiverData(broadcastReceiver, intentFilter, mockHandler, USER_HANDLE)) |
| 132 | testableLooper.processAllMessages() |
| 133 | reset(mockContext) |
| 134 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 135 | assertTrue(userBroadcastDispatcher.isRegistered()) |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 136 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 137 | userBroadcastDispatcher.unregisterReceiver(broadcastReceiver) |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 138 | testableLooper.processAllMessages() |
| 139 | |
| 140 | verify(mockContext, atLeastOnce()).unregisterReceiver(any()) |
| 141 | verify(mockContext, never()).registerReceiverAsUser(any(), any(), any(), any(), any()) |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 142 | assertFalse(userBroadcastDispatcher.isRegistered()) |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 143 | } |
| 144 | |
| 145 | @Test |
| 146 | fun testFilterHasAllActionsAndCategories_twoReceivers() { |
| 147 | intentFilter = IntentFilter(ACTION_1) |
| 148 | intentFilterOther = IntentFilter(ACTION_2).apply { |
| 149 | addCategory(CATEGORY_1) |
| 150 | addCategory(CATEGORY_2) |
| 151 | } |
| 152 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 153 | userBroadcastDispatcher.registerReceiver( |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 154 | ReceiverData(broadcastReceiver, intentFilter, mockHandler, USER_HANDLE)) |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 155 | userBroadcastDispatcher.registerReceiver( |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 156 | ReceiverData(broadcastReceiverOther, intentFilterOther, mockHandler, USER_HANDLE)) |
| 157 | |
| 158 | testableLooper.processAllMessages() |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 159 | assertTrue(userBroadcastDispatcher.isRegistered()) |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 160 | |
| 161 | verify(mockContext, times(2)).registerReceiverAsUser( |
| 162 | any(), |
| 163 | eq(USER_HANDLE), |
| 164 | capture(argumentCaptor), |
| 165 | any(), |
| 166 | any()) |
| 167 | |
| 168 | val lastFilter = argumentCaptor.value |
| 169 | |
| 170 | assertTrue(lastFilter.hasAction(ACTION_1)) |
| 171 | assertTrue(lastFilter.hasAction(ACTION_2)) |
| 172 | assertTrue(lastFilter.hasCategory(CATEGORY_1)) |
| 173 | assertTrue(lastFilter.hasCategory(CATEGORY_1)) |
| 174 | } |
| 175 | |
| 176 | @Test |
| 177 | fun testDispatchToCorrectReceiver() { |
| 178 | intentFilter = IntentFilter(ACTION_1) |
| 179 | intentFilterOther = IntentFilter(ACTION_2) |
| 180 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 181 | userBroadcastDispatcher.registerReceiver( |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 182 | ReceiverData(broadcastReceiver, intentFilter, handler, USER_HANDLE)) |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 183 | userBroadcastDispatcher.registerReceiver( |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 184 | ReceiverData(broadcastReceiverOther, intentFilterOther, handler, USER_HANDLE)) |
| 185 | |
| 186 | val intent = Intent(ACTION_2) |
| 187 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 188 | userBroadcastDispatcher.onReceive(mockContext, intent) |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 189 | testableLooper.processAllMessages() |
| 190 | |
| 191 | verify(broadcastReceiver, never()).onReceive(any(), any()) |
| 192 | verify(broadcastReceiverOther).onReceive(mockContext, intent) |
| 193 | } |
| 194 | |
| 195 | @Test |
| 196 | fun testDispatchToCorrectReceiver_differentFiltersSameReceiver() { |
| 197 | intentFilter = IntentFilter(ACTION_1) |
| 198 | intentFilterOther = IntentFilter(ACTION_2) |
| 199 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 200 | userBroadcastDispatcher.registerReceiver( |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 201 | ReceiverData(broadcastReceiver, intentFilter, handler, USER_HANDLE)) |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 202 | userBroadcastDispatcher.registerReceiver( |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 203 | ReceiverData(broadcastReceiver, intentFilterOther, handler, USER_HANDLE)) |
| 204 | |
| 205 | val intent = Intent(ACTION_2) |
| 206 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 207 | userBroadcastDispatcher.onReceive(mockContext, intent) |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 208 | testableLooper.processAllMessages() |
| 209 | |
| 210 | verify(broadcastReceiver).onReceive(mockContext, intent) |
| 211 | } |
| 212 | |
| 213 | @Test |
| 214 | fun testDispatchIntentWithoutCategories() { |
| 215 | intentFilter = IntentFilter(ACTION_1) |
| 216 | intentFilter.addCategory(CATEGORY_1) |
| 217 | intentFilterOther = IntentFilter(ACTION_1) |
| 218 | intentFilterOther.addCategory(CATEGORY_2) |
| 219 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 220 | userBroadcastDispatcher.registerReceiver( |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 221 | ReceiverData(broadcastReceiver, intentFilter, handler, USER_HANDLE)) |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 222 | userBroadcastDispatcher.registerReceiver( |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 223 | ReceiverData(broadcastReceiverOther, intentFilterOther, handler, USER_HANDLE)) |
| 224 | |
| 225 | val intent = Intent(ACTION_1) |
| 226 | |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 227 | userBroadcastDispatcher.onReceive(mockContext, intent) |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 228 | testableLooper.processAllMessages() |
| 229 | |
| 230 | verify(broadcastReceiver).onReceive(mockContext, intent) |
| 231 | verify(broadcastReceiverOther).onReceive(mockContext, intent) |
| 232 | } |
Fabian Kozynski | ff5e91f | 2019-09-24 15:38:08 -0400 | [diff] [blame] | 233 | |
| 234 | @Test |
| 235 | fun testPendingResult() { |
| 236 | intentFilter = IntentFilter(ACTION_1) |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 237 | userBroadcastDispatcher.registerReceiver( |
Fabian Kozynski | ff5e91f | 2019-09-24 15:38:08 -0400 | [diff] [blame] | 238 | ReceiverData(broadcastReceiver, intentFilter, handler, USER_HANDLE)) |
| 239 | |
| 240 | val intent = Intent(ACTION_1) |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 241 | userBroadcastDispatcher.onReceive(mockContext, intent) |
Fabian Kozynski | ff5e91f | 2019-09-24 15:38:08 -0400 | [diff] [blame] | 242 | |
| 243 | testableLooper.processAllMessages() |
| 244 | |
| 245 | verify(broadcastReceiver).onReceive(mockContext, intent) |
| 246 | verify(broadcastReceiver).pendingResult = mPendingResult |
| 247 | } |
Fabian Kozynski | e68fa40 | 2019-11-21 15:47:23 -0500 | [diff] [blame] | 248 | |
| 249 | @Test |
| 250 | fun testRemoveReceiverReferences() { |
| 251 | intentFilter = IntentFilter(ACTION_1) |
| 252 | userBroadcastDispatcher.registerReceiver( |
| 253 | ReceiverData(broadcastReceiver, intentFilter, handler, USER_HANDLE)) |
| 254 | |
| 255 | intentFilterOther = IntentFilter(ACTION_1) |
| 256 | intentFilterOther.addAction(ACTION_2) |
| 257 | userBroadcastDispatcher.registerReceiver( |
| 258 | ReceiverData(broadcastReceiverOther, intentFilterOther, handler, USER_HANDLE)) |
| 259 | |
| 260 | userBroadcastDispatcher.unregisterReceiver(broadcastReceiver) |
| 261 | testableLooper.processAllMessages() |
| 262 | |
| 263 | assertFalse(userBroadcastDispatcher.isReceiverReferenceHeld(broadcastReceiver)) |
| 264 | } |
Fabian Kozynski | 42f86a0 | 2019-07-09 12:39:03 -0400 | [diff] [blame] | 265 | } |