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
This commit is contained in:
Peiyong Lin
2021-09-20 19:53:18 +00:00
parent 4e4507011c
commit c55e178ee6
3 changed files with 62 additions and 31 deletions

View File

@@ -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) {

View File

@@ -37,6 +37,7 @@ android_test {
],
static_libs: [
"frameworks-base-testutils",
"services.core",
"services.devicepolicy",
"services.net",

View File

@@ -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<Integer> 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,