BroadcastQueue: Initial deterministic perf test.
As we start working on the "modern" alternative broadcast queue implementation, we'd like to gain confidence that we're actually improving the metrics we care about, without having to wait for changes to deploy to wider user populations. Instead of writing these using a traditional timing approach (which can suffer from scheduling noise), we explore "playing back" a set of well-known pathological scenarios, which will result in a deterministic output that can be used to immediately judge if a given CL improves or regresses a measured metric. Bug: 245771249 Test: atest FrameworksMockingServicesTests:BroadcastQueueTest Change-Id: I6f562c0b6f2a71fef52aae013899de7f2f95bc71
This commit is contained in:
@@ -1980,6 +1980,46 @@ public class BroadcastQueueTest {
|
||||
verify(mAms, never()).enqueueOomAdjTargetLocked(any());
|
||||
}
|
||||
|
||||
/**
|
||||
* Confirm how many times a pathological broadcast pattern results in OOM
|
||||
* adjusts; watches for performance regressions.
|
||||
*/
|
||||
@Test
|
||||
public void testOomAdjust_TriggerCount() throws Exception {
|
||||
final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
|
||||
|
||||
// Send 8 broadcasts, 4 receivers in the first process,
|
||||
// and 2 alternating in each of the remaining processes
|
||||
synchronized (mAms) {
|
||||
for (int i = 0; i < 8; i++) {
|
||||
final Intent intent = new Intent(Intent.ACTION_TIMEZONE_CHANGED);
|
||||
mQueue.enqueueBroadcastLocked(makeBroadcastRecord(intent, callerApp,
|
||||
List.of(makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN),
|
||||
makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN),
|
||||
makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN),
|
||||
makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN),
|
||||
makeManifestReceiver(PACKAGE_BLUE, CLASS_BLUE),
|
||||
makeManifestReceiver(PACKAGE_YELLOW, CLASS_YELLOW),
|
||||
makeManifestReceiver(PACKAGE_BLUE, CLASS_BLUE),
|
||||
makeManifestReceiver(PACKAGE_YELLOW, CLASS_YELLOW))));
|
||||
}
|
||||
}
|
||||
waitForIdle();
|
||||
|
||||
final int expectedTimes;
|
||||
switch (mImpl) {
|
||||
// Original stack requested for every single receiver; yikes
|
||||
case DEFAULT: expectedTimes = 64; break;
|
||||
// Modern stack requests once each time we promote a process to
|
||||
// running; we promote "green" twice, and "blue" and "yellow" once
|
||||
case MODERN: expectedTimes = 4; break;
|
||||
default: throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
verify(mAms, times(expectedTimes))
|
||||
.updateOomAdjPendingTargetsLocked(eq(OOM_ADJ_REASON_START_RECEIVER));
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify that expected events are triggered when a broadcast is finished.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user