blob: 21ed15517752f8e64107fef7f6205d63f66088b6 [file] [log] [blame]
Fabian Kozynski42f86a02019-07-09 12:39:03 -04001/*
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
17package com.android.systemui.broadcast
18
19import android.content.BroadcastReceiver
20import android.content.Context
21import android.content.Intent
22import android.content.IntentFilter
23import android.os.Handler
24import android.os.UserHandle
25import android.test.suitebuilder.annotation.SmallTest
26import android.testing.AndroidTestingRunner
27import android.testing.TestableLooper
28import com.android.systemui.SysuiTestCase
29import junit.framework.Assert.assertEquals
30import junit.framework.Assert.assertFalse
31import junit.framework.Assert.assertTrue
32import org.junit.Before
33import org.junit.Test
34import org.junit.runner.RunWith
35import org.mockito.ArgumentCaptor
36import org.mockito.ArgumentMatchers.any
37import org.mockito.ArgumentMatchers.anyInt
38import org.mockito.ArgumentMatchers.eq
39import org.mockito.Captor
40import org.mockito.Mock
41import org.mockito.Mockito.anyString
42import org.mockito.Mockito.atLeastOnce
43import org.mockito.Mockito.never
44import org.mockito.Mockito.reset
45import org.mockito.Mockito.times
46import org.mockito.Mockito.verify
47import org.mockito.MockitoAnnotations
48
49@RunWith(AndroidTestingRunner::class)
50@TestableLooper.RunWithLooper
51@SmallTest
52class 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 Kozynskiff5e91f2019-09-24 15:38:08 -040073 @Mock
74 private lateinit var mPendingResult: BroadcastReceiver.PendingResult
Fabian Kozynski42f86a02019-07-09 12:39:03 -040075
76 @Captor
77 private lateinit var argumentCaptor: ArgumentCaptor<IntentFilter>
78
79 private lateinit var testableLooper: TestableLooper
Fabian Kozynskie68fa402019-11-21 15:47:23 -050080 private lateinit var userBroadcastDispatcher: UserBroadcastDispatcher
Fabian Kozynski42f86a02019-07-09 12:39:03 -040081 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 Kozynskie68fa402019-11-21 15:47:23 -050091 userBroadcastDispatcher = UserBroadcastDispatcher(
Fabian Kozynski42f86a02019-07-09 12:39:03 -040092 mockContext, USER_ID, handler, testableLooper.looper)
Fabian Kozynskie68fa402019-11-21 15:47:23 -050093 userBroadcastDispatcher.pendingResult = mPendingResult
Fabian Kozynski42f86a02019-07-09 12:39:03 -040094 }
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 Kozynskie68fa402019-11-21 15:47:23 -0500110 userBroadcastDispatcher.registerReceiver(
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400111 ReceiverData(broadcastReceiver, intentFilter, mockHandler, USER_HANDLE))
112 testableLooper.processAllMessages()
113
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500114 assertTrue(userBroadcastDispatcher.isRegistered())
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400115 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 Kozynskie68fa402019-11-21 15:47:23 -0500130 userBroadcastDispatcher.registerReceiver(
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400131 ReceiverData(broadcastReceiver, intentFilter, mockHandler, USER_HANDLE))
132 testableLooper.processAllMessages()
133 reset(mockContext)
134
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500135 assertTrue(userBroadcastDispatcher.isRegistered())
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400136
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500137 userBroadcastDispatcher.unregisterReceiver(broadcastReceiver)
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400138 testableLooper.processAllMessages()
139
140 verify(mockContext, atLeastOnce()).unregisterReceiver(any())
141 verify(mockContext, never()).registerReceiverAsUser(any(), any(), any(), any(), any())
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500142 assertFalse(userBroadcastDispatcher.isRegistered())
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400143 }
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 Kozynskie68fa402019-11-21 15:47:23 -0500153 userBroadcastDispatcher.registerReceiver(
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400154 ReceiverData(broadcastReceiver, intentFilter, mockHandler, USER_HANDLE))
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500155 userBroadcastDispatcher.registerReceiver(
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400156 ReceiverData(broadcastReceiverOther, intentFilterOther, mockHandler, USER_HANDLE))
157
158 testableLooper.processAllMessages()
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500159 assertTrue(userBroadcastDispatcher.isRegistered())
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400160
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 Kozynskie68fa402019-11-21 15:47:23 -0500181 userBroadcastDispatcher.registerReceiver(
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400182 ReceiverData(broadcastReceiver, intentFilter, handler, USER_HANDLE))
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500183 userBroadcastDispatcher.registerReceiver(
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400184 ReceiverData(broadcastReceiverOther, intentFilterOther, handler, USER_HANDLE))
185
186 val intent = Intent(ACTION_2)
187
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500188 userBroadcastDispatcher.onReceive(mockContext, intent)
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400189 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 Kozynskie68fa402019-11-21 15:47:23 -0500200 userBroadcastDispatcher.registerReceiver(
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400201 ReceiverData(broadcastReceiver, intentFilter, handler, USER_HANDLE))
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500202 userBroadcastDispatcher.registerReceiver(
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400203 ReceiverData(broadcastReceiver, intentFilterOther, handler, USER_HANDLE))
204
205 val intent = Intent(ACTION_2)
206
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500207 userBroadcastDispatcher.onReceive(mockContext, intent)
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400208 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 Kozynskie68fa402019-11-21 15:47:23 -0500220 userBroadcastDispatcher.registerReceiver(
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400221 ReceiverData(broadcastReceiver, intentFilter, handler, USER_HANDLE))
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500222 userBroadcastDispatcher.registerReceiver(
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400223 ReceiverData(broadcastReceiverOther, intentFilterOther, handler, USER_HANDLE))
224
225 val intent = Intent(ACTION_1)
226
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500227 userBroadcastDispatcher.onReceive(mockContext, intent)
Fabian Kozynski42f86a02019-07-09 12:39:03 -0400228 testableLooper.processAllMessages()
229
230 verify(broadcastReceiver).onReceive(mockContext, intent)
231 verify(broadcastReceiverOther).onReceive(mockContext, intent)
232 }
Fabian Kozynskiff5e91f2019-09-24 15:38:08 -0400233
234 @Test
235 fun testPendingResult() {
236 intentFilter = IntentFilter(ACTION_1)
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500237 userBroadcastDispatcher.registerReceiver(
Fabian Kozynskiff5e91f2019-09-24 15:38:08 -0400238 ReceiverData(broadcastReceiver, intentFilter, handler, USER_HANDLE))
239
240 val intent = Intent(ACTION_1)
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500241 userBroadcastDispatcher.onReceive(mockContext, intent)
Fabian Kozynskiff5e91f2019-09-24 15:38:08 -0400242
243 testableLooper.processAllMessages()
244
245 verify(broadcastReceiver).onReceive(mockContext, intent)
246 verify(broadcastReceiver).pendingResult = mPendingResult
247 }
Fabian Kozynskie68fa402019-11-21 15:47:23 -0500248
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 Kozynski42f86a02019-07-09 12:39:03 -0400265}