diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index f917ee89701a2..27471936689a2 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -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); } diff --git a/services/core/java/com/android/server/rollback/Rollback.java b/services/core/java/com/android/server/rollback/Rollback.java index 9560f59924dee..7bf3478ac49e3 100644 --- a/services/core/java/com/android/server/rollback/Rollback.java +++ b/services/core/java/com/android/server/rollback/Rollback.java @@ -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()) { diff --git a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java index 9e19f57ed0e2d..be9c518453df2 100644 --- a/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java +++ b/services/core/java/com/android/server/rollback/RollbackManagerServiceImpl.java @@ -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; } diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java index fc62f5be801c1..6b783f7098105 100644 --- a/services/core/java/com/android/server/rollback/RollbackStore.java +++ b/services/core/java/com/android/server/rollback/RollbackStore.java @@ -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"), diff --git a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java index 4618157ef56ad..2a4c3fdf8f43e 100644 --- a/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/rollback/AppDataRollbackHelperTest.java @@ -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 diff --git a/services/tests/servicestests/src/com/android/server/rollback/RollbackStoreTest.java b/services/tests/servicestests/src/com/android/server/rollback/RollbackStoreTest.java index c42f936d3ab4d..9d56a36196bbc 100644 --- a/services/tests/servicestests/src/com/android/server/rollback/RollbackStoreTest.java +++ b/services/tests/servicestests/src/com/android/server/rollback/RollbackStoreTest.java @@ -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 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()); diff --git a/services/tests/servicestests/src/com/android/server/rollback/RollbackUnitTest.java b/services/tests/servicestests/src/com/android/server/rollback/RollbackUnitTest.java index cf1ed4815a748..5ba4851270fd5 100644 --- a/services/tests/servicestests/src/com/android/server/rollback/RollbackUnitTest.java +++ b/services/tests/servicestests/src/com/android/server/rollback/RollbackUnitTest.java @@ -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));