blob: f6c14bec71f4937dd55f74ae6994a851b391c60b [file] [log] [blame]
/*
* Copyright (C) 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.gamemanager.cts;
import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
import static com.android.compatibility.common.util.ShellUtils.runShellCommand;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import android.app.GameManager;
import android.app.GameModeInfo;
import android.app.GameState;
import android.app.Instrumentation;
import android.content.Context;
import android.support.test.uiautomator.UiDevice;
import androidx.test.ext.junit.rules.ActivityScenarioRule;
import androidx.test.runner.AndroidJUnit4;
import com.android.compatibility.common.util.ShellIdentityUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@RunWith(AndroidJUnit4.class)
public class GameManagerTest {
private static final String TAG = "GameManagerTest";
private static final String POWER_DUMPSYS_CMD = "dumpsys android.hardware.power.IPower/default";
private static final Pattern GAME_LOADING_REGEX =
Pattern.compile("^GAME_LOADING\\t(\\d*)\\t\\d*$", Pattern.MULTILINE);
private static final String APK_DIRECTORY = "/data/local/tmp/cts/gamemanager/test/apps/";
private static final String NOT_GAME_TEST_APP_APK_PATH =
APK_DIRECTORY + "CtsNotGameTestApp.apk";
private static final String NOT_GAME_TEST_APP_PACKAGE_NAME =
"android.gamemanager.cts.app.notgametestapp";
private static final String GAME_TEST_APP_APK_PATH =
APK_DIRECTORY + "CtsGameTestApp.apk";
private static final String GAME_TEST_APP_PACKAGE_NAME =
"android.gamemanager.cts.app.gametestapp";
private static final String GAME_TEST_APP_WITH_BATTERY_APK_PATH =
APK_DIRECTORY + "CtsGameTestAppWithBatteryMode.apk";
private static final String GAME_TEST_APP_WITH_BATTERY_PACKAGE_NAME =
"android.gamemanager.cts.app.gametestapp.battery";
private static final String GAME_TEST_APP_WITH_PERFORMANCE_APK_PATH =
APK_DIRECTORY + "CtsGameTestAppWithPerformanceMode.apk";
private static final String GAME_TEST_APP_WITH_PERFORMANCE_PACKAGE_NAME =
"android.gamemanager.cts.app.gametestapp.performance";
private static final int TEST_LABEL = 1;
private static final int TEST_QUALITY = 2;
private GameManagerCtsActivity mActivity;
private Context mContext;
private GameManager mGameManager;
private UiDevice mUiDevice;
@Rule
public ActivityScenarioRule<GameManagerCtsActivity> mActivityRule =
new ActivityScenarioRule<>(GameManagerCtsActivity.class);
@Before
public void setUp() {
TestUtil.uninstallPackage(NOT_GAME_TEST_APP_PACKAGE_NAME);
TestUtil.uninstallPackage(GAME_TEST_APP_PACKAGE_NAME);
TestUtil.uninstallPackage(GAME_TEST_APP_WITH_BATTERY_PACKAGE_NAME);
TestUtil.uninstallPackage(GAME_TEST_APP_WITH_PERFORMANCE_PACKAGE_NAME);
mActivityRule.getScenario().onActivity(activity -> {
mActivity = activity;
});
final Instrumentation instrumentation = getInstrumentation();
mContext = instrumentation.getContext();
mGameManager = mContext.getSystemService(GameManager.class);
mUiDevice = UiDevice.getInstance(instrumentation);
}
@After
public void tearDown() throws Exception {
TestUtil.uninstallPackage(NOT_GAME_TEST_APP_PACKAGE_NAME);
TestUtil.uninstallPackage(GAME_TEST_APP_PACKAGE_NAME);
TestUtil.uninstallPackage(GAME_TEST_APP_WITH_BATTERY_PACKAGE_NAME);
TestUtil.uninstallPackage(GAME_TEST_APP_WITH_PERFORMANCE_PACKAGE_NAME);
}
@Test
public void testIsAngleEnabled() throws Exception {
final String packageName = GAME_TEST_APP_WITH_PERFORMANCE_PACKAGE_NAME;
assertTrue(TestUtil.installPackage(GAME_TEST_APP_WITH_PERFORMANCE_APK_PATH));
Thread.sleep(500);
// enable Angle for BATTERY mode.
runShellCommand("device_config put game_overlay " + packageName
+ " mode=3,useAngle=true");
Thread.sleep(500);
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(packageName,
GameManager.GAME_MODE_BATTERY), "android.permission.MANAGE_GAME_MODE");
assertTrue(ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.isAngleEnabled(packageName),
"android.permission.MANAGE_GAME_MODE"));
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(packageName,
GameManager.GAME_MODE_PERFORMANCE), "android.permission.MANAGE_GAME_MODE");
assertFalse(ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.isAngleEnabled(packageName),
"android.permission.MANAGE_GAME_MODE"));
TestUtil.uninstallPackage(packageName);
}
/**
* Test that GameManager::getGameMode() returns the UNSUPPORTED when an app is not a game.
*/
@Test
public void testGetGameModeUnsupportedOnNotGame() throws InterruptedException {
assertTrue(TestUtil.installPackage(NOT_GAME_TEST_APP_APK_PATH));
Thread.sleep(500);
int gameMode =
ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.getGameMode(NOT_GAME_TEST_APP_PACKAGE_NAME),
"android.permission.MANAGE_GAME_MODE");
assertEquals("Game Manager returned incorrect value for "
+ NOT_GAME_TEST_APP_PACKAGE_NAME, GameManager.GAME_MODE_UNSUPPORTED, gameMode);
// Attempt to set the game mode to standard.
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(NOT_GAME_TEST_APP_PACKAGE_NAME,
GameManager.GAME_MODE_STANDARD));
gameMode = ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.getGameMode(NOT_GAME_TEST_APP_PACKAGE_NAME),
"android.permission.MANAGE_GAME_MODE");
assertEquals("Game Manager returned incorrect value for "
+ NOT_GAME_TEST_APP_PACKAGE_NAME,
GameManager.GAME_MODE_UNSUPPORTED, gameMode);
// Attempt to set the game mode to performance.
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(NOT_GAME_TEST_APP_PACKAGE_NAME,
GameManager.GAME_MODE_PERFORMANCE));
gameMode = ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.getGameMode(NOT_GAME_TEST_APP_PACKAGE_NAME),
"android.permission.MANAGE_GAME_MODE");
assertEquals("Game Manager returned incorrect value for "
+ NOT_GAME_TEST_APP_PACKAGE_NAME,
GameManager.GAME_MODE_UNSUPPORTED, gameMode);
// Attempt to set the game mode to battery.
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(NOT_GAME_TEST_APP_PACKAGE_NAME,
GameManager.GAME_MODE_BATTERY));
gameMode = ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.getGameMode(NOT_GAME_TEST_APP_PACKAGE_NAME),
"android.permission.MANAGE_GAME_MODE");
assertEquals("Game Manager returned incorrect value for "
+ NOT_GAME_TEST_APP_PACKAGE_NAME,
GameManager.GAME_MODE_UNSUPPORTED, gameMode);
TestUtil.uninstallPackage(NOT_GAME_TEST_APP_PACKAGE_NAME);
}
/**
* Test that GameManager::getGameMode() returns the correct value when forcing the Game Mode to
* GAME_MODE_UNSUPPORTED.
*/
@Test
public void testGetGameModeUnsupported() {
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(mActivity.getPackageName(),
GameManager.GAME_MODE_UNSUPPORTED));
int gameMode = mActivity.getGameMode();
assertEquals("Game Manager returned incorrect value.",
GameManager.GAME_MODE_UNSUPPORTED, gameMode);
}
/**
* Test that GameManager::getGameMode() returns the correct value when forcing the Game Mode to
* GAME_MODE_STANDARD.
*/
@Test
public void testGetGameModeStandard() {
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(mActivity.getPackageName(),
GameManager.GAME_MODE_STANDARD));
int gameMode = mActivity.getGameMode();
assertEquals("Game Manager returned incorrect value.",
GameManager.GAME_MODE_STANDARD, gameMode);
}
/**
* Test that GameManager::getGameMode() returns the correct value when forcing the Game Mode to
* GAME_MODE_PERFORMANCE.
*/
@Test
public void testGetGameModePerformance() {
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(mActivity.getPackageName(),
GameManager.GAME_MODE_PERFORMANCE));
int gameMode = mActivity.getGameMode();
assertEquals("Game Manager returned incorrect value.",
GameManager.GAME_MODE_PERFORMANCE, gameMode);
}
/**
* Test that GameManager::getGameMode() returns the correct value when forcing the Game Mode to
* GAME_MODE_BATTERY.
*/
@Test
public void testGetGameModeBattery() {
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(mActivity.getPackageName(),
GameManager.GAME_MODE_BATTERY));
int gameMode = mActivity.getGameMode();
assertEquals("Game Manager returned incorrect value.",
GameManager.GAME_MODE_BATTERY, gameMode);
}
private int getGameLoadingCount() throws IOException {
final Matcher matcher =
GAME_LOADING_REGEX.matcher(mUiDevice.executeShellCommand(POWER_DUMPSYS_CMD));
assumeTrue(matcher.find());
return Integer.parseInt(matcher.group(1));
}
/**
* Test that GameManager::setGameState() with an 'isLoading' state does not invokes the mode
* on the PowerHAL when performance mode is not invoked.
*/
@Test
public void testSetGameStateStandardMode() throws IOException, InterruptedException {
final int gameLoadingCountBefore = getGameLoadingCount();
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(mActivity.getPackageName(),
GameManager.GAME_MODE_STANDARD));
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager, (gameManager) ->
gameManager.setGameState(new GameState(true, GameState.MODE_NONE)));
Thread.sleep(500); // Wait for change to take effect.
assertEquals(gameLoadingCountBefore, getGameLoadingCount());
}
/**
* Test that GameManager::setGameState() with an 'isLoading' state actually invokes the mode
* on the PowerHAL when performance mode is invoked.
*/
@Test
public void testSetGameStatePerformanceMode() throws IOException, InterruptedException {
final int gameLoadingCountBefore = getGameLoadingCount();
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(mActivity.getPackageName(),
GameManager.GAME_MODE_PERFORMANCE));
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager, (gameManager) ->
gameManager.setGameState(new GameState(true, GameState.MODE_NONE)));
Thread.sleep(500); // Wait for change to take effect.
assertEquals(gameLoadingCountBefore + 1, getGameLoadingCount());
}
/**
* Test that GameManager::setGameState() with an 'isLoading' state and labels
* actually invokes the mode on the PowerHAL when performance mode is invoked.
*/
@Test
public void testSetGameStatePerformanceMode_withParams()
throws IOException, InterruptedException {
final int gameLoadingCountBefore = getGameLoadingCount();
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(mActivity.getPackageName(),
GameManager.GAME_MODE_PERFORMANCE));
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager, (gameManager) ->
gameManager.setGameState(
new GameState(true, GameState.MODE_NONE, TEST_LABEL, TEST_QUALITY)));
Thread.sleep(500); // Wait for change to take effect.
assertEquals(gameLoadingCountBefore + 1, getGameLoadingCount());
}
/**
* Test that GameManager::getGameModeInfo() returns correct values for a game.
*/
@Test
public void testGetGameModeInfoWithTwoGameModes() throws InterruptedException {
assertTrue(TestUtil.installPackage(GAME_TEST_APP_APK_PATH));
// When an app is installed, some propagation work for the configuration will
// be set up asynchronously, hence wait for 500ms here.
Thread.sleep(500);
GameModeInfo gameModeInfo =
ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.getGameModeInfo(GAME_TEST_APP_PACKAGE_NAME),
"android.permission.MANAGE_GAME_MODE");
assertEquals("GameManager#getGameModeInfo returned incorrect available game modes.",
3, gameModeInfo.getAvailableGameModes().length);
assertEquals("GameManager#getGameModeInfo returned incorrect active game mode.",
GameManager.GAME_MODE_STANDARD, gameModeInfo.getActiveGameMode());
// Attempt to set the game mode to standard.
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(GAME_TEST_APP_PACKAGE_NAME,
GameManager.GAME_MODE_STANDARD));
gameModeInfo = ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.getGameModeInfo(GAME_TEST_APP_PACKAGE_NAME),
"android.permission.MANAGE_GAME_MODE");
assertEquals("GameManager#getGameModeInfo returned incorrect available game modes.",
3, gameModeInfo.getAvailableGameModes().length);
assertEquals("GameManager#getGameModeInfo returned incorrect active game mode.",
GameManager.GAME_MODE_STANDARD, gameModeInfo.getActiveGameMode());
// Attempt to set the game mode to performance.
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(GAME_TEST_APP_PACKAGE_NAME,
GameManager.GAME_MODE_PERFORMANCE));
gameModeInfo = ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.getGameModeInfo(GAME_TEST_APP_PACKAGE_NAME),
"android.permission.MANAGE_GAME_MODE");
assertEquals("GameManager#getGameModeInfo returned incorrect available game modes.",
3, gameModeInfo.getAvailableGameModes().length);
assertEquals("GameManager#getGameModeInfo returned incorrect active game mode.",
GameManager.GAME_MODE_PERFORMANCE, gameModeInfo.getActiveGameMode());
// Attempt to set the game mode to battery.
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(GAME_TEST_APP_PACKAGE_NAME,
GameManager.GAME_MODE_BATTERY));
gameModeInfo = ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.getGameModeInfo(GAME_TEST_APP_PACKAGE_NAME),
"android.permission.MANAGE_GAME_MODE");
assertEquals("GameManager#getGameModeInfo returned incorrect available game modes.",
3, gameModeInfo.getAvailableGameModes().length);
assertEquals("GameManager#getGameModeInfo returned incorrect active game mode.",
GameManager.GAME_MODE_BATTERY, gameModeInfo.getActiveGameMode());
TestUtil.uninstallPackage(GAME_TEST_APP_PACKAGE_NAME);
}
/**
* Test that GameManager::getGameModeInfo() returns correct values for a game when it only
* supports battery mode.
*/
@Test
public void testGetGameModeInfoWithBatteryMode() throws InterruptedException {
final String packageName = GAME_TEST_APP_WITH_BATTERY_PACKAGE_NAME;
assertTrue(TestUtil.installPackage(GAME_TEST_APP_WITH_BATTERY_APK_PATH));
// When an app is installed, some propagation work for the configuration will
// be set up asynchronously, hence wait for 500ms here.
Thread.sleep(500);
GameModeInfo gameModeInfo =
ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.getGameModeInfo(packageName),
"android.permission.MANAGE_GAME_MODE");
assertEquals("GameManager#getGameModeInfo returned incorrect available game modes.",
2, gameModeInfo.getAvailableGameModes().length);
assertEquals("GameManager#getGameModeInfo returned incorrect active game mode.",
GameManager.GAME_MODE_STANDARD, gameModeInfo.getActiveGameMode());
// Attempt to set the game mode to battery.
ShellIdentityUtils.invokeMethodWithShellPermissionsNoReturn(mGameManager,
(gameManager) -> gameManager.setGameMode(packageName,
GameManager.GAME_MODE_BATTERY));
gameModeInfo = ShellIdentityUtils.invokeMethodWithShellPermissions(mGameManager,
(gameManager) -> gameManager.getGameModeInfo(packageName),
"android.permission.MANAGE_GAME_MODE");
assertEquals("GameManager#getGameModeInfo returned incorrect available game modes.",
2, gameModeInfo.getAvailableGameModes().length);
assertEquals("GameManager#getGameModeInfo returned incorrect active game mode.",
GameManager.GAME_MODE_BATTERY, gameModeInfo.getActiveGameMode());
TestUtil.uninstallPackage(packageName);
}
}