Merge "Create a mock instead of subclassing BroadcastSkipPolicy."

This commit is contained in:
Sudheer Shanka
2023-02-13 20:28:46 +00:00
committed by Android (Google) Code Review

View File

@@ -20,6 +20,7 @@ import static android.os.UserHandle.USER_SYSTEM;
import static com.android.server.am.BroadcastProcessQueue.reasonToString;
import static com.android.server.am.BroadcastRecord.deliveryStateToString;
import static com.android.server.am.BroadcastRecord.isReceiverEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -76,8 +77,6 @@ import android.os.PowerExemptionManager;
import android.os.SystemClock;
import android.os.UserHandle;
import android.provider.Settings;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Log;
import android.util.Pair;
import android.util.SparseArray;
@@ -160,7 +159,7 @@ public class BroadcastQueueTest {
private ActivityManagerService mAms;
private BroadcastQueue mQueue;
BroadcastConstants mConstants;
private TestBroadcastSkipPolicy mSkipPolicy;
private BroadcastSkipPolicy mSkipPolicy;
/**
* Desired behavior of the next
@@ -287,7 +286,10 @@ public class BroadcastQueueTest {
mConstants = new BroadcastConstants(Settings.Global.BROADCAST_FG_CONSTANTS);
mConstants.TIMEOUT = 100;
mConstants.ALLOW_BG_ACTIVITY_START_TIMEOUT = 0;
mSkipPolicy = new TestBroadcastSkipPolicy(mAms);
mSkipPolicy = spy(new BroadcastSkipPolicy(mAms));
doReturn(null).when(mSkipPolicy).shouldSkipMessage(any(), any());
doReturn(false).when(mSkipPolicy).disallowBackgroundStart(any());
final BroadcastHistory emptyHistory = new BroadcastHistory(mConstants) {
public void addBroadcastToHistoryLocked(BroadcastRecord original) {
@@ -324,48 +326,6 @@ public class BroadcastQueueTest {
}
}
private static class TestBroadcastSkipPolicy extends BroadcastSkipPolicy {
private final ArrayMap<String, ArraySet> mReceiversToSkip = new ArrayMap<>();
TestBroadcastSkipPolicy(ActivityManagerService service) {
super(service);
}
public String shouldSkipMessage(BroadcastRecord r, Object o) {
if (shouldSkipReceiver(r.intent.getAction(), o)) {
return "test skipped receiver";
}
return null;
}
private boolean shouldSkipReceiver(String action, Object o) {
final ArraySet<Object> receiversToSkip = mReceiversToSkip.get(action);
if (receiversToSkip == null) {
return false;
}
for (int i = 0; i < receiversToSkip.size(); ++i) {
if (BroadcastRecord.isReceiverEquals(o, receiversToSkip.valueAt(i))) {
return true;
}
}
return false;
}
public void setSkipReceiver(String action, Object o) {
ArraySet<Object> receiversToSkip = mReceiversToSkip.get(action);
if (receiversToSkip == null) {
receiversToSkip = new ArraySet<>();
mReceiversToSkip.put(action, receiversToSkip);
}
receiversToSkip.add(o);
}
public boolean disallowBackgroundStart(BroadcastRecord r) {
// Ignored
return false;
}
}
private class TestInjector extends Injector {
TestInjector(Context context) {
super(context);
@@ -2039,8 +1999,16 @@ public class BroadcastQueueTest {
enqueueBroadcast(makeBroadcastRecord(airplane, callerApp,
List.of(greenReceiver, blueReceiver, yellowReceiver, orangeReceiver)));
mSkipPolicy.setSkipReceiver(airplane.getAction(), greenReceiver);
mSkipPolicy.setSkipReceiver(airplane.getAction(), orangeReceiver);
doAnswer(invocation -> {
final BroadcastRecord r = invocation.getArgument(0);
final Object o = invocation.getArgument(1);
if (airplane.getAction().equals(r.intent.getAction())
&& (isReceiverEquals(o, greenReceiver)
|| isReceiverEquals(o, orangeReceiver))) {
return "test skipped receiver";
}
return null;
}).when(mSkipPolicy).shouldSkipMessage(any(BroadcastRecord.class), any());
}
waitForIdle();