[B&R] backup the battery optimization mode for installed apps
BYPASS_INCLUSIVE_LANGUAGE_REASON=legacy method name Test command for backup manager: adb shell bmgr backupnow com.android.settings adb shell dumpsys backup | grep Current Bug: 192523697 Test: make SettingsRoboTests Change-Id: I4671e48a9d3b315362b451384db637d5cae36a4d
This commit is contained in:
@@ -27,11 +27,21 @@ import static org.mockito.Mockito.spy;
|
||||
import static org.mockito.Mockito.verify;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
import android.app.AppOpsManager;
|
||||
import android.app.backup.BackupDataOutput;
|
||||
import android.content.Context;
|
||||
import android.content.pm.ApplicationInfo;
|
||||
import android.content.pm.IPackageManager;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ParceledListSlice;
|
||||
import android.content.pm.UserInfo;
|
||||
import android.os.IDeviceIdleController;
|
||||
import android.os.RemoteException;
|
||||
import android.os.UserHandle;
|
||||
import android.os.UserManager;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
@@ -57,13 +67,23 @@ public final class BatteryBackupHelperTest {
|
||||
private BackupDataOutput mBackupDataOutput;
|
||||
@Mock
|
||||
private IDeviceIdleController mDeviceController;
|
||||
@Mock
|
||||
private IPackageManager mIPackageManager;
|
||||
@Mock
|
||||
private AppOpsManager mAppOpsManager;
|
||||
@Mock
|
||||
private UserManager mUserManager;
|
||||
|
||||
@Before
|
||||
public void setUp() {
|
||||
MockitoAnnotations.initMocks(this);
|
||||
mContext = spy(RuntimeEnvironment.application);
|
||||
doReturn(mContext).when(mContext).getApplicationContext();
|
||||
doReturn(mAppOpsManager).when(mContext).getSystemService(AppOpsManager.class);
|
||||
doReturn(mUserManager).when(mContext).getSystemService(UserManager.class);
|
||||
mBatteryBackupHelper = new BatteryBackupHelper(mContext);
|
||||
mBatteryBackupHelper.mIDeviceIdleController = mDeviceController;
|
||||
mBatteryBackupHelper.mIPackageManager = mIPackageManager;
|
||||
}
|
||||
|
||||
@After
|
||||
@@ -135,6 +155,78 @@ public final class BatteryBackupHelperTest {
|
||||
verify(mBackupDataOutput, never()).writeEntityHeader(anyString(), anyInt());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backupOptimizationMode_nullInstalledApps_ignoreBackupOptimization()
|
||||
throws Exception {
|
||||
final UserInfo userInfo =
|
||||
new UserInfo(/*userId=*/ 0, /*userName=*/ "google", /*flag=*/ 0);
|
||||
doReturn(Arrays.asList(userInfo)).when(mUserManager).getProfiles(anyInt());
|
||||
doThrow(new RuntimeException())
|
||||
.when(mIPackageManager)
|
||||
.getInstalledApplications(anyInt(), anyInt());
|
||||
|
||||
mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, null);
|
||||
|
||||
verify(mBackupDataOutput, never()).writeEntityHeader(anyString(), anyInt());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void backupOptimizationMode_backupOptimizationMode() throws Exception {
|
||||
final String packageName1 = "com.android.testing.1";
|
||||
final String packageName2 = "com.android.testing.2";
|
||||
final String packageName3 = "com.android.testing.3";
|
||||
final List<String> allowlistedApps = Arrays.asList(packageName1);
|
||||
createTestingData(packageName1, packageName2, packageName3);
|
||||
|
||||
mBatteryBackupHelper.backupOptimizationMode(mBackupDataOutput, allowlistedApps);
|
||||
|
||||
final String expectedResult =
|
||||
packageName1 + "|UNRESTRICTED," + packageName2 + "|RESTRICTED,";
|
||||
final byte[] expectedBytes = expectedResult.getBytes();
|
||||
verify(mBackupDataOutput).writeEntityHeader(
|
||||
BatteryBackupHelper.KEY_OPTIMIZATION_LIST, expectedBytes.length);
|
||||
verify(mBackupDataOutput).writeEntityData(expectedBytes, expectedBytes.length);
|
||||
}
|
||||
|
||||
private void createTestingData(
|
||||
String packageName1, String packageName2, String packageName3) throws Exception {
|
||||
// Sets the getInstalledApplications() method for testing.
|
||||
final UserInfo userInfo =
|
||||
new UserInfo(/*userId=*/ 0, /*userName=*/ "google", /*flag=*/ 0);
|
||||
doReturn(Arrays.asList(userInfo)).when(mUserManager).getProfiles(anyInt());
|
||||
final ApplicationInfo applicationInfo1 = new ApplicationInfo();
|
||||
applicationInfo1.enabled = true;
|
||||
applicationInfo1.uid = 1;
|
||||
applicationInfo1.packageName = packageName1;
|
||||
final ApplicationInfo applicationInfo2 = new ApplicationInfo();
|
||||
applicationInfo2.enabled = false;
|
||||
applicationInfo2.uid = 2;
|
||||
applicationInfo2.packageName = packageName2;
|
||||
applicationInfo2.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED_USER;
|
||||
final ApplicationInfo applicationInfo3 = new ApplicationInfo();
|
||||
applicationInfo3.enabled = false;
|
||||
applicationInfo3.uid = 3;
|
||||
applicationInfo3.packageName = packageName3;
|
||||
applicationInfo3.enabledSetting = PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
|
||||
doReturn(new ParceledListSlice<ApplicationInfo>(
|
||||
Arrays.asList(applicationInfo1, applicationInfo2, applicationInfo3)))
|
||||
.when(mIPackageManager)
|
||||
.getInstalledApplications(anyInt(), anyInt());
|
||||
// Sets the AppOpsManager for checkOpNoThrow() method.
|
||||
doReturn(AppOpsManager.MODE_ALLOWED)
|
||||
.when(mAppOpsManager)
|
||||
.checkOpNoThrow(
|
||||
AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
|
||||
applicationInfo1.uid,
|
||||
applicationInfo1.packageName);
|
||||
doReturn(AppOpsManager.MODE_IGNORED)
|
||||
.when(mAppOpsManager)
|
||||
.checkOpNoThrow(
|
||||
AppOpsManager.OP_RUN_ANY_IN_BACKGROUND,
|
||||
applicationInfo2.uid,
|
||||
applicationInfo2.packageName);
|
||||
}
|
||||
|
||||
@Implements(UserHandle.class)
|
||||
public static class ShadowUserHandle {
|
||||
// Sets the default as thte OWNER role.
|
||||
|
Reference in New Issue
Block a user