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}