diff options
| -rw-r--r-- | services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java | 5 | ||||
| -rw-r--r-- | tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java | 59 |
2 files changed, 63 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index bb22c942336d..88a5fb48ada4 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -489,7 +489,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub { mAvailableRollbacks = null; mRecentlyExecutedRollbacks = null; } - getHandler().post(() -> ensureRollbackDataLoaded()); + getHandler().post(() -> { + updateRollbackLifetimeDurationInMillis(); + ensureRollbackDataLoaded(); + }); } @Override diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java index 8ae615651666..7be83edd91b9 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java @@ -32,6 +32,7 @@ import android.content.rollback.RollbackInfo; import android.content.rollback.RollbackManager; import android.os.Handler; import android.os.HandlerThread; +import android.provider.DeviceConfig; import android.support.test.InstrumentationRegistry; import android.util.Log; @@ -331,6 +332,64 @@ public class RollbackTest { } /** + * Test the scheduling aspect of rollback expiration. + */ + @Test + public void testRollbackExpiresAfterLifetime() throws Exception { + long expirationTime = TimeUnit.SECONDS.toMillis(30); + long defaultExpirationTime = TimeUnit.HOURS.toMillis(48); + RollbackManager rm = RollbackTestUtils.getRollbackManager(); + + try { + RollbackTestUtils.adoptShellPermissionIdentity( + Manifest.permission.INSTALL_PACKAGES, + Manifest.permission.DELETE_PACKAGES, + Manifest.permission.MANAGE_ROLLBACKS, + Manifest.permission.WRITE_DEVICE_CONFIG); + + DeviceConfig.setProperty(DeviceConfig.Rollback.BOOT_NAMESPACE, + DeviceConfig.Rollback.ROLLBACK_LIFETIME_IN_MILLIS, + Long.toString(expirationTime), false /* makeDefault*/); + + // Pull the new expiration time from DeviceConfig + rm.reloadPersistedData(); + + // Uninstall TEST_APP_A + RollbackTestUtils.uninstall(TEST_APP_A); + assertEquals(-1, RollbackTestUtils.getInstalledVersion(TEST_APP_A)); + + // Install v1 of the app (without rollbacks enabled). + RollbackTestUtils.install("RollbackTestAppAv1.apk", false); + assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A)); + + // Upgrade from v1 to v2, with rollbacks enabled. + RollbackTestUtils.install("RollbackTestAppAv2.apk", true); + assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A)); + + // Check that the rollback data has not expired + Thread.sleep(1000); + RollbackInfo rollback = getUniqueRollbackInfoForPackage( + rm.getAvailableRollbacks(), TEST_APP_A); + assertRollbackInfoEquals(TEST_APP_A, 2, 1, rollback); + + // Give it a little more time, but still not the long enough to expire + Thread.sleep(expirationTime / 2); + rollback = getUniqueRollbackInfoForPackage( + rm.getAvailableRollbacks(), TEST_APP_A); + assertRollbackInfoEquals(TEST_APP_A, 2, 1, rollback); + + // Check that the data has expired after the expiration time (with a buffer of 1 second) + Thread.sleep(expirationTime / 2); + assertNull(getUniqueRollbackInfoForPackage(rm.getAvailableRollbacks(), TEST_APP_A)); + } finally { + DeviceConfig.setProperty(DeviceConfig.Rollback.BOOT_NAMESPACE, + DeviceConfig.Rollback.ROLLBACK_LIFETIME_IN_MILLIS, + Long.toString(defaultExpirationTime), false /* makeDefault*/); + RollbackTestUtils.dropShellPermissionIdentity(); + } + } + + /** * Test explicit expiration of rollbacks. * Does not test the scheduling aspects of rollback expiration. */ |