From c55e178ee6191c8e6d0e8874d0c26eba1911ee3a Mon Sep 17 00:00:00 2001 From: Peiyong Lin Date: Mon, 20 Sep 2021 19:53:18 +0000 Subject: [PATCH] Fix flaky tests. Because message queue is used, it is possible that the user start message is not yet processed when there's another update to the DeviceConfig, this patch uses the TestLooper to manually force all messages processed when there is a dependency or race condition. Bug: b/194262212 Test: atest GameManagerServiceTests Change-Id: I21f342ea3ad802a24500fea47121aa067450022d --- .../server/app/GameManagerService.java | 2 +- .../tests/mockingservicestests/Android.bp | 1 + .../server/app/GameManagerServiceTests.java | 90 ++++++++++++------- 3 files changed, 62 insertions(+), 31 deletions(-) diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java index 3003c520254b6..456a75832b161 100644 --- a/services/core/java/com/android/server/app/GameManagerService.java +++ b/services/core/java/com/android/server/app/GameManagerService.java @@ -852,7 +852,7 @@ public final class GameManagerService extends IGameManagerService.Stub { * @hide */ @VisibleForTesting - public void updateConfigsForUser(int userId, String ...packageNames) { + void updateConfigsForUser(int userId, String ...packageNames) { try { synchronized (mDeviceConfigLock) { for (final String packageName : packageNames) { diff --git a/services/tests/mockingservicestests/Android.bp b/services/tests/mockingservicestests/Android.bp index ff7cd75dd7a10..680e6db3be6cd 100644 --- a/services/tests/mockingservicestests/Android.bp +++ b/services/tests/mockingservicestests/Android.bp @@ -37,6 +37,7 @@ android_test { ], static_libs: [ + "frameworks-base-testutils", "services.core", "services.devicepolicy", "services.net", diff --git a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java index 85ef8f73534c4..1c21645c16267 100644 --- a/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java +++ b/services/tests/mockingservicestests/src/com/android/server/app/GameManagerServiceTests.java @@ -34,6 +34,7 @@ import android.content.pm.ApplicationInfo; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.os.Bundle; +import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; import android.provider.DeviceConfig; import android.util.ArraySet; @@ -67,6 +68,7 @@ public class GameManagerServiceTests { private MockitoSession mMockingSession; private String mPackageName; + private TestLooper mTestLooper; @Mock private PackageManager mMockPackageManager; @@ -132,6 +134,7 @@ public class GameManagerServiceTests { @Before public void setUp() throws Exception { + mTestLooper = new TestLooper(); mMockingSession = mockitoSession() .initMocks(this) .mockStatic(DeviceConfig.class) @@ -161,6 +164,11 @@ public class GameManagerServiceTests { } } + private void startUser(GameManagerService gameManagerService, int userId) { + gameManagerService.onUserStarting(userId); + mTestLooper.dispatchAll(); + } + private void mockModifyGameModeGranted() { mMockContext.setPermission(Manifest.permission.MANAGE_GAME_MODE, PackageManager.PERMISSION_GRANTED); @@ -301,9 +309,10 @@ public class GameManagerServiceTests { */ @Test public void testGameModeDefaultValue() { - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + startUser(gameManagerService, USER_ID_1); mockModifyGameModeGranted(); assertEquals(GameManager.GAME_MODE_UNSUPPORTED, @@ -315,9 +324,10 @@ public class GameManagerServiceTests { */ @Test public void testDefaultValueForNonexistentUser() { - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + startUser(gameManagerService, USER_ID_1); mockModifyGameModeGranted(); gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_STANDARD, USER_ID_2); @@ -330,8 +340,11 @@ public class GameManagerServiceTests { */ @Test public void testGameMode() { - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + + + startUser(gameManagerService, USER_ID_1); gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName); mockModifyGameModeGranted(); assertEquals(GameManager.GAME_MODE_UNSUPPORTED, @@ -353,8 +366,10 @@ public class GameManagerServiceTests { */ @Test public void testGetGameModeInvalidPackageName() { - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + + startUser(gameManagerService, USER_ID_1); try { assertEquals(GameManager.GAME_MODE_UNSUPPORTED, gameManagerService.getGameMode(PACKAGE_NAME_INVALID, @@ -375,8 +390,9 @@ public class GameManagerServiceTests { public void testSetGameModePermissionDenied() { mockModifyGameModeGranted(); mockDeviceConfigAll(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + startUser(gameManagerService, USER_ID_1); // Update the game mode so we can read back something valid. gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_STANDARD, USER_ID_1); @@ -408,9 +424,11 @@ public class GameManagerServiceTests { public void testGameModeMultipleUsers() { mockModifyGameModeGranted(); mockDeviceConfigAll(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); - gameManagerService.onUserStarting(USER_ID_2); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + + startUser(gameManagerService, USER_ID_1); + startUser(gameManagerService, USER_ID_2); gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName); gameManagerService.updateConfigsForUser(USER_ID_2, mPackageName); @@ -437,8 +455,10 @@ public class GameManagerServiceTests { } private void checkReportedModes(int ...requiredModes) { - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + + startUser(gameManagerService, USER_ID_1); gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName); ArraySet reportedModes = new ArraySet<>(); int[] modes = gameManagerService.getAvailableGameModes(mPackageName); @@ -453,8 +473,10 @@ public class GameManagerServiceTests { } private void checkDownscaling(int gameMode, String scaling) { - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + + startUser(gameManagerService, USER_ID_1); gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName); GameManagerService.GamePackageConfiguration config = gameManagerService.getConfig(mPackageName); @@ -643,8 +665,10 @@ public class GameManagerServiceTests { */ @Test public void testInterventionAllowAngleDefault() throws Exception { - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = new GameManagerService( + mMockContext, mTestLooper.getLooper()); + + startUser(gameManagerService, USER_ID_1); mockDeviceConfigPerformance(); mockModifyGameModeGranted(); checkAngleEnabled(gameManagerService, GameManager.GAME_MODE_PERFORMANCE, false); @@ -655,7 +679,8 @@ public class GameManagerServiceTests { */ @Test public void testInterventionAllowAngleFalse() throws Exception { - GameManagerService gameManagerService = new GameManagerService(mMockContext); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); gameManagerService.onUserStarting(USER_ID_1); mockDeviceConfigPerformanceEnableAngle(); mockInterventionAllowAngleFalse(); @@ -672,8 +697,9 @@ public class GameManagerServiceTests { mockDeviceConfigPerformanceEnableAngle(); mockInterventionAllowAngleTrue(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + startUser(gameManagerService, USER_ID_1); mockModifyGameModeGranted(); gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1); assertEquals(GameManager.GAME_MODE_PERFORMANCE, @@ -691,8 +717,9 @@ public class GameManagerServiceTests { mockDeviceConfigPerformance(); mockGameModeOptInPerformance(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + startUser(gameManagerService, USER_ID_1); gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName); GameManagerService.GamePackageConfiguration config = gameManagerService.getConfig(mPackageName); @@ -707,8 +734,9 @@ public class GameManagerServiceTests { public void testUnsetInvalidGameMode() throws Exception { mockDeviceConfigNone(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + startUser(gameManagerService, USER_ID_1); gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_PERFORMANCE, USER_ID_1); gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName); assertEquals(GameManager.GAME_MODE_UNSUPPORTED, @@ -723,8 +751,9 @@ public class GameManagerServiceTests { public void testResetInvalidGameMode() throws Exception { mockDeviceConfigPerformance(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + startUser(gameManagerService, USER_ID_1); gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_BATTERY, USER_ID_1); gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName); assertEquals(GameManager.GAME_MODE_STANDARD, @@ -739,8 +768,9 @@ public class GameManagerServiceTests { public void testSetValidGameMode() throws Exception { mockDeviceConfigPerformance(); mockModifyGameModeGranted(); - GameManagerService gameManagerService = new GameManagerService(mMockContext); - gameManagerService.onUserStarting(USER_ID_1); + GameManagerService gameManagerService = + new GameManagerService(mMockContext, mTestLooper.getLooper()); + startUser(gameManagerService, USER_ID_1); gameManagerService.setGameMode(mPackageName, GameManager.GAME_MODE_UNSUPPORTED, USER_ID_1); gameManagerService.updateConfigsForUser(USER_ID_1, mPackageName); assertEquals(GameManager.GAME_MODE_STANDARD,