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.eq; 19 import static org.mockito.Mockito.mock; 20 import static org.mockito.Mockito.spy; 21 import static org.mockito.Mockito.timeout; 22 import static org.mockito.Mockito.verify; 23 24 import android.content.BroadcastReceiver; 25 import android.content.ComponentName; 26 import android.content.ContentProvider; 27 import android.content.ContentResolver; 28 import android.content.Context; 29 import android.content.Intent; 30 import android.content.IntentFilter; 31 import android.net.Uri; 32 import android.testing.AndroidTestingRunner; 33 34 import androidx.test.filters.SmallTest; 35 36 import com.android.settingslib.SliceBroadcastRelay; 37 38 import org.junit.Test; 39 import org.junit.runner.RunWith; 40 import org.mockito.ArgumentCaptor; 41 42 @RunWith(AndroidTestingRunner.class) 43 @SmallTest 44 public class SliceBroadcastRelayHandlerTest extends SysuiTestCase { 45 46 private static final String TEST_ACTION = "com.android.systemui.action.TEST_ACTION"; 47 48 @Test 49 public void testRegister() { 50 Uri testUri = new Uri.Builder() 51 .scheme(ContentResolver.SCHEME_CONTENT) 52 .authority("something") 53 .path("test") 54 .build(); 55 SliceBroadcastRelayHandler relayHandler = new SliceBroadcastRelayHandler(); 56 relayHandler.mContext = spy(mContext); 57 58 Intent intent = new Intent(SliceBroadcastRelay.ACTION_REGISTER); 59 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 60 intent.putExtra(SliceBroadcastRelay.EXTRA_RECEIVER, 61 new ComponentName(mContext.getPackageName(), Receiver.class.getName())); 62 IntentFilter value = new IntentFilter(TEST_ACTION); 63 intent.putExtra(SliceBroadcastRelay.EXTRA_FILTER, value); 64 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, testUri); 65 66 relayHandler.handleIntent(intent); 67 verify(relayHandler.mContext).registerReceiver(any(), eq(value)); 68 } 69 70 @Test 71 public void testUnregister() { 72 Uri testUri = new Uri.Builder() 73 .scheme(ContentResolver.SCHEME_CONTENT) 74 .authority("something") 75 .path("test") 76 .build(); 77 SliceBroadcastRelayHandler relayHandler = new SliceBroadcastRelayHandler(); 78 relayHandler.mContext = spy(mContext); 79 80 Intent intent = new Intent(SliceBroadcastRelay.ACTION_REGISTER); 81 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 82 intent.putExtra(SliceBroadcastRelay.EXTRA_RECEIVER, 83 new ComponentName(mContext.getPackageName(), Receiver.class.getName())); 84 IntentFilter value = new IntentFilter(TEST_ACTION); 85 intent.putExtra(SliceBroadcastRelay.EXTRA_FILTER, value); 86 87 relayHandler.handleIntent(intent); 88 ArgumentCaptor<BroadcastReceiver> relay = ArgumentCaptor.forClass(BroadcastReceiver.class); 89 verify(relayHandler.mContext).registerReceiver(relay.capture(), eq(value)); 90 91 intent = new Intent(SliceBroadcastRelay.ACTION_UNREGISTER); 92 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 93 relayHandler.handleIntent(intent); 94 verify(relayHandler.mContext).unregisterReceiver(eq(relay.getValue())); 95 } 96 97 @Test 98 public void testUnregisterWithoutRegister() { 99 Uri testUri = new Uri.Builder() 100 .scheme(ContentResolver.SCHEME_CONTENT) 101 .authority("something") 102 .path("test") 103 .build(); 104 SliceBroadcastRelayHandler relayHandler = new SliceBroadcastRelayHandler(); 105 relayHandler.mContext = spy(mContext); 106 107 Intent intent = new Intent(SliceBroadcastRelay.ACTION_UNREGISTER); 108 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 109 relayHandler.handleIntent(intent); 110 // No crash 111 } 112 113 @Test 114 public void testRelay() { 115 Receiver.sReceiver = mock(BroadcastReceiver.class); 116 Uri testUri = new Uri.Builder() 117 .scheme(ContentResolver.SCHEME_CONTENT) 118 .authority("something") 119 .path("test") 120 .build(); 121 SliceBroadcastRelayHandler relayHandler = new SliceBroadcastRelayHandler(); 122 relayHandler.mContext = spy(mContext); 123 124 Intent intent = new Intent(SliceBroadcastRelay.ACTION_REGISTER); 125 intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 126 intent.putExtra(SliceBroadcastRelay.EXTRA_RECEIVER, 127 new ComponentName(mContext.getPackageName(), Receiver.class.getName())); 128 IntentFilter value = new IntentFilter(TEST_ACTION); 129 intent.putExtra(SliceBroadcastRelay.EXTRA_FILTER, value); 130 131 relayHandler.handleIntent(intent); 132 ArgumentCaptor<BroadcastReceiver> relay = ArgumentCaptor.forClass(BroadcastReceiver.class); 133 verify(relayHandler.mContext).registerReceiver(relay.capture(), eq(value)); 134 relay.getValue().onReceive(relayHandler.mContext, new Intent(TEST_ACTION)); 135 136 verify(Receiver.sReceiver, timeout(2000)).onReceive(any(), any()); 137 } 138 139 public static class Receiver extends BroadcastReceiver { 140 private static BroadcastReceiver sReceiver; 141 142 @Override 143 public void onReceive(Context context, Intent intent) { 144 if (sReceiver != null) sReceiver.onReceive(context, intent); 145 } 146 } 147 148 }