Fix testGetSettingsContextOnDualDisplayContent flakiness

The test is to verify the window configuration of the IME menu context
(made by createWindowContext from SystemUiContext) is same as the IME
containter's bounds that placed on the given display area,

In case WindowTokenClient#onConfigurationChanged may come after the
server side's configuration change (Since it's the async call),
before calling assertImeSwitchContextMetricsValidity,
we have to verify both server and client side has received the
onConfigurationChanged callback to prevent the test flakiness.

Fix: 215874086
Test: atest InputMethodMenuControllerTest#\
    testGetSettingsContextOnDualDisplayContent --rerun-until-failure 20

Change-Id: Ia915362ff6d81cfb1eb39f426cbf41355c12fa05
This commit is contained in:
Ming-Shin Lu
2022-01-24 16:04:28 +08:00
parent da433c60c1
commit 9600d66d6d

View File

@@ -26,11 +26,14 @@ import static com.android.dx.mockito.inline.extended.ExtendedMockito.spyOn;
import static com.google.common.truth.Truth.assertThat;
import static org.junit.Assert.assertNotNull;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import android.app.ActivityThread;
import android.content.Context;
@@ -43,6 +46,7 @@ import android.view.Display;
import android.view.IWindowManager;
import android.view.WindowManager;
import android.view.WindowManagerGlobal;
import android.window.WindowTokenClient;
import com.android.server.inputmethod.InputMethodManagerService;
import com.android.server.inputmethod.InputMethodMenuController;
@@ -130,15 +134,31 @@ public class InputMethodMenuControllerTest extends WindowTestsBase {
@Test
public void testGetSettingsContextOnDualDisplayContent() {
final Context context = mController.getSettingsContext(mSecondaryDisplay.getDisplayId());
final WindowTokenClient tokenClient = (WindowTokenClient) context.getWindowContextToken();
assertNotNull(tokenClient);
spyOn(tokenClient);
final DisplayArea.Tokens imeContainer = mSecondaryDisplay.getImeContainer();
spyOn(imeContainer);
assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mSecondaryDisplay);
mSecondaryDisplay.mFirstRoot.placeImeContainer(imeContainer);
verify(imeContainer, atLeastOnce()).onConfigurationChanged(
eq(mSecondaryDisplay.mFirstRoot.getConfiguration()));
verify(tokenClient, atLeastOnce()).onConfigurationChanged(
eq(mSecondaryDisplay.mFirstRoot.getConfiguration()),
eq(mSecondaryDisplay.mDisplayId));
assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mSecondaryDisplay.mFirstRoot);
assertImeSwitchContextMetricsValidity(context, mSecondaryDisplay);
mSecondaryDisplay.mSecondRoot.placeImeContainer(imeContainer);
verify(imeContainer, atLeastOnce()).onConfigurationChanged(
eq(mSecondaryDisplay.mSecondRoot.getConfiguration()));
verify(tokenClient, atLeastOnce()).onConfigurationChanged(
eq(mSecondaryDisplay.mSecondRoot.getConfiguration()),
eq(mSecondaryDisplay.mDisplayId));
assertThat(imeContainer.getRootDisplayArea()).isEqualTo(mSecondaryDisplay.mSecondRoot);
assertImeSwitchContextMetricsValidity(context, mSecondaryDisplay);
}