10b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk/* 20b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk * Copyright (C) 2018 The Android Open Source Project 30b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk * 40b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 50b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk * except in compliance with the License. You may obtain a copy of the License at 60b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk * 70b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk * http://www.apache.org/licenses/LICENSE-2.0 80b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk * 90b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk * Unless required by applicable law or agreed to in writing, software distributed under the 100b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 110b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk * KIND, either express or implied. See the License for the specific language governing 120b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk * permissions and limitations under the License. 130b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk */ 140b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 150b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkpackage com.android.systemui; 160b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 170b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport static org.mockito.ArgumentMatchers.any; 180b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport static org.mockito.ArgumentMatchers.eq; 190b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport static org.mockito.Mockito.mock; 200b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport static org.mockito.Mockito.spy; 210b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport static org.mockito.Mockito.timeout; 220b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport static org.mockito.Mockito.verify; 230b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 240b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport android.content.BroadcastReceiver; 250b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport android.content.ComponentName; 260b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport android.content.ContentProvider; 270b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport android.content.ContentResolver; 280b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport android.content.Context; 290b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport android.content.Intent; 300b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport android.content.IntentFilter; 310b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport android.net.Uri; 320b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport android.support.test.filters.SmallTest; 330b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport android.testing.AndroidTestingRunner; 340b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 350b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport com.android.settingslib.SliceBroadcastRelay; 360b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 370b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport org.junit.Test; 380b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport org.junit.runner.RunWith; 390b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkimport org.mockito.ArgumentCaptor; 400b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 410b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk@RunWith(AndroidTestingRunner.class) 420b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk@SmallTest 430b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monkpublic class SliceBroadcastRelayHandlerTest extends SysuiTestCase { 440b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 450b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk private static final String TEST_ACTION = "com.android.systemui.action.TEST_ACTION"; 460b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 470b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk @Test 480b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk public void testRegister() { 490b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk Uri testUri = new Uri.Builder() 500b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .scheme(ContentResolver.SCHEME_CONTENT) 510b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .authority("something") 520b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .path("test") 530b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .build(); 540b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk SliceBroadcastRelayHandler relayHandler = new SliceBroadcastRelayHandler(); 550b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk relayHandler.mContext = spy(mContext); 560b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 570b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk Intent intent = new Intent(SliceBroadcastRelay.ACTION_REGISTER); 580b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 590b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk intent.putExtra(SliceBroadcastRelay.EXTRA_RECEIVER, 600b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk new ComponentName(mContext.getPackageName(), Receiver.class.getName())); 610b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk IntentFilter value = new IntentFilter(TEST_ACTION); 620b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk intent.putExtra(SliceBroadcastRelay.EXTRA_FILTER, value); 63429d27dd0b07f8a429e34decd5ff5bcf3b2872efMatthew Fritze intent.putExtra(SliceBroadcastRelay.EXTRA_URI, testUri); 640b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 650b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk relayHandler.handleIntent(intent); 660b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk verify(relayHandler.mContext).registerReceiver(any(), eq(value)); 670b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk } 680b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 690b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk @Test 700b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk public void testUnregister() { 710b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk Uri testUri = new Uri.Builder() 720b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .scheme(ContentResolver.SCHEME_CONTENT) 730b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .authority("something") 740b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .path("test") 750b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .build(); 760b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk SliceBroadcastRelayHandler relayHandler = new SliceBroadcastRelayHandler(); 770b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk relayHandler.mContext = spy(mContext); 780b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 790b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk Intent intent = new Intent(SliceBroadcastRelay.ACTION_REGISTER); 800b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 810b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk intent.putExtra(SliceBroadcastRelay.EXTRA_RECEIVER, 820b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk new ComponentName(mContext.getPackageName(), Receiver.class.getName())); 830b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk IntentFilter value = new IntentFilter(TEST_ACTION); 840b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk intent.putExtra(SliceBroadcastRelay.EXTRA_FILTER, value); 850b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 860b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk relayHandler.handleIntent(intent); 870b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk ArgumentCaptor<BroadcastReceiver> relay = ArgumentCaptor.forClass(BroadcastReceiver.class); 880b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk verify(relayHandler.mContext).registerReceiver(relay.capture(), eq(value)); 890b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 900b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk intent = new Intent(SliceBroadcastRelay.ACTION_UNREGISTER); 910b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 920b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk relayHandler.handleIntent(intent); 930b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk verify(relayHandler.mContext).unregisterReceiver(eq(relay.getValue())); 940b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk } 950b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 960b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk @Test 970b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk public void testRelay() { 980b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk Receiver.sReceiver = mock(BroadcastReceiver.class); 990b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk Uri testUri = new Uri.Builder() 1000b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .scheme(ContentResolver.SCHEME_CONTENT) 1010b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .authority("something") 1020b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .path("test") 1030b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk .build(); 1040b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk SliceBroadcastRelayHandler relayHandler = new SliceBroadcastRelayHandler(); 1050b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk relayHandler.mContext = spy(mContext); 1060b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 1070b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk Intent intent = new Intent(SliceBroadcastRelay.ACTION_REGISTER); 1080b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk intent.putExtra(SliceBroadcastRelay.EXTRA_URI, ContentProvider.maybeAddUserId(testUri, 0)); 1090b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk intent.putExtra(SliceBroadcastRelay.EXTRA_RECEIVER, 1100b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk new ComponentName(mContext.getPackageName(), Receiver.class.getName())); 1110b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk IntentFilter value = new IntentFilter(TEST_ACTION); 1120b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk intent.putExtra(SliceBroadcastRelay.EXTRA_FILTER, value); 1130b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 1140b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk relayHandler.handleIntent(intent); 1150b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk ArgumentCaptor<BroadcastReceiver> relay = ArgumentCaptor.forClass(BroadcastReceiver.class); 1160b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk verify(relayHandler.mContext).registerReceiver(relay.capture(), eq(value)); 1170b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk relay.getValue().onReceive(relayHandler.mContext, new Intent(TEST_ACTION)); 1180b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 1190b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk verify(Receiver.sReceiver, timeout(2000)).onReceive(any(), any()); 1200b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk } 1210b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 1220b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk public static class Receiver extends BroadcastReceiver { 1230b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk private static BroadcastReceiver sReceiver; 1240b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 1250b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk @Override 1260b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk public void onReceive(Context context, Intent intent) { 1270b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk if (sReceiver != null) sReceiver.onReceive(context, intent); 1280b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk } 1290b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk } 1300b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk 1310b5e52ccd8e8308c6c7a8d04265f4bcd2b84f052Jason Monk}