1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package com.android.systemui; 16 17 import static org.mockito.ArgumentMatchers.any; 18 import static org.mockito.ArgumentMatchers.anyInt; 19 import static org.mockito.ArgumentMatchers.eq; 20 import static org.mockito.Mockito.mock; 21 import static org.mockito.Mockito.never; 22 import static org.mockito.Mockito.spy; 23 import static org.mockito.Mockito.timeout; 24 import static org.mockito.Mockito.verify; 25 26 import android.content.BroadcastReceiver; 27 import android.content.ComponentName; 28 import android.content.ContentProvider; 29 import android.content.ContentResolver; 30 import android.content.Context; 31 import android.content.Intent; 32 import android.content.IntentFilter; 33 import android.net.Uri; 34 import android.testing.AndroidTestingRunner; 35 36 import androidx.test.filters.SmallTest; 37 38 import com.android.settingslib.SliceBroadcastRelay; 39 import com.android.systemui.broadcast.BroadcastDispatcher; 40 41 import org.junit.Before; 42 import org.junit.Test; 43 import org.junit.runner.RunWith; 44 import org.mockito.ArgumentCaptor; 45 import org.mockito.Mock; 46 import org.mockito.MockitoAnnotations; 47 48 @RunWith(AndroidTestingRunner.class) 49 @SmallTest 50 public class SliceBroadcastRelayHandlerTest extends SysuiTestCase { 51 52 private static final String TEST_ACTION = "com.android.systemui.action.TEST_ACTION"; 53 private SliceBroadcastRelayHandler mRelayHandler; 54 private Context mSpyContext; 55 @Mock 56 private BroadcastDispatcher mBroadcastDispatcher; 57 58 @Before setup()59 public void setup() { 60 MockitoAnnotations.initMocks(this); 61 mSpyContext = spy(mContext); 62 63 mRelayHandler = new SliceBroadcastRelayHandler(mSpyContext, mBroadcastDispatcher); 64 } 65 66 @Test testRegister()67 public void testRegister() { 68 Uri testUri = new Uri.Builder() 69 .scheme(ContentResolver.SCHEME_CONTENT) 70 .authority("something") 71 .path("test") 72 .build(); 73 74 Intent intent = new Intent(SliceBroadcastRelay.ACTION_REGISTER); 75 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 76 intent.putExtra(SliceBroadcastRelay.EXTRA_RECEIVER, 77 new ComponentName(mContext.getPackageName(), Receiver.class.getName())); 78 IntentFilter value = new IntentFilter(TEST_ACTION); 79 intent.putExtra(SliceBroadcastRelay.EXTRA_FILTER, value); 80 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, testUri); 81 82 mRelayHandler.handleIntent(intent); 83 verify(mSpyContext).registerReceiver(any(), eq(value), anyInt()); 84 } 85 86 @Test testUnregister()87 public void testUnregister() { 88 Uri testUri = new Uri.Builder() 89 .scheme(ContentResolver.SCHEME_CONTENT) 90 .authority("something") 91 .path("test") 92 .build(); 93 94 Intent intent = new Intent(SliceBroadcastRelay.ACTION_REGISTER); 95 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 96 intent.putExtra(SliceBroadcastRelay.EXTRA_RECEIVER, 97 new ComponentName(mContext.getPackageName(), Receiver.class.getName())); 98 IntentFilter value = new IntentFilter(TEST_ACTION); 99 intent.putExtra(SliceBroadcastRelay.EXTRA_FILTER, value); 100 101 mRelayHandler.handleIntent(intent); 102 ArgumentCaptor<BroadcastReceiver> relay = ArgumentCaptor.forClass(BroadcastReceiver.class); 103 verify(mSpyContext).registerReceiver(relay.capture(), eq(value), anyInt()); 104 105 intent = new Intent(SliceBroadcastRelay.ACTION_UNREGISTER); 106 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 107 mRelayHandler.handleIntent(intent); 108 verify(mSpyContext).unregisterReceiver(eq(relay.getValue())); 109 } 110 111 @Test testUnregisterWithoutRegister()112 public void testUnregisterWithoutRegister() { 113 Uri testUri = new Uri.Builder() 114 .scheme(ContentResolver.SCHEME_CONTENT) 115 .authority("something") 116 .path("test") 117 .build(); 118 119 Intent intent = new Intent(SliceBroadcastRelay.ACTION_UNREGISTER); 120 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 121 mRelayHandler.handleIntent(intent); 122 // No crash 123 } 124 125 @Test testRelay()126 public void testRelay() { 127 Receiver.sReceiver = mock(BroadcastReceiver.class); 128 Uri testUri = new Uri.Builder() 129 .scheme(ContentResolver.SCHEME_CONTENT) 130 .authority("something") 131 .path("test") 132 .build(); 133 Intent intent = new Intent(SliceBroadcastRelay.ACTION_REGISTER); 134 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 135 intent.putExtra(SliceBroadcastRelay.EXTRA_RECEIVER, 136 new ComponentName(mContext.getPackageName(), Receiver.class.getName())); 137 IntentFilter value = new IntentFilter(TEST_ACTION); 138 intent.putExtra(SliceBroadcastRelay.EXTRA_FILTER, value); 139 140 mRelayHandler.handleIntent(intent); 141 ArgumentCaptor<BroadcastReceiver> relay = ArgumentCaptor.forClass(BroadcastReceiver.class); 142 verify(mSpyContext).registerReceiver(relay.capture(), eq(value), anyInt()); 143 relay.getValue().onReceive(mSpyContext, new Intent(TEST_ACTION)); 144 145 verify(Receiver.sReceiver, timeout(2000)).onReceive(any(), any()); 146 } 147 148 @Test testRegisteredWithDispatcher()149 public void testRegisteredWithDispatcher() { 150 mRelayHandler.start(); 151 152 verify(mBroadcastDispatcher) 153 .registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class)); 154 verify(mSpyContext, never()) 155 .registerReceiver(any(BroadcastReceiver.class), any(IntentFilter.class)); 156 } 157 158 public static class Receiver extends BroadcastReceiver { 159 private static BroadcastReceiver sReceiver; 160 161 @Override onReceive(Context context, Intent intent)162 public void onReceive(Context context, Intent intent) { 163 if (sReceiver != null) sReceiver.onReceive(context, intent); 164 } 165 } 166 167 }