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
diff --git a/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
index 407f9cf..d64bf12 100644
--- a/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/InputMethodMenuControllerTest.java
@@ -26,11 +26,14 @@
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.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 @@
@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);
}