Always have ConditionalCoreStartable subscribe to monitor.

Currently, ConditionalCoreStartables bypass subscribing to the
condition monitor if no conditions are specified. However, a
monitor might have preconditions set on it that would be ignored
in this case. This changelist ensures the CoreStartable always
subscribes to that any preconditions from the monitor are
considered.

Test: atest ConditionalCoreStartableTest
Test: atest ConditionMonitorTest
Bug: 261420432
Change-Id: If4e14bca8c51a7568966950c429dae7c16fdf759
This commit is contained in:
Bryce Lee
2023-02-10 11:44:17 -08:00
parent c0511060f4
commit daed6675fc
3 changed files with 45 additions and 10 deletions

View File

@@ -43,11 +43,6 @@ public abstract class ConditionalCoreStartable implements CoreStartable {
@Override
public final void start() {
if (mConditionSet == null || mConditionSet.isEmpty()) {
onStart();
return;
}
mStartToken = mMonitor.addSubscription(
new Monitor.Subscription.Builder(allConditionsMet -> {
if (allConditionsMet) {
@@ -63,11 +58,6 @@ public abstract class ConditionalCoreStartable implements CoreStartable {
@Override
public final void onBootCompleted() {
if (mConditionSet == null || mConditionSet.isEmpty()) {
bootCompleted();
return;
}
mBootCompletedToken = mMonitor.addSubscription(
new Monitor.Subscription.Builder(allConditionsMet -> {
if (allConditionsMet) {

View File

@@ -248,6 +248,21 @@ public class ConditionMonitorTest extends SysuiTestCase {
verify(callback).onConditionsChanged(true);
}
@Test
public void addCallback_preCondition_noConditions_reportAllConditionsMet() {
final Monitor
monitor = new Monitor(mExecutor, new HashSet<>(Arrays.asList(mCondition1)));
final Monitor.Callback callback = mock(
Monitor.Callback.class);
monitor.addSubscription(new Monitor.Subscription.Builder(callback).build());
mExecutor.runAllReady();
verify(callback, never()).onConditionsChanged(true);
mCondition1.fakeUpdateCondition(true);
mExecutor.runAllReady();
verify(callback).onConditionsChanged(true);
}
@Test
public void removeCallback_noFailureOnDoubleRemove() {
final Condition condition = mock(

View File

@@ -60,6 +60,11 @@ public class ConditionalCoreStartableTest extends SysuiTestCase {
mCallback = callback;
}
public FakeConditionalCoreStartable(Monitor monitor, Callback callback) {
super(monitor);
mCallback = callback;
}
@Override
protected void onStart() {
mCallback.onStart();
@@ -122,6 +127,31 @@ public class ConditionalCoreStartableTest extends SysuiTestCase {
verify(mMonitor).removeSubscription(mSubscriptionToken);
}
@Test
public void testOnStartCallbackWithNoConditions() {
final CoreStartable coreStartable =
new FakeConditionalCoreStartable(mMonitor,
mCallback);
when(mMonitor.addSubscription(any())).thenReturn(mSubscriptionToken);
coreStartable.start();
final ArgumentCaptor<Monitor.Subscription> subscriptionCaptor = ArgumentCaptor.forClass(
Monitor.Subscription.class);
verify(mMonitor).addSubscription(subscriptionCaptor.capture());
final Monitor.Subscription subscription = subscriptionCaptor.getValue();
assertThat(subscription.getConditions()).isEmpty();
verify(mCallback, never()).onStart();
subscription.getCallback().onConditionsChanged(true);
verify(mCallback).onStart();
verify(mMonitor).removeSubscription(mSubscriptionToken);
}
/**
* Verifies that {@link ConditionalCoreStartable#bootCompleted()} ()} is predicated on