From 9600d66d6d89b6fb305b8384e752aefc4957b761 Mon Sep 17 00:00:00 2001 From: Ming-Shin Lu Date: Mon, 24 Jan 2022 16:04:28 +0800 Subject: [PATCH] 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 --- .../wm/InputMethodMenuControllerTest.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) 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 407f9cfdbe3e4..d64bf121736f8 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.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); }