Improve test coverage of rollback data persistence.

Tests that we properly persist data about multiple available rollbacks
and available multi-package rollbacks.

Test: atest RollbackTest
Bug: 112431924
Change-Id: Ib31a0388e6420a942fac00f27fef33c0a866ea0b
This commit is contained in:
Richard Uhler
2019-01-10 12:01:54 +00:00
parent f8e7ff9175
commit 31bc9606dd

View File

@@ -178,10 +178,149 @@ public class RollbackTest {
}
/**
* Test that rollback data is properly persisted.
* Test that multiple available rollbacks are properly persisted.
*/
@Test
public void testRollbackDataPersistence() throws Exception {
public void testAvailableRollbackPersistence() throws Exception {
try {
RollbackTestUtils.adoptShellPermissionIdentity(
Manifest.permission.INSTALL_PACKAGES,
Manifest.permission.DELETE_PACKAGES,
Manifest.permission.MANAGE_ROLLBACKS);
RollbackManager rm = RollbackTestUtils.getRollbackManager();
RollbackTestUtils.uninstall(TEST_APP_A);
RollbackTestUtils.install("RollbackTestAppAv1.apk", false);
RollbackTestUtils.install("RollbackTestAppAv2.apk", true);
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
RollbackTestUtils.uninstall(TEST_APP_B);
RollbackTestUtils.install("RollbackTestAppBv1.apk", false);
RollbackTestUtils.install("RollbackTestAppBv2.apk", true);
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
// Both test apps should now be available for rollback.
// TODO: See if there is a way to remove this race condition
// between when the app is installed and when the rollback
// is made available.
Thread.sleep(1000);
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_A));
RollbackInfo rollbackA = rm.getAvailableRollback(TEST_APP_A);
assertNotNull(rollbackA);
assertEquals(TEST_APP_A, rollbackA.targetPackage.packageName);
assertEquals(2, rollbackA.targetPackage.higherVersion.versionCode);
assertEquals(1, rollbackA.targetPackage.lowerVersion.versionCode);
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_B));
RollbackInfo rollbackB = rm.getAvailableRollback(TEST_APP_B);
assertNotNull(rollbackB);
assertEquals(TEST_APP_B, rollbackB.targetPackage.packageName);
assertEquals(2, rollbackB.targetPackage.higherVersion.versionCode);
assertEquals(1, rollbackB.targetPackage.lowerVersion.versionCode);
// Reload the persisted data.
rm.reloadPersistedData();
// The apps should still be available for rollback.
rollbackA = rm.getAvailableRollback(TEST_APP_A);
assertNotNull(rollbackA);
assertEquals(TEST_APP_A, rollbackA.targetPackage.packageName);
assertEquals(2, rollbackA.targetPackage.higherVersion.versionCode);
assertEquals(1, rollbackA.targetPackage.lowerVersion.versionCode);
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_B));
rollbackB = rm.getAvailableRollback(TEST_APP_B);
assertNotNull(rollbackB);
assertEquals(TEST_APP_B, rollbackB.targetPackage.packageName);
assertEquals(2, rollbackB.targetPackage.higherVersion.versionCode);
assertEquals(1, rollbackB.targetPackage.lowerVersion.versionCode);
// Rollback of B should not rollback A
RollbackTestUtils.rollback(rollbackB);
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
} finally {
RollbackTestUtils.dropShellPermissionIdentity();
}
}
/**
* Test that available multi-package rollbacks are properly persisted.
*/
@Test
public void testAvailableMultiPackageRollbackPersistence() throws Exception {
try {
RollbackTestUtils.adoptShellPermissionIdentity(
Manifest.permission.INSTALL_PACKAGES,
Manifest.permission.DELETE_PACKAGES,
Manifest.permission.MANAGE_ROLLBACKS);
RollbackManager rm = RollbackTestUtils.getRollbackManager();
RollbackTestUtils.uninstall(TEST_APP_A);
RollbackTestUtils.uninstall(TEST_APP_B);
RollbackTestUtils.installMultiPackage(false,
"RollbackTestAppAv1.apk",
"RollbackTestAppBv1.apk");
RollbackTestUtils.installMultiPackage(true,
"RollbackTestAppAv2.apk",
"RollbackTestAppBv2.apk");
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
// The app should now be available for rollback.
// TODO: See if there is a way to remove this race condition
// between when the app is installed and when the rollback
// is made available.
Thread.sleep(1000);
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_A));
RollbackInfo rollbackA = rm.getAvailableRollback(TEST_APP_A);
assertNotNull(rollbackA);
assertEquals(TEST_APP_A, rollbackA.targetPackage.packageName);
assertEquals(2, rollbackA.targetPackage.higherVersion.versionCode);
assertEquals(1, rollbackA.targetPackage.lowerVersion.versionCode);
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_B));
RollbackInfo rollbackB = rm.getAvailableRollback(TEST_APP_B);
assertNotNull(rollbackB);
assertEquals(TEST_APP_B, rollbackB.targetPackage.packageName);
assertEquals(2, rollbackB.targetPackage.higherVersion.versionCode);
assertEquals(1, rollbackB.targetPackage.lowerVersion.versionCode);
// Reload the persisted data.
rm.reloadPersistedData();
// The apps should still be available for rollback.
rollbackA = rm.getAvailableRollback(TEST_APP_A);
assertNotNull(rollbackA);
assertEquals(TEST_APP_A, rollbackA.targetPackage.packageName);
assertEquals(2, rollbackA.targetPackage.higherVersion.versionCode);
assertEquals(1, rollbackA.targetPackage.lowerVersion.versionCode);
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_B));
rollbackB = rm.getAvailableRollback(TEST_APP_B);
assertNotNull(rollbackB);
assertEquals(TEST_APP_B, rollbackB.targetPackage.packageName);
assertEquals(2, rollbackB.targetPackage.higherVersion.versionCode);
assertEquals(1, rollbackB.targetPackage.lowerVersion.versionCode);
// Rollback of B should rollback A as well
RollbackTestUtils.rollback(rollbackB);
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A));
assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_B));
} finally {
RollbackTestUtils.dropShellPermissionIdentity();
}
}
/**
* Test that recently executed rollback data is properly persisted.
*/
@Test
public void testRecentlyExecutedRollbackPersistence() throws Exception {
try {
RollbackTestUtils.adoptShellPermissionIdentity(
Manifest.permission.INSTALL_PACKAGES,
@@ -190,9 +329,6 @@ public class RollbackTest {
RollbackManager rm = RollbackTestUtils.getRollbackManager();
// TODO: Test this with multi-package rollback, not just single
// package rollback.
// Prep installation of TEST_APP_A
RollbackTestUtils.uninstall(TEST_APP_A);
RollbackTestUtils.install("RollbackTestAppAv1.apk", false);
RollbackTestUtils.install("RollbackTestAppAv2.apk", true);
@@ -205,21 +341,6 @@ public class RollbackTest {
Thread.sleep(1000);
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_A));
RollbackInfo rollback = rm.getAvailableRollback(TEST_APP_A);
assertNotNull(rollback);
assertEquals(TEST_APP_A, rollback.targetPackage.packageName);
assertEquals(2, rollback.targetPackage.higherVersion.versionCode);
assertEquals(1, rollback.targetPackage.lowerVersion.versionCode);
// Reload the persisted data.
rm.reloadPersistedData();
// The app should still be available for rollback.
assertTrue(rm.getPackagesWithAvailableRollbacks().contains(TEST_APP_A));
rollback = rm.getAvailableRollback(TEST_APP_A);
assertNotNull(rollback);
assertEquals(TEST_APP_A, rollback.targetPackage.packageName);
assertEquals(2, rollback.targetPackage.higherVersion.versionCode);
assertEquals(1, rollback.targetPackage.lowerVersion.versionCode);
// Roll back the app.
RollbackTestUtils.rollback(rollback);