From 26b3e5b95535d1fcc7c40ec3ee1771215ab5a2fb Mon Sep 17 00:00:00 2001 From: shafik Date: Mon, 11 Mar 2019 16:27:15 +0000 Subject: [PATCH] Test staged rollback for apk and apex install In addition, add some methods to RollbackTestUtils to make old code reusable for the new test. Bug: 124043688 Test: atest StagedRollbackTest Change-Id: I2b259671861c4081f13922f03ea2e251568e06bc --- .../android/tests/rollback/RollbackTestUtils.java | 47 +++++++-- .../android/tests/rollback/StagedRollbackTest.java | 106 +++++++++++++++++---- .../tests/rollback/host/StagedRollbackTest.java | 14 +++ 3 files changed, 144 insertions(+), 23 deletions(-) diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java index ed8a53364ec6..e50d2f263b5d 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTestUtils.java @@ -346,16 +346,26 @@ class RollbackTestUtils { } /** - * Asserts that the given RollbackInfo has a single package with expected - * package name and versions. + * Asserts that the given RollbackInfo has the given packages with expected + * package names and all are rolled to and from the same given versions. */ - static void assertRollbackInfoEquals(String packageName, + static void assertRollbackInfoEquals(String[] packageNames, long versionRolledBackFrom, long versionRolledBackTo, RollbackInfo info, VersionedPackage... causePackages) { assertNotNull(info); - assertEquals(1, info.getPackages().size()); - assertPackageRollbackInfoEquals(packageName, versionRolledBackFrom, versionRolledBackTo, - info.getPackages().get(0)); + assertEquals(packageNames.length, info.getPackages().size()); + int foundPackages = 0; + for (String packageName : packageNames) { + for (PackageRollbackInfo pkgRollbackInfo : info.getPackages()) { + if (packageName.equals(pkgRollbackInfo.getPackageName())) { + foundPackages++; + assertPackageRollbackInfoEquals(packageName, versionRolledBackFrom, + versionRolledBackTo, pkgRollbackInfo); + break; + } + } + } + assertEquals(packageNames.length, foundPackages); assertEquals(causePackages.length, info.getCausePackages().size()); for (int i = 0; i < causePackages.length; ++i) { assertEquals(causePackages[i].getPackageName(), @@ -366,6 +376,18 @@ class RollbackTestUtils { } /** + * Asserts that the given RollbackInfo has a single package with expected + * package name and versions. + */ + static void assertRollbackInfoEquals(String packageName, + long versionRolledBackFrom, long versionRolledBackTo, + RollbackInfo info, VersionedPackage... causePackages) { + String[] packageNames = {packageName}; + assertRollbackInfoEquals(packageNames, versionRolledBackFrom, versionRolledBackTo, info, + causePackages); + } + + /** * Waits for the given session to be marked as ready. * Throws an assertion if the session fails. */ @@ -459,4 +481,17 @@ class RollbackTestUtils { fail(result); } } + + /** + * Return the rollback info for a recently committed rollback, by matching the rollback id, or + * return null if no matching rollback is found. + */ + static RollbackInfo getRecentlyCommittedRollbackInfoById(int getRollbackId) { + for (RollbackInfo info : getRollbackManager().getRecentlyCommittedRollbacks()) { + if (info.getRollbackId() == getRollbackId) { + return info; + } + } + return null; + } } diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java index 59ae8d9deaeb..047451b643da 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java @@ -17,6 +17,7 @@ package com.android.tests.rollback; import static com.android.tests.rollback.RollbackTestUtils.assertRollbackInfoEquals; +import static com.android.tests.rollback.RollbackTestUtils.getRecentlyCommittedRollbackInfoById; import static com.android.tests.rollback.RollbackTestUtils.getUniqueRollbackInfoForPackage; import android.Manifest; @@ -25,7 +26,6 @@ import android.content.rollback.RollbackManager; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotEquals; -import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import org.junit.After; @@ -47,6 +47,8 @@ public class StagedRollbackTest { private static final String TAG = "RollbackTest"; private static final String TEST_APP_A = "com.android.tests.rollback.testapp.A"; + private static final String TEST_APP_A_V1 = "RollbackTestAppAv1.apk"; + private static final String TEST_APP_A_V2 = "RollbackTestAppAv2.apk"; private static final String TEST_APEX_PKG = "com.android.tests.rollback.testapex"; private static final String TEST_APEX_V1 = "com.android.tests.rollback.testapex.RollbackTestApexV1.apex"; @@ -82,11 +84,11 @@ public class StagedRollbackTest { RollbackTestUtils.uninstall(TEST_APP_A); assertEquals(-1, RollbackTestUtils.getInstalledVersion(TEST_APP_A)); - RollbackTestUtils.install("RollbackTestAppAv1.apk", false); + RollbackTestUtils.install(TEST_APP_A_V1, false); assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A)); RollbackTestUtils.processUserData(TEST_APP_A); - RollbackTestUtils.installStaged(true, "RollbackTestAppAv2.apk"); + RollbackTestUtils.installStaged(true, TEST_APP_A_V2); // At this point, the host test driver will reboot the device and run // testApkOnlyCommitRollback(). @@ -142,6 +144,86 @@ public class StagedRollbackTest { } /** + * Test rollbacks of staged installs an apk and an apex. + * Prepare apex (and apk) phase. + */ + @Test + public void testApkAndApexPrepare() throws Exception { + RollbackTestUtils.uninstall(TEST_APP_A); + assertEquals(-1, RollbackTestUtils.getInstalledVersion(TEST_APP_A)); + + // Note: can't uninstall the apex. See note in #testApexOnlyPrepareApex(). + RollbackTestUtils.installStaged(false, TEST_APP_A_V1, TEST_APEX_V1); + + // At this point, the host test driver will reboot the device and run + // testApkAndApexEnableRollback(). + } + + /** + * Test rollbacks of staged installs an apk and an apex. + * Enable rollback phase. + */ + @Test + public void testApkAndApexEnableRollback() throws Exception { + assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APEX_PKG)); + assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A)); + + RollbackTestUtils.installStaged(true, TEST_APP_A_V2, TEST_APEX_V2); + + // At this point, the host test driver will reboot the device and run + // testApkAndApexCommitRollback(). + } + + /** + * Test rollbacks of staged installs an apk and an apex. + * Commit rollback phase. + */ + @Test + public void testApkAndApexCommitRollback() throws Exception { + assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APEX_PKG)); + assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A)); + + RollbackTestUtils.processUserData(TEST_APP_A); + + RollbackManager rm = RollbackTestUtils.getRollbackManager(); + + RollbackInfo rollback = getUniqueRollbackInfoForPackage( + rm.getAvailableRollbacks(), TEST_APP_A); + String[] packagesNames = {TEST_APEX_PKG, TEST_APP_A}; + assertRollbackInfoEquals(packagesNames, 2, 1, rollback); + assertTrue(rollback.isStaged()); + + RollbackTestUtils.rollback(rollback.getRollbackId()); + + RollbackInfo committed = getRecentlyCommittedRollbackInfoById(rollback.getRollbackId()); + + assertRollbackInfoEquals(packagesNames, 2, 1, committed); + assertTrue(committed.isStaged()); + assertNotEquals(-1, committed.getCommittedSessionId()); + + RollbackTestUtils.waitForSessionReady(committed.getCommittedSessionId()); + + // The apex and apk should not be rolled back until after reboot. + assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APEX_PKG)); + assertEquals(2, RollbackTestUtils.getInstalledVersion(TEST_APP_A)); + + // At this point, the host test driver will reboot the device and run + // testApkAndApexConfirmRollback(). + } + + /** + * Test rollbacks of staged installs an apk and an apex. + * Confirm rollback phase. + */ + @Test + public void testApkAndApexConfirmRollback() throws Exception { + assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APEX_PKG)); + assertEquals(1, RollbackTestUtils.getInstalledVersion(TEST_APP_A)); + + RollbackTestUtils.processUserData(TEST_APP_A); + } + + /** * Test rollbacks of staged installs involving only apex. * Prepare apex phase. */ @@ -171,7 +253,7 @@ public class StagedRollbackTest { } /** - * Test rollbacks of staged installs involving only apks. + * Test rollbacks of staged installs involving only apex. * Commit rollback phase. */ @Test @@ -186,18 +268,8 @@ public class StagedRollbackTest { RollbackTestUtils.rollback(rollback.getRollbackId()); - // Note: We can't use getUniqueRollbackInfoForPackage for the apex, - // because we can't uninstall the apex (b/123667725), which means - // there's no way to clear info about rollbacks from previous tests - // run on the device. Look up the info by rollback id instead. - RollbackInfo committed = null; - for (RollbackInfo info : rm.getRecentlyCommittedRollbacks()) { - if (info.getRollbackId() == rollback.getRollbackId()) { - assertNull(committed); - committed = info; - break; - } - } + RollbackInfo committed = getRecentlyCommittedRollbackInfoById(rollback.getRollbackId()); + assertRollbackInfoEquals(TEST_APEX_PKG, 2, 1, committed); assertTrue(committed.isStaged()); assertNotEquals(-1, committed.getCommittedSessionId()); @@ -212,7 +284,7 @@ public class StagedRollbackTest { } /** - * Test rollbacks of staged installs involving only apks. + * Test rollbacks of staged installs involving only apex. * Confirm rollback phase. */ @Test diff --git a/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java b/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java index 24a51dc5a060..ac7f634d51f1 100644 --- a/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java +++ b/tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java @@ -67,4 +67,18 @@ public class StagedRollbackTest extends BaseHostJUnit4Test { getDevice().reboot(); runPhase("testApexOnlyConfirmRollback"); } + + /** + * Tests staged rollbacks involving apk and apex. + */ + @Test + public void testApkAndApex() throws Exception { + runPhase("testApkAndApexPrepare"); + getDevice().reboot(); + runPhase("testApkAndApexEnableRollback"); + getDevice().reboot(); + runPhase("testApkAndApexCommitRollback"); + getDevice().reboot(); + runPhase("testApkAndApexConfirmRollback"); + } } -- 2.11.0