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

Commit c6691572 authored by wilsonshih's avatar wilsonshih
Browse files

Deflake testRemoveStartingInShell

By using StubTransaction to better control the test progress.

Bug: 417623783
Flag: com.android.window.flags.remove_starting_in_transition
Test: atest StartingWindowControllerTests
Change-Id: I61a31ee1c45ac99eac907f3cd665bdd4c358d357
parent 6a41c55f
Loading
Loading
Loading
Loading
+9 −15
Original line number Original line Diff line number Diff line
@@ -36,11 +36,9 @@ import android.hardware.display.DisplayManager;
import android.os.Binder;
import android.os.Binder;
import android.os.Bundle;
import android.os.Bundle;
import android.os.IBinder;
import android.os.IBinder;
import android.os.SystemClock;
import android.os.UserManager;
import android.os.UserManager;
import android.platform.test.annotations.EnableFlags;
import android.platform.test.annotations.EnableFlags;
import android.view.Display;
import android.view.Display;
import android.view.SurfaceControl;
import android.window.StartingWindowRemovalInfo;
import android.window.StartingWindowRemovalInfo;
import android.window.TransitionInfo;
import android.window.TransitionInfo;


@@ -49,6 +47,7 @@ import androidx.test.filters.SmallTest;


import com.android.internal.util.function.TriConsumer;
import com.android.internal.util.function.TriConsumer;
import com.android.launcher3.icons.IconProvider;
import com.android.launcher3.icons.IconProvider;
import com.android.server.testutils.StubTransaction;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTaskOrganizer;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.ShellTestCase;
import com.android.wm.shell.TestShellExecutor;
import com.android.wm.shell.TestShellExecutor;
@@ -144,13 +143,13 @@ public class StartingWindowControllerTests extends ShellTestCase {
                .addChange(TRANSIT_OPEN).build();
                .addChange(TRANSIT_OPEN).build();
        final StartingWindowRemovalInfo removalInfo = new StartingWindowRemovalInfo();
        final StartingWindowRemovalInfo removalInfo = new StartingWindowRemovalInfo();
        removalInfo.taskId = taskId;
        removalInfo.taskId = taskId;
        final SurfaceControl.Transaction st = new SurfaceControl.Transaction();
        final StubTransaction st = new StubTransaction();
        final StartingWindowController.RemoveStartingObserver observer =
        final StartingWindowController.RemoveStartingObserver observer =
                mController.mRemoveStartingObserver;
                mController.mRemoveStartingObserver;


        observer.onAddingWindow(taskId, token, appToken);
        observer.onAddingWindow(taskId, token, appToken);
        observer.onTransitionReady(token, info, st, st);
        observer.onTransitionReady(token, info, st, st);
        waitTransactionCommit(st);
        notifyTransactionCommitted(st);
        assertTrue(observer.hasPendingRemoval());
        assertTrue(observer.hasPendingRemoval());
        observer.requestRemoval(taskId, removalInfo);
        observer.requestRemoval(taskId, removalInfo);
        assertFalse(observer.hasPendingRemoval());
        assertFalse(observer.hasPendingRemoval());
@@ -160,7 +159,7 @@ public class StartingWindowControllerTests extends ShellTestCase {
        observer.requestRemoval(taskId, removalInfo);
        observer.requestRemoval(taskId, removalInfo);
        observer.onTransitionReady(token, info, st, st);
        observer.onTransitionReady(token, info, st, st);
        assertTrue(observer.hasPendingRemoval());
        assertTrue(observer.hasPendingRemoval());
        waitTransactionCommit(st);
        notifyTransactionCommitted(st);
        assertFalse(observer.hasPendingRemoval());
        assertFalse(observer.hasPendingRemoval());


        // Received second transition with FLAG_IS_BEHIND_STARTING_WINDOW
        // Received second transition with FLAG_IS_BEHIND_STARTING_WINDOW
@@ -171,9 +170,9 @@ public class StartingWindowControllerTests extends ShellTestCase {
                .addChange(TRANSIT_OPEN, FLAG_IS_BEHIND_STARTING_WINDOW).build();
                .addChange(TRANSIT_OPEN, FLAG_IS_BEHIND_STARTING_WINDOW).build();
        observer.onAddingWindow(taskId, token, appToken);
        observer.onAddingWindow(taskId, token, appToken);
        observer.onTransitionReady(token, info, st, st);
        observer.onTransitionReady(token, info, st, st);
        waitTransactionCommit(st);
        notifyTransactionCommitted(st);
        observer.onTransitionReady(secondToken, secondInfo, st, st);
        observer.onTransitionReady(secondToken, secondInfo, st, st);
        waitTransactionCommit(st);
        notifyTransactionCommitted(st);
        assertTrue(observer.hasPendingRemoval());
        assertTrue(observer.hasPendingRemoval());
        observer.requestRemoval(taskId, removalInfo);
        observer.requestRemoval(taskId, removalInfo);
        assertFalse(observer.hasPendingRemoval());
        assertFalse(observer.hasPendingRemoval());
@@ -181,21 +180,16 @@ public class StartingWindowControllerTests extends ShellTestCase {
        st.clear();
        st.clear();
        observer.onAddingWindow(taskId, token, appToken);
        observer.onAddingWindow(taskId, token, appToken);
        observer.onTransitionReady(token, info, st, st);
        observer.onTransitionReady(token, info, st, st);
        waitTransactionCommit(st);
        notifyTransactionCommitted(st);
        observer.onTransitionReady(secondToken, secondInfo, st, st);
        observer.onTransitionReady(secondToken, secondInfo, st, st);
        observer.requestRemoval(taskId, removalInfo);
        observer.requestRemoval(taskId, removalInfo);
        assertTrue(observer.hasPendingRemoval());
        assertTrue(observer.hasPendingRemoval());
        waitTransactionCommit(st);
        notifyTransactionCommitted(st);
        assertFalse(observer.hasPendingRemoval());
        assertFalse(observer.hasPendingRemoval());
    }
    }


    private void waitTransactionCommit(SurfaceControl.Transaction st) {
    private void notifyTransactionCommitted(StubTransaction st) {
        st.apply();
        st.apply();
        final long timeout = SystemClock.currentTimeMicro() + 500L;
        while (mMainExecutor.getCallbacks().isEmpty()
                && SystemClock.currentTimeMicro() < timeout) {
            SystemClock.sleep(50);
        }
        mMainExecutor.flushAll();
        mMainExecutor.flushAll();
    }
    }
}
}