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

Commit 7dda4b4a authored by Jeff Sharkey's avatar Jeff Sharkey
Browse files

BroadcastQueue: tests for "runnable at" behavior.

Add some baseline tests to confirm how we calculate when a
given per-process queue is runnable.

Bug: 245771249
Test: atest FrameworksMockingServicesTests:BroadcastQueueTest
Change-Id: I40d1961ba9be4034601ee8d2af3ba20b5aba6231
parent 6a6e2295
Loading
Loading
Loading
Loading
+92 −5
Original line number Diff line number Diff line
@@ -18,17 +18,27 @@ package com.android.server.am;

import static com.android.server.am.BroadcastProcessQueue.insertIntoRunnableList;
import static com.android.server.am.BroadcastProcessQueue.removeFromRunnableList;
import static com.android.server.am.BroadcastQueueTest.CLASS_GREEN;
import static com.android.server.am.BroadcastQueueTest.PACKAGE_BLUE;
import static com.android.server.am.BroadcastQueueTest.PACKAGE_GREEN;
import static com.android.server.am.BroadcastQueueTest.PACKAGE_RED;
import static com.android.server.am.BroadcastQueueTest.PACKAGE_YELLOW;
import static com.android.server.am.BroadcastQueueTest.getUidForPackage;
import static com.android.server.am.BroadcastQueueTest.makeManifestReceiver;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.doReturn;

import android.annotation.NonNull;
import android.app.Activity;
import android.app.AppOpsManager;
import android.app.BroadcastOptions;
import android.content.Intent;
import android.os.HandlerThread;
import android.os.UserHandle;
import android.provider.Settings;

import androidx.test.filters.SmallTest;
@@ -100,8 +110,31 @@ public class BroadcastQueueModernImplTest {
        }
    }

    private BroadcastRecord makeBroadcastRecord(Intent intent) {
        return makeBroadcastRecord(intent, BroadcastOptions.makeBasic(),
                List.of(makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN)), false);
    }

    private BroadcastRecord makeOrderedBroadcastRecord(Intent intent) {
        return makeBroadcastRecord(intent, BroadcastOptions.makeBasic(),
                List.of(makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN)), true);
    }

    private BroadcastRecord makeBroadcastRecord(Intent intent, BroadcastOptions options) {
        return makeBroadcastRecord(intent, options,
                List.of(makeManifestReceiver(PACKAGE_GREEN, CLASS_GREEN)), false);
    }

    private BroadcastRecord makeBroadcastRecord(Intent intent, BroadcastOptions options,
            List receivers, boolean ordered) {
        return new BroadcastRecord(mImpl, intent, null, PACKAGE_RED, null, 21, 42, false, null,
                null, null, null, AppOpsManager.OP_NONE, options, receivers, null,
                Activity.RESULT_OK, null, null, ordered, false, false, UserHandle.USER_SYSTEM,
                false, null, false, null);
    }

    @Test
    public void testRunnableAt_Simple() {
    public void testRunnableList_Simple() {
        assertRunnableList(List.of(), mHead);

        mHead = insertIntoRunnableList(mHead, mQueue1);
@@ -112,7 +145,7 @@ public class BroadcastQueueModernImplTest {
    }

    @Test
    public void testRunnableAt_InsertLast() {
    public void testRunnableList_InsertLast() {
        mHead = insertIntoRunnableList(mHead, mQueue1);
        mHead = insertIntoRunnableList(mHead, mQueue2);
        mHead = insertIntoRunnableList(mHead, mQueue3);
@@ -121,7 +154,7 @@ public class BroadcastQueueModernImplTest {
    }

    @Test
    public void testRunnableAt_InsertFirst() {
    public void testRunnableList_InsertFirst() {
        mHead = insertIntoRunnableList(mHead, mQueue4);
        mHead = insertIntoRunnableList(mHead, mQueue3);
        mHead = insertIntoRunnableList(mHead, mQueue2);
@@ -130,7 +163,7 @@ public class BroadcastQueueModernImplTest {
    }

    @Test
    public void testRunnableAt_InsertMiddle() {
    public void testRunnableList_InsertMiddle() {
        mHead = insertIntoRunnableList(mHead, mQueue1);
        mHead = insertIntoRunnableList(mHead, mQueue3);
        mHead = insertIntoRunnableList(mHead, mQueue2);
@@ -138,7 +171,7 @@ public class BroadcastQueueModernImplTest {
    }

    @Test
    public void testRunnableAt_Remove() {
    public void testRunnableList_Remove() {
        mHead = insertIntoRunnableList(mHead, mQueue1);
        mHead = insertIntoRunnableList(mHead, mQueue2);
        mHead = insertIntoRunnableList(mHead, mQueue3);
@@ -201,4 +234,58 @@ public class BroadcastQueueModernImplTest {
        BroadcastProcessQueue yellow = mImpl.getOrCreateProcessQueue(PACKAGE_YELLOW, TEST_UID);
        assertEquals(yellow, mImpl.getProcessQueue(PACKAGE_YELLOW, TEST_UID));
    }

    /**
     * Empty queue isn't runnable.
     */
    @Test
    public void testRunnableAt_Empty() {
        BroadcastProcessQueue queue = new BroadcastProcessQueue(PACKAGE_GREEN,
                getUidForPackage(PACKAGE_GREEN));
        assertFalse(queue.isRunnable());
        assertEquals(Long.MAX_VALUE, queue.getRunnableAt());
    }

    /**
     * Queue with a "normal" broadcast is runnable at different times depending
     * on process cached state; when cached it's delayed by some amount.
     */
    @Test
    public void testRunnableAt_Normal() {
        BroadcastProcessQueue queue = new BroadcastProcessQueue(PACKAGE_GREEN,
                getUidForPackage(PACKAGE_GREEN));

        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        final BroadcastRecord airplaneRecord = makeBroadcastRecord(airplane);
        queue.enqueueBroadcast(airplaneRecord, 0);

        queue.setProcessCached(false);
        final long notCachedRunnableAt = queue.getRunnableAt();
        queue.setProcessCached(true);
        final long cachedRunnableAt = queue.getRunnableAt();
        assertTrue(cachedRunnableAt > notCachedRunnableAt);
    }

    /**
     * Queue with foreground broadcast is always runnable immediately,
     * regardless of process cached state.
     */
    @Test
    public void testRunnableAt_Foreground() {
        BroadcastProcessQueue queue = new BroadcastProcessQueue(PACKAGE_GREEN,
                getUidForPackage(PACKAGE_GREEN));

        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        airplane.addFlags(Intent.FLAG_RECEIVER_FOREGROUND);
        final BroadcastRecord airplaneRecord = makeBroadcastRecord(airplane);
        queue.enqueueBroadcast(airplaneRecord, 0);

        queue.setProcessCached(false);
        assertTrue(queue.isRunnable());
        assertEquals(airplaneRecord.enqueueTime, queue.getRunnableAt());

        queue.setProcessCached(true);
        assertTrue(queue.isRunnable());
        assertEquals(airplaneRecord.enqueueTime, queue.getRunnableAt());
    }
}
+2 −2
Original line number Diff line number Diff line
@@ -284,7 +284,7 @@ public class BroadcastQueueTest {
                UnaryOperator.identity());
    }

    private ProcessRecord makeActiveProcessRecordWedged(String packageName) throws Exception {
    private ProcessRecord makeWedgedActiveProcessRecord(String packageName) throws Exception {
        final ApplicationInfo ai = makeApplicationInfo(packageName);
        return makeActiveProcessRecord(ai, ai.processName, true, false,
                UnaryOperator.identity());
@@ -698,7 +698,7 @@ public class BroadcastQueueTest {
    @Test
    public void testWedged() throws Exception {
        final ProcessRecord callerApp = makeActiveProcessRecord(PACKAGE_RED);
        final ProcessRecord receiverApp = makeActiveProcessRecordWedged(PACKAGE_GREEN);
        final ProcessRecord receiverApp = makeWedgedActiveProcessRecord(PACKAGE_GREEN);

        final Intent airplane = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
        enqueueBroadcast(makeBroadcastRecord(airplane, callerApp,