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 }