Merge changes I5e7bae28,I2a6b58f1,I54b73707

* changes:
  Remove dead code (3/n)
  Unify the flow of enabling rollbacks (2/n)
  Give original session id to non-staged rollbacks (1/n)
This commit is contained in:
JW Wang
2021-04-28 03:34:40 +00:00
committed by Android (Google) Code Review
7 changed files with 97 additions and 148 deletions

View File

@@ -2539,14 +2539,7 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub {
mRelinquished = true;
// TODO(b/169375643): Remove this workaround once b/161121612 is fixed.
PackageInstaller.SessionParams copiedParams = params.copy();
if (params.isStaged) {
// This is called by the pre-reboot verification. Don't enable rollback here since
// it has been enabled when pre-reboot verification starts.
copiedParams.installFlags &= ~PackageManager.INSTALL_ENABLE_ROLLBACK;
}
return mPm.new VerificationParams(user, stageDir, localObserver, copiedParams,
return mPm.new VerificationParams(user, stageDir, localObserver, params,
mInstallSource, mInstallerUid, mSigningDetails, sessionId, mPackageLite);
}

View File

@@ -116,10 +116,10 @@ class Rollback {
static final int ROLLBACK_STATE_DELETED = 4;
/**
* The session ID for the staged session if this rollback data represents a staged session,
* {@code -1} otherwise.
* The session ID associate with this rollback. This is the parent session ID in the case of
* a multi-package session.
*/
private final int mStagedSessionId;
private final int mOriginalSessionId;
/**
* The rollback info for this rollback.
@@ -180,13 +180,6 @@ class Rollback {
*/
private final int[] mPackageSessionIds;
/**
* The number of sessions in the install which are notified with success by
* {@link PackageInstaller.SessionCallback#onFinished(int, boolean)}.
* This rollback will be enabled only after all child sessions finished with success.
*/
private int mNumPackageSessionsWithSuccess;
/**
* The extension versions supported at the time of rollback creation.
*/
@@ -203,24 +196,25 @@ class Rollback {
*
* @param rollbackId the id of the rollback.
* @param backupDir the directory where the rollback data is stored.
* @param stagedSessionId the session id if this is a staged rollback, -1 otherwise.
* @param originalSessionId the session id associated with this rollback.
* @param isStaged true if this is a staged rollback.
* @param userId the user that performed the install with rollback enabled.
* @param installerPackageName the installer package name from the original install session.
* @param packageSessionIds the session ids for all packages in the install.
* @param extensionVersions the extension versions supported at the time of rollback creation
*/
Rollback(int rollbackId, File backupDir, int stagedSessionId, int userId,
Rollback(int rollbackId, File backupDir, int originalSessionId, boolean isStaged, int userId,
String installerPackageName, int[] packageSessionIds,
SparseIntArray extensionVersions) {
this.info = new RollbackInfo(rollbackId,
/* packages */ new ArrayList<>(),
/* isStaged */ stagedSessionId != -1,
/* isStaged */ isStaged,
/* causePackages */ new ArrayList<>(),
/* committedSessionId */ -1);
mUserId = userId;
mInstallerPackageName = installerPackageName;
mBackupDir = backupDir;
mStagedSessionId = stagedSessionId;
mOriginalSessionId = originalSessionId;
mState = ROLLBACK_STATE_ENABLING;
mTimestamp = Instant.now();
mPackageSessionIds = packageSessionIds != null ? packageSessionIds : new int[0];
@@ -228,16 +222,10 @@ class Rollback {
mHandler = Looper.myLooper() != null ? new Handler(Looper.myLooper()) : null;
}
Rollback(int rollbackId, File backupDir, int stagedSessionId, int userId,
String installerPackageName) {
this(rollbackId, backupDir, stagedSessionId, userId, installerPackageName, null,
new SparseIntArray(0));
}
/**
* Constructs a pre-populated Rollback instance.
*/
Rollback(RollbackInfo info, File backupDir, Instant timestamp, int stagedSessionId,
Rollback(RollbackInfo info, File backupDir, Instant timestamp, int originalSessionId,
@RollbackState int state, String stateDescription, boolean restoreUserDataInProgress,
int userId, String installerPackageName, SparseIntArray extensionVersions) {
this.info = info;
@@ -245,7 +233,7 @@ class Rollback {
mInstallerPackageName = installerPackageName;
mBackupDir = backupDir;
mTimestamp = timestamp;
mStagedSessionId = stagedSessionId;
mOriginalSessionId = originalSessionId;
mState = state;
mStateDescription = stateDescription;
mRestoreUserDataInProgress = restoreUserDataInProgress;
@@ -298,12 +286,11 @@ class Rollback {
}
/**
* Returns the session ID for the staged session if this rollback data represents a staged
* session, or {@code -1} otherwise.
* Returns the session ID associated with this rollback, or {@code -1} if unknown.
*/
@AnyThread
int getStagedSessionId() {
return mStagedSessionId;
int getOriginalSessionId() {
return mOriginalSessionId;
}
/**
@@ -837,17 +824,6 @@ class Rollback {
return false;
}
/**
* Called when a child session finished with success.
* Returns true when all child sessions are notified with success. This rollback will be
* enabled only after all child sessions finished with success.
*/
@WorkerThread
boolean notifySessionWithSuccess() {
assertInWorkerThread();
return ++mNumPackageSessionsWithSuccess == mPackageSessionIds.length;
}
/**
* Returns true if all packages in this rollback are enabled. We won't enable this rollback
* until all packages are enabled. Note we don't count apk-in-apex here since they are enabled
@@ -954,9 +930,8 @@ class Rollback {
ipw.println("-state: " + getStateAsString());
ipw.println("-stateDescription: " + mStateDescription);
ipw.println("-timestamp: " + getTimestamp());
if (getStagedSessionId() != -1) {
ipw.println("-stagedSessionId: " + getStagedSessionId());
}
ipw.println("-isStaged: " + isStaged());
ipw.println("-originalSessionId: " + getOriginalSessionId());
ipw.println("-packages:");
ipw.increaseIndent();
for (PackageRollbackInfo pkg : info.getPackages()) {

View File

@@ -611,11 +611,11 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
}
PackageInstaller.SessionInfo session = mContext.getPackageManager()
.getPackageInstaller().getSessionInfo(rollback.getStagedSessionId());
.getPackageInstaller().getSessionInfo(rollback.getOriginalSessionId());
if (session == null || session.isStagedSessionFailed()) {
if (rollback.isEnabling()) {
iter.remove();
deleteRollback(rollback, "Session " + rollback.getStagedSessionId()
deleteRollback(rollback, "Session " + rollback.getOriginalSessionId()
+ " not existed or failed");
}
continue;
@@ -789,7 +789,13 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
newRollback = createNewRollback(parentSession);
}
return enableRollbackForPackageSession(newRollback, packageSession);
if (enableRollbackForPackageSession(newRollback, packageSession)) {
// Persist the rollback if all packages are enabled. We will make the rollback
// available once the whole session is installed successfully.
return newRollback.allPackagesEnabled() ? completeEnableRollback(newRollback) : true;
} else {
return false;
}
}
@WorkerThread
@@ -978,43 +984,10 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
throw new SecurityException("notifyStagedSession may only be called by the system.");
}
// NOTE: We post this runnable on the RollbackManager's binder thread because we'd prefer
// to preserve the invariant that all operations that modify state happen there.
return awaitResult(() -> {
assertInWorkerThread();
PackageInstaller installer = mContext.getPackageManager().getPackageInstaller();
final PackageInstaller.SessionInfo session = installer.getSessionInfo(sessionId);
if (session == null) {
Slog.e(TAG, "No matching install session for: " + sessionId);
return -1;
}
Rollback newRollback = createNewRollback(session);
if (!session.isMultiPackage()) {
if (!enableRollbackForPackageSession(newRollback, session)) {
Slog.e(TAG, "Unable to enable rollback for session: " + sessionId);
}
} else {
for (int childSessionId : session.getChildSessionIds()) {
final PackageInstaller.SessionInfo childSession =
installer.getSessionInfo(childSessionId);
if (childSession == null) {
Slog.e(TAG, "No matching child install session for: " + childSessionId);
break;
}
if (!enableRollbackForPackageSession(newRollback, childSession)) {
Slog.e(TAG, "Unable to enable rollback for session: " + sessionId);
break;
}
}
}
if (!completeEnableRollback(newRollback)) {
return -1;
} else {
return newRollback.info.getRollbackId();
}
Rollback rollback = getRollbackForSession(sessionId);
return rollback != null ? rollback.info.getRollbackId() : -1;
});
}
@@ -1124,21 +1097,25 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
Slog.v(TAG, "SessionCallback.onFinished id=" + sessionId + " success=" + success);
}
Rollback rollback = getRollbackForSession(sessionId);
if (rollback == null || !rollback.isEnabling()
|| sessionId != rollback.getOriginalSessionId()) {
// We only care about the parent session id which will tell us whether the
// whole session is successful or not.
return;
}
if (success) {
Rollback rollback = getRollbackForSession(sessionId);
if (rollback != null && !rollback.isStaged() && rollback.isEnabling()
&& rollback.notifySessionWithSuccess()
&& completeEnableRollback(rollback)) {
if (!rollback.isStaged() && completeEnableRollback(rollback)) {
// completeEnableRollback() ensures the rollback is deleted if not all packages
// are enabled. For staged rollbacks, we will make them available in
// onBootCompleted().
makeRollbackAvailable(rollback);
}
} else {
Rollback rollback = getRollbackForSession(sessionId);
if (rollback != null && rollback.isEnabling()) {
Slog.w(TAG, "Delete rollback id=" + rollback.info.getRollbackId()
+ " for failed session id=" + sessionId);
mRollbacks.remove(rollback);
deleteRollback(rollback, "Session " + sessionId + " failed");
}
Slog.w(TAG, "Delete rollback id=" + rollback.info.getRollbackId()
+ " for failed session id=" + sessionId);
mRollbacks.remove(rollback);
deleteRollback(rollback, "Session " + sessionId + " failed");
}
}
}
@@ -1307,7 +1284,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
rollback = mRollbackStore.createStagedRollback(rollbackId, parentSessionId, userId,
installerPackageName, packageSessionIds, getExtensionVersions());
} else {
rollback = mRollbackStore.createNonStagedRollback(rollbackId, userId,
rollback = mRollbackStore.createNonStagedRollback(rollbackId, parentSessionId, userId,
installerPackageName, packageSessionIds, getExtensionVersions());
}
@@ -1339,7 +1316,7 @@ class RollbackManagerServiceImpl extends IRollbackManager.Stub implements Rollba
// We expect mRollbacks to be a very small list; linear search should be plenty fast.
for (int i = 0; i < mRollbacks.size(); ++i) {
Rollback rollback = mRollbacks.get(i);
if (rollback.getStagedSessionId() == sessionId
if (rollback.getOriginalSessionId() == sessionId
|| rollback.containsSessionId(sessionId)) {
return rollback;
}

View File

@@ -209,23 +209,24 @@ class RollbackStore {
* Creates a new Rollback instance for a non-staged rollback with
* backupDir assigned.
*/
Rollback createNonStagedRollback(int rollbackId, int userId, String installerPackageName,
int[] packageSessionIds, SparseIntArray extensionVersions) {
Rollback createNonStagedRollback(int rollbackId, int originalSessionId, int userId,
String installerPackageName, int[] packageSessionIds,
SparseIntArray extensionVersions) {
File backupDir = new File(mRollbackDataDir, Integer.toString(rollbackId));
return new Rollback(rollbackId, backupDir, -1, userId, installerPackageName,
packageSessionIds, extensionVersions);
return new Rollback(rollbackId, backupDir, originalSessionId, /* isStaged */ false, userId,
installerPackageName, packageSessionIds, extensionVersions);
}
/**
* Creates a new Rollback instance for a staged rollback with
* backupDir assigned.
*/
Rollback createStagedRollback(int rollbackId, int stagedSessionId, int userId,
Rollback createStagedRollback(int rollbackId, int originalSessionId, int userId,
String installerPackageName, int[] packageSessionIds,
SparseIntArray extensionVersions) {
File backupDir = new File(mRollbackDataDir, Integer.toString(rollbackId));
return new Rollback(rollbackId, backupDir, stagedSessionId, userId, installerPackageName,
packageSessionIds, extensionVersions);
return new Rollback(rollbackId, backupDir, originalSessionId, /* isStaged */ true, userId,
installerPackageName, packageSessionIds, extensionVersions);
}
private static boolean isLinkPossible(File oldFile, File newFile) {
@@ -312,7 +313,7 @@ class RollbackStore {
JSONObject dataJson = new JSONObject();
dataJson.put("info", rollbackInfoToJson(rollback.info));
dataJson.put("timestamp", rollback.getTimestamp().toString());
dataJson.put("stagedSessionId", rollback.getStagedSessionId());
dataJson.put("originalSessionId", rollback.getOriginalSessionId());
dataJson.put("state", rollback.getStateAsString());
dataJson.put("stateDescription", rollback.getStateDescription());
dataJson.put("restoreUserDataInProgress", rollback.isRestoreUserDataInProgress());
@@ -380,7 +381,9 @@ class RollbackStore {
rollbackInfoFromJson(dataJson.getJSONObject("info")),
backupDir,
Instant.parse(dataJson.getString("timestamp")),
dataJson.getInt("stagedSessionId"),
// Backward compatibility: Historical rollbacks are not erased upon OTA update.
// Need to load the old field 'stagedSessionId' as fallback.
dataJson.optInt("originalSessionId", dataJson.optInt("stagedSessionId", -1)),
rollbackStateFromString(dataJson.getString("state")),
dataJson.optString("stateDescription"),
dataJson.getBoolean("restoreUserDataInProgress"),

View File

@@ -32,6 +32,7 @@ import static org.mockito.MockitoAnnotations.initMocks;
import android.content.pm.VersionedPackage;
import android.content.rollback.PackageRollbackInfo;
import android.content.rollback.PackageRollbackInfo.RestoreInfo;
import android.util.SparseIntArray;
import com.android.server.pm.ApexManager;
import com.android.server.pm.Installer;
@@ -119,8 +120,9 @@ public class AppDataRollbackHelperTest {
}
private static Rollback createRollbackForId(int rollbackId) {
return new Rollback(rollbackId, new File("/does/not/exist"), -1,
0, "com.xyz");
return new Rollback(rollbackId, new File("/does/not/exist"), -1, /* isStaged */ false, 0,
"com.xyz", null, new SparseIntArray(0));
}
@Test

View File

@@ -82,7 +82,7 @@ public class RollbackStoreTest {
+ "'ceSnapshotInodes':[]}],'isStaged':false,'causePackages':[{'packageName':'hello',"
+ "'longVersionCode':23},{'packageName':'something','longVersionCode':999}],"
+ "'committedSessionId':45654465},'timestamp':'2019-10-01T12:29:08.855Z',"
+ "'stagedSessionId':-1,'state':'enabling','apkSessionId':-1,"
+ "'originalSessionId':567,'state':'enabling','apkSessionId':-1,"
+ "'restoreUserDataInProgress':true, 'userId':0,"
+ "'installerPackageName':'some.installer'}";
@@ -102,7 +102,7 @@ public class RollbackStoreTest {
+ "'ceSnapshotInodes':[]}],'isStaged':false,'causePackages':[{'packageName':'hello',"
+ "'longVersionCode':23},{'packageName':'something','longVersionCode':999}],"
+ "'committedSessionId':45654465},'timestamp':'2019-10-01T12:29:08.855Z',"
+ "'stagedSessionId':-1,'state':'enabling','apkSessionId':-1,"
+ "'originalSessionId':567,'state':'enabling','apkSessionId':-1,"
+ "'restoreUserDataInProgress':true, 'userId':0,"
+ "'installerPackageName':'some.installer',"
+ "'extensionVersions':[{'sdkVersion':5,'extensionVersion':25},"
@@ -129,12 +129,13 @@ public class RollbackStoreTest {
SparseIntArray extensionVersions = new SparseIntArray();
extensionVersions.put(30, 71);
Rollback rollback = mRollbackStore.createNonStagedRollback(
ID, USER, INSTALLER, null, extensionVersions);
ID, 567, USER, INSTALLER, null, extensionVersions);
assertThat(rollback.getBackupDir().getAbsolutePath())
.isEqualTo(mFolder.getRoot().getAbsolutePath() + "/" + ID);
assertThat(rollback.isStaged()).isFalse();
assertThat(rollback.getOriginalSessionId()).isEqualTo(567);
assertThat(rollback.info.getRollbackId()).isEqualTo(ID);
assertThat(rollback.info.getPackages()).isEmpty();
assertThat(rollback.isEnabling()).isTrue();
@@ -153,7 +154,7 @@ public class RollbackStoreTest {
.isEqualTo(mFolder.getRoot().getAbsolutePath() + "/" + ID);
assertThat(rollback.isStaged()).isTrue();
assertThat(rollback.getStagedSessionId()).isEqualTo(897);
assertThat(rollback.getOriginalSessionId()).isEqualTo(897);
assertThat(rollback.info.getRollbackId()).isEqualTo(ID);
assertThat(rollback.info.getPackages()).isEmpty();
@@ -168,7 +169,7 @@ public class RollbackStoreTest {
extensionVersions.put(5, 25);
extensionVersions.put(30, 71);
Rollback origRb = mRollbackStore.createNonStagedRollback(
ID, USER, INSTALLER, null, extensionVersions);
ID, 567, USER, INSTALLER, null, extensionVersions);
origRb.setRestoreUserDataInProgress(true);
origRb.info.getCausePackages().add(new VersionedPackage("com.made.up", 2));
@@ -218,7 +219,7 @@ public class RollbackStoreTest {
@Test
public void loadFromJsonNoExtensionVersions() throws Exception {
Rollback expectedRb = mRollbackStore.createNonStagedRollback(
ID, USER, INSTALLER, null, new SparseIntArray(0));
ID, 567, USER, INSTALLER, null, new SparseIntArray(0));
expectedRb.setTimestamp(Instant.parse("2019-10-01T12:29:08.855Z"));
expectedRb.setRestoreUserDataInProgress(true);
@@ -268,7 +269,7 @@ public class RollbackStoreTest {
extensionVersions.put(5, 25);
extensionVersions.put(30, 71);
Rollback expectedRb = mRollbackStore.createNonStagedRollback(
ID, USER, INSTALLER, null, extensionVersions);
ID, 567, USER, INSTALLER, null, extensionVersions);
expectedRb.setTimestamp(Instant.parse("2019-10-01T12:29:08.855Z"));
expectedRb.setRestoreUserDataInProgress(true);
@@ -315,7 +316,7 @@ public class RollbackStoreTest {
@Test
public void saveAndDelete() {
Rollback rollback = mRollbackStore.createNonStagedRollback(
ID, USER, INSTALLER, null, new SparseIntArray(0));
ID, 567, USER, INSTALLER, null, new SparseIntArray(0));
RollbackStore.saveRollback(rollback);
@@ -331,7 +332,7 @@ public class RollbackStoreTest {
@Test
public void saveToHistoryAndLoad() {
Rollback origRb = mRollbackStore.createNonStagedRollback(
ID, USER, INSTALLER, null, new SparseIntArray(0));
ID, 567, USER, INSTALLER, null, new SparseIntArray(0));
mRollbackStore.saveRollbackToHistory(origRb);
List<Rollback> loadedRollbacks = mRollbackStore.loadHistorialRollbacks();
@@ -364,7 +365,7 @@ public class RollbackStoreTest {
assertThat(b.getApexPackageNames())
.containsExactlyElementsIn(a.getApexPackageNames());
assertThat(b.getStagedSessionId()).isEqualTo(a.getStagedSessionId());
assertThat(b.getOriginalSessionId()).isEqualTo(a.getOriginalSessionId());
assertThat(b.info.getCommittedSessionId()).isEqualTo(a.info.getCommittedSessionId());

View File

@@ -74,18 +74,28 @@ public class RollbackUnitTest {
when(mMockPmi.getPackageList()).thenReturn(mPackageList);
}
private Rollback createStagedRollback(int rollbackId, File backupDir, int originalSessionId) {
return new Rollback(rollbackId, backupDir, originalSessionId, /* isStaged */ true, USER,
INSTALLER, null, new SparseIntArray(0));
}
private Rollback createNonStagedRollback(int rollbackId, File backupDir) {
return new Rollback(rollbackId, backupDir, -1, /* isStaged */ false, USER,
INSTALLER, null, new SparseIntArray(0));
}
@Test
public void newEmptyStagedRollbackDefaults() {
int rollbackId = 123;
int sessionId = 567;
File file = new File("/test/testing");
Rollback rollback = new Rollback(rollbackId, file, sessionId, USER, INSTALLER);
Rollback rollback = createStagedRollback(rollbackId, file, sessionId);
assertThat(rollback.isEnabling()).isTrue();
assertThat(rollback.getBackupDir().getAbsolutePath()).isEqualTo("/test/testing");
assertThat(rollback.isStaged()).isTrue();
assertThat(rollback.getStagedSessionId()).isEqualTo(567);
assertThat(rollback.getOriginalSessionId()).isEqualTo(567);
}
@Test
@@ -93,7 +103,7 @@ public class RollbackUnitTest {
int rollbackId = 123;
File file = new File("/test/testing");
Rollback rollback = new Rollback(rollbackId, file, -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(rollbackId, file);
assertThat(rollback.isEnabling()).isTrue();
assertThat(rollback.getBackupDir().getAbsolutePath()).isEqualTo("/test/testing");
@@ -102,8 +112,7 @@ public class RollbackUnitTest {
@Test
public void rollbackMadeAvailable() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER,
INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
assertThat(rollback.isEnabling()).isTrue();
assertThat(rollback.isAvailable()).isFalse();
@@ -121,7 +130,7 @@ public class RollbackUnitTest {
@Test
public void deletedRollbackCannotBeMadeAvailable() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
rollback.delete(mMockDataHelper, "test");
@@ -135,7 +144,7 @@ public class RollbackUnitTest {
@Test
public void getPackageNamesAllAndJustApex() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
PackageRollbackInfo pkgInfo1 = newPkgInfoFor(PKG_1, 12, 10, false);
PackageRollbackInfo pkgInfo2 = newPkgInfoFor(PKG_2, 18, 11, true);
PackageRollbackInfo pkgInfo3 = newPkgInfoFor(PKG_3, 19, 1, false);
@@ -149,7 +158,7 @@ public class RollbackUnitTest {
@Test
public void includesPackagesAfterEnable() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
PackageRollbackInfo pkgInfo1 = newPkgInfoFor(PKG_1, 12, 10, false);
PackageRollbackInfo pkgInfo2 = newPkgInfoFor(PKG_2, 18, 12, true);
PackageRollbackInfo pkgInfo3 = newPkgInfoFor(PKG_3, 157, 156, false);
@@ -177,7 +186,7 @@ public class RollbackUnitTest {
@Test
public void snapshotWhenEnabling() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
PackageRollbackInfo pkgInfo1 = newPkgInfoFor(PKG_1, 12, 10, false);
PackageRollbackInfo pkgInfo2 = newPkgInfoFor(PKG_2, 18, 12, true);
rollback.info.getPackages().addAll(Arrays.asList(pkgInfo1, pkgInfo2));
@@ -195,7 +204,7 @@ public class RollbackUnitTest {
@Test
public void snapshotWhenAvailable() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
PackageRollbackInfo pkgInfo1 = newPkgInfoFor(PKG_1, 12, 10, false);
PackageRollbackInfo pkgInfo2 = newPkgInfoFor(PKG_2, 18, 12, true);
rollback.info.getPackages().addAll(Arrays.asList(pkgInfo1, pkgInfo2));
@@ -216,7 +225,7 @@ public class RollbackUnitTest {
@Test
public void snapshotWhenDeleted() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
PackageRollbackInfo pkgInfo1 = newPkgInfoFor(PKG_1, 12, 10, false);
PackageRollbackInfo pkgInfo2 = newPkgInfoFor(PKG_2, 18, 12, true);
rollback.info.getPackages().addAll(Arrays.asList(pkgInfo1, pkgInfo2));
@@ -237,7 +246,7 @@ public class RollbackUnitTest {
@Test
public void snapshotThenDeleteNoApex() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
PackageRollbackInfo pkgInfo1 = newPkgInfoFor(PKG_1, 12, 10, false);
PackageRollbackInfo pkgInfo2 = newPkgInfoFor(PKG_2, 18, 12, false);
rollback.info.getPackages().addAll(Arrays.asList(pkgInfo1, pkgInfo2));
@@ -259,7 +268,7 @@ public class RollbackUnitTest {
@Test
public void snapshotThenDeleteWithApex() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
PackageRollbackInfo pkgInfo1 = newPkgInfoFor(PKG_1, 12, 10, false);
PackageRollbackInfo pkgInfo2 = newPkgInfoFor(PKG_2, 18, 12, true);
rollback.info.getPackages().addAll(Arrays.asList(pkgInfo1, pkgInfo2));
@@ -282,7 +291,7 @@ public class RollbackUnitTest {
@Test
public void restoreUserDataDoesNothingIfNotInProgress() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
PackageRollbackInfo pkgInfo1 = newPkgInfoFor(PKG_1, 12, 10, false);
PackageRollbackInfo pkgInfo2 = newPkgInfoFor(PKG_2, 18, 12, true);
rollback.info.getPackages().addAll(Arrays.asList(pkgInfo1, pkgInfo2));
@@ -297,7 +306,7 @@ public class RollbackUnitTest {
@Test
public void restoreUserDataDoesNothingIfPackageNotFound() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
PackageRollbackInfo pkgInfo1 = newPkgInfoFor(PKG_1, 12, 10, false);
PackageRollbackInfo pkgInfo2 = newPkgInfoFor(PKG_2, 18, 12, true);
rollback.info.getPackages().addAll(Arrays.asList(pkgInfo1, pkgInfo2));
@@ -313,7 +322,7 @@ public class RollbackUnitTest {
@Test
public void restoreUserDataRestoresIfInProgressAndPackageFound() {
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER);
Rollback rollback = createNonStagedRollback(123, new File("/test/testing"));
PackageRollbackInfo pkgInfo1 = newPkgInfoFor(PKG_1, 12, 10, false);
PackageRollbackInfo pkgInfo2 = newPkgInfoFor(PKG_2, 18, 12, true);
rollback.info.getPackages().addAll(Arrays.asList(pkgInfo1, pkgInfo2));
@@ -328,21 +337,10 @@ public class RollbackUnitTest {
verify(mMockDataHelper).restoreAppData(123, pkgInfo1, 7, 333, "blah");
}
@Test
public void notifySessionWithSuccess() {
int[] sessionIds = new int[]{ 7777, 8888 };
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER,
sessionIds, new SparseIntArray(0));
// The 1st invocation returns false because not all child sessions are notified.
assertThat(rollback.notifySessionWithSuccess()).isFalse();
// The 2nd invocation returns true because now all child sessions are notified.
assertThat(rollback.notifySessionWithSuccess()).isTrue();
}
@Test
public void allPackagesEnabled() {
int[] sessionIds = new int[]{ 7777, 8888 };
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, USER, INSTALLER,
Rollback rollback = new Rollback(123, new File("/test/testing"), -1, false, USER, INSTALLER,
sessionIds, new SparseIntArray(0));
// #allPackagesEnabled returns false when 1 out of 2 packages is enabled.
rollback.info.getPackages().add(newPkgInfoFor(PKG_1, 12, 10, false));