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