Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3f400959 authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

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
parent 1be68459
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -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.
     */