Merge "Backport of ag/14170751 and ag/14170752." into rvc-qpr-dev

This commit is contained in:
JW Wang
2021-05-17 05:19:47 +00:00
committed by Android (Google) Code Review
3 changed files with 68 additions and 2 deletions

View File

@@ -554,8 +554,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub {
PackageInstaller.SessionInfo session = mContext.getPackageManager()
.getPackageInstaller().getSessionInfo(rollback.getStagedSessionId());
if (session == null || session.isStagedSessionFailed()) {
iter.remove();
rollback.delete(mAppDataRollbackHelper);
if (rollback.isEnabling()) {
iter.remove();
rollback.delete(mAppDataRollbackHelper);
}
continue;
}

View File

@@ -481,6 +481,33 @@ public class StagedRollbackTest {
assertThat(sm.isCheckpointSupported()).isTrue();
}
@Test
public void testExpireSession_Phase1_Install() throws Exception {
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(-1);
Install.single(TestApp.A1).commit();
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
Install.single(TestApp.A2).setEnableRollback().setStaged().commit();
}
@Test
public void testExpireSession_Phase2_VerifyInstall() throws Exception {
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
RollbackManager rm = RollbackUtils.getRollbackManager();
RollbackInfo rollback = getUniqueRollbackInfoForPackage(
rm.getAvailableRollbacks(), TestApp.A);
assertThat(rollback).isNotNull();
assertThat(rollback).packagesContainsExactly(Rollback.from(TestApp.A2).to(TestApp.A1));
assertThat(rollback.isStaged()).isTrue();
}
@Test
public void testExpireSession_Phase3_VerifyRollback() throws Exception {
RollbackManager rm = RollbackUtils.getRollbackManager();
RollbackInfo rollback = getUniqueRollbackInfoForPackage(
rm.getAvailableRollbacks(), TestApp.A);
assertThat(rollback).isNotNull();
}
@Test
public void hasMainlineModule() throws Exception {
String pkgName = getModuleMetadataPackageName();

View File

@@ -38,7 +38,9 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.File;
import java.time.Instant;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -441,6 +443,27 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
after.forEach(dir -> assertDirectoryIsEmpty(dir));
}
/**
* Tests an available rollback shouldn't be deleted when its session expires.
*/
@Test
public void testExpireSession() throws Exception {
runPhase("testExpireSession_Phase1_Install");
getDevice().reboot();
runPhase("testExpireSession_Phase2_VerifyInstall");
// Advance system clock by 7 days to expire the staged session
Instant t1 = Instant.ofEpochMilli(getDevice().getDeviceDate());
Instant t2 = t1.plusMillis(TimeUnit.DAYS.toMillis(7));
runAsRoot(() -> getDevice().setDate(Date.from(t2)));
// Somehow we need to wait for a while before reboot. Otherwise the change to the
// system clock will be reset after reboot.
Thread.sleep(3000);
getDevice().reboot();
runPhase("testExpireSession_Phase3_VerifyRollback");
}
private void pushTestApex() throws Exception {
CompatibilityBuildHelper buildHelper = new CompatibilityBuildHelper(getBuild());
final String fileName = APK_IN_APEX_TESTAPEX_NAME + "_v1.apex";
@@ -521,4 +544,18 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
return false;
}
}
@FunctionalInterface
private interface ExceptionalRunnable {
void run() throws Exception;
}
private void runAsRoot(ExceptionalRunnable runnable) throws Exception {
try {
getDevice().enableAdbRoot();
runnable.run();
} finally {
getDevice().disableAdbRoot();
}
}
}