1 /*
2  * Copyright (C) 2021 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package android.car.test.util;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 import static com.google.common.truth.Truth.assertWithMessage;
21 
22 import android.content.BroadcastReceiver;
23 import android.content.Intent;
24 import android.content.IntentFilter;
25 import android.os.Handler;
26 import android.test.mock.MockContext;
27 
28 import com.google.common.collect.Lists;
29 
30 import java.util.ArrayList;
31 import java.util.concurrent.CountDownLatch;
32 
33 /**
34  * A fake implementation for {@link android.content.Context}, that helps broadcast {@link Intent}s
35  * to registered {@link BroadcastReceiver} instances.
36  */
37 // TODO(b/202420937): Add unit tests for this class.
38 public final class BroadcastingFakeContext extends MockContext {
39     private BroadcastReceiver mReceiver;
40     private IntentFilter mIntentFilter;
41     private Handler mHandler;
42 
43     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter)44     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter) {
45         mReceiver = receiver;
46         mIntentFilter = filter;
47 
48         return null;
49     }
50 
51     @Override
registerReceiver(BroadcastReceiver receiver, IntentFilter filter, String broadcastPermission, Handler scheduler)52     public Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter,
53             String broadcastPermission, Handler scheduler) {
54         mReceiver = receiver;
55         mIntentFilter = filter;
56         mHandler = scheduler;
57 
58         return null;
59     }
60 
61     @Override
sendBroadcast(Intent intent)62     public void sendBroadcast(Intent intent) {
63         if (mHandler == null) {
64             mReceiver.onReceive(this, intent);
65             return;
66         }
67 
68         CountDownLatch latch = new CountDownLatch(1);
69         mHandler.getLooper().getQueue().addIdleHandler(() -> {
70             latch.countDown();
71             return false;
72         });
73 
74         mHandler.post(() -> mReceiver.onReceive(this, intent));
75 
76         // wait until the queue is idle
77         try {
78             latch.await();
79         } catch (InterruptedException e) {
80             Thread.currentThread().interrupt();
81             throw new IllegalStateException(
82                     "Interrupted while waiting for Broadcast Intent to be received");
83         }
84     }
85 
86     @Override
unregisterReceiver(BroadcastReceiver receiver)87     public void unregisterReceiver(BroadcastReceiver receiver) {
88         if (receiver == mReceiver) {
89             mReceiver = null;
90             mIntentFilter = null;
91             mHandler = null;
92         }
93     }
94 
verifyReceiverNotRegistered()95     public void verifyReceiverNotRegistered() {
96         assertThat(mIntentFilter).isNull();
97         assertThat(mReceiver).isNull();
98         assertThat(mHandler).isNull();
99     }
100 
verifyReceiverRegistered(String expectedAction)101     public void verifyReceiverRegistered(String expectedAction) {
102         assertThat(mIntentFilter.actionsIterator()).isNotNull();
103         ArrayList<String> actions = Lists.newArrayList(mIntentFilter.actionsIterator());
104         assertWithMessage("IntentFilter actions").that(actions).contains(expectedAction);
105         assertWithMessage("Registered BroadcastReceiver").that(mReceiver).isNotNull();
106     }
107 }
108