Merge changes I19dc0adf,Ica510099
* changes: More error messages for device operations (4/n) More descriptive test phase names (3/n)
This commit is contained in:
@@ -88,7 +88,7 @@ public class StagedRollbackTest {
|
||||
* Enable rollback phase.
|
||||
*/
|
||||
@Test
|
||||
public void testBadApkOnly_Phase1() throws Exception {
|
||||
public void testBadApkOnly_Phase1_Install() throws Exception {
|
||||
Uninstall.packages(TestApp.A);
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(-1);
|
||||
|
||||
@@ -104,7 +104,7 @@ public class StagedRollbackTest {
|
||||
* Confirm that rollback was successfully enabled.
|
||||
*/
|
||||
@Test
|
||||
public void testBadApkOnly_Phase2() throws Exception {
|
||||
public void testBadApkOnly_Phase2_VerifyInstall() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
|
||||
InstallUtils.processUserData(TestApp.A);
|
||||
|
||||
@@ -129,7 +129,7 @@ public class StagedRollbackTest {
|
||||
* Trigger rollback phase.
|
||||
*/
|
||||
@Test
|
||||
public void testBadApkOnly_Phase3() throws Exception {
|
||||
public void testBadApkOnly_Phase3_Crash() throws Exception {
|
||||
// One more crash to trigger rollback
|
||||
RollbackUtils.sendCrashBroadcast(TestApp.A, 1);
|
||||
}
|
||||
@@ -139,7 +139,7 @@ public class StagedRollbackTest {
|
||||
* Confirm rollback phase.
|
||||
*/
|
||||
@Test
|
||||
public void testBadApkOnly_Phase4() throws Exception {
|
||||
public void testBadApkOnly_Phase4_VerifyRollback() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
InstallUtils.processUserData(TestApp.A);
|
||||
|
||||
@@ -158,7 +158,7 @@ public class StagedRollbackTest {
|
||||
* Stage install an apk with rollback that will be later triggered by unattributable crash.
|
||||
*/
|
||||
@Test
|
||||
public void testNativeWatchdogTriggersRollback_Phase1() throws Exception {
|
||||
public void testNativeWatchdogTriggersRollback_Phase1_Install() throws Exception {
|
||||
Uninstall.packages(TestApp.A);
|
||||
Install.single(TestApp.A1).commit();
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
@@ -170,7 +170,7 @@ public class StagedRollbackTest {
|
||||
* Verify the rollback is available.
|
||||
*/
|
||||
@Test
|
||||
public void testNativeWatchdogTriggersRollback_Phase2() throws Exception {
|
||||
public void testNativeWatchdogTriggersRollback_Phase2_VerifyInstall() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
|
||||
RollbackManager rm = RollbackUtils.getRollbackManager();
|
||||
assertThat(getUniqueRollbackInfoForPackage(rm.getAvailableRollbacks(),
|
||||
@@ -181,7 +181,7 @@ public class StagedRollbackTest {
|
||||
* Verify the rollback is committed after crashing.
|
||||
*/
|
||||
@Test
|
||||
public void testNativeWatchdogTriggersRollback_Phase3() throws Exception {
|
||||
public void testNativeWatchdogTriggersRollback_Phase3_VerifyRollback() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
RollbackManager rm = RollbackUtils.getRollbackManager();
|
||||
assertThat(getUniqueRollbackInfoForPackage(rm.getRecentlyCommittedRollbacks(),
|
||||
@@ -192,7 +192,7 @@ public class StagedRollbackTest {
|
||||
* Stage install an apk with rollback that will be later triggered by unattributable crash.
|
||||
*/
|
||||
@Test
|
||||
public void testNativeWatchdogTriggersRollbackForAll_Phase1() throws Exception {
|
||||
public void testNativeWatchdogTriggersRollbackForAll_Phase1_InstallA() throws Exception {
|
||||
Uninstall.packages(TestApp.A);
|
||||
Install.single(TestApp.A1).commit();
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
@@ -204,7 +204,7 @@ public class StagedRollbackTest {
|
||||
* Verify the rollback is available and then install another package with rollback.
|
||||
*/
|
||||
@Test
|
||||
public void testNativeWatchdogTriggersRollbackForAll_Phase2() throws Exception {
|
||||
public void testNativeWatchdogTriggersRollbackForAll_Phase2_InstallB() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
|
||||
RollbackManager rm = RollbackUtils.getRollbackManager();
|
||||
assertThat(getUniqueRollbackInfoForPackage(rm.getAvailableRollbacks(),
|
||||
@@ -222,7 +222,7 @@ public class StagedRollbackTest {
|
||||
* Verify the rollbacks are available.
|
||||
*/
|
||||
@Test
|
||||
public void testNativeWatchdogTriggersRollbackForAll_Phase3() throws Exception {
|
||||
public void testNativeWatchdogTriggersRollbackForAll_Phase3_VerifyInstall() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.B)).isEqualTo(2);
|
||||
RollbackManager rm = RollbackUtils.getRollbackManager();
|
||||
@@ -236,7 +236,7 @@ public class StagedRollbackTest {
|
||||
* Verify the rollbacks are committed after crashing.
|
||||
*/
|
||||
@Test
|
||||
public void testNativeWatchdogTriggersRollbackForAll_Phase4() throws Exception {
|
||||
public void testNativeWatchdogTriggersRollbackForAll_Phase4_VerifyRollback() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.B)).isEqualTo(1);
|
||||
RollbackManager rm = RollbackUtils.getRollbackManager();
|
||||
@@ -247,7 +247,7 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPreviouslyAbandonedRollbacks_Phase1() throws Exception {
|
||||
public void testPreviouslyAbandonedRollbacks_Phase1_InstallAndAbandon() throws Exception {
|
||||
Uninstall.packages(TestApp.A);
|
||||
Install.single(TestApp.A1).commit();
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
@@ -261,7 +261,7 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPreviouslyAbandonedRollbacks_Phase2() throws Exception {
|
||||
public void testPreviouslyAbandonedRollbacks_Phase2_Rollback() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
|
||||
InstallUtils.processUserData(TestApp.A);
|
||||
|
||||
@@ -272,7 +272,7 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPreviouslyAbandonedRollbacks_Phase3() throws Exception {
|
||||
public void testPreviouslyAbandonedRollbacks_Phase3_VerifyRollback() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
InstallUtils.processUserData(TestApp.A);
|
||||
Uninstall.packages(TestApp.A);
|
||||
@@ -284,7 +284,7 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackWhitelistedApp_Phase1() throws Exception {
|
||||
public void testRollbackAllowlistedApp_Phase1_Install() throws Exception {
|
||||
// Remove available rollbacks
|
||||
String pkgName = getModuleMetadataPackageName();
|
||||
RollbackUtils.getRollbackManager().expireRollbackForPackage(pkgName);
|
||||
@@ -296,7 +296,7 @@ public class StagedRollbackTest {
|
||||
Manifest.permission.INSTALL_PACKAGES,
|
||||
Manifest.permission.MANAGE_ROLLBACKS);
|
||||
|
||||
// Re-install a whitelisted app with rollbacks enabled
|
||||
// Re-install a allowlisted app with rollbacks enabled
|
||||
String filePath = InstrumentationRegistry.getInstrumentation().getContext()
|
||||
.getPackageManager().getPackageInfo(pkgName, 0).applicationInfo.sourceDir;
|
||||
TestApp app = new TestApp("ModuleMetadata", pkgName, -1, false, new File(filePath));
|
||||
@@ -305,12 +305,12 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackWhitelistedApp_Phase2() throws Exception {
|
||||
public void testRollbackAllowlistedApp_Phase2_VerifyInstall() throws Exception {
|
||||
assertThat(RollbackUtils.getAvailableRollback(getModuleMetadataPackageName())).isNotNull();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackDataPolicy_Phase1() throws Exception {
|
||||
public void testRollbackDataPolicy_Phase1_Install() throws Exception {
|
||||
Uninstall.packages(TestApp.A, TestApp.B, TestApp.C);
|
||||
Install.multi(TestApp.A1, TestApp.B1, TestApp.C1).commit();
|
||||
// Write user data version = 1
|
||||
@@ -328,7 +328,7 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackDataPolicy_Phase2() throws Exception {
|
||||
public void testRollbackDataPolicy_Phase2_Rollback() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.B)).isEqualTo(2);
|
||||
// Write user data version = 2
|
||||
@@ -341,7 +341,7 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackDataPolicy_Phase3() throws Exception {
|
||||
public void testRollbackDataPolicy_Phase3_VerifyRollback() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.B)).isEqualTo(1);
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.C)).isEqualTo(1);
|
||||
@@ -355,7 +355,7 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCleanUp() throws Exception {
|
||||
public void expireRollbacks() throws Exception {
|
||||
// testNativeWatchdogTriggersRollback will fail if multiple staged sessions are
|
||||
// committed on a device which doesn't support checkpoint. Let's clean up all rollbacks
|
||||
// so there is only one rollback to commit when testing native crashes.
|
||||
@@ -378,7 +378,7 @@ public class StagedRollbackTest {
|
||||
APK_IN_APEX_TESTAPEX_NAME + "_v2Crashing.apex");
|
||||
|
||||
@Test
|
||||
public void testRollbackApexWithApk_Phase1() throws Exception {
|
||||
public void testRollbackApexWithApk_Phase1_Install() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
InstallUtils.processUserData(TestApp.A);
|
||||
|
||||
@@ -388,7 +388,7 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackApexWithApk_Phase2() throws Exception {
|
||||
public void testRollbackApexWithApk_Phase2_Rollback() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(APK_IN_APEX_TESTAPEX_NAME)).isEqualTo(2);
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
|
||||
InstallUtils.processUserData(TestApp.A);
|
||||
@@ -416,7 +416,7 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackApexWithApk_Phase3() throws Exception {
|
||||
public void testRollbackApexWithApk_Phase3_VerifyRollback() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(APK_IN_APEX_TESTAPEX_NAME)).isEqualTo(1);
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
InstallUtils.processUserData(TestApp.A);
|
||||
@@ -426,7 +426,7 @@ public class StagedRollbackTest {
|
||||
* Installs an apex with an apk that can crash.
|
||||
*/
|
||||
@Test
|
||||
public void testRollbackApexWithApkCrashing_Phase1() throws Exception {
|
||||
public void testRollbackApexWithApkCrashing_Phase1_Install() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
int sessionId = Install.single(TEST_APEX_WITH_APK_V2_CRASHING).setStaged()
|
||||
.setEnableRollback().commit();
|
||||
@@ -437,7 +437,7 @@ public class StagedRollbackTest {
|
||||
* Verifies rollback has been enabled successfully. Then makes TestApp.A crash.
|
||||
*/
|
||||
@Test
|
||||
public void testRollbackApexWithApkCrashing_Phase2() throws Exception {
|
||||
public void testRollbackApexWithApkCrashing_Phase2_Crash() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(APK_IN_APEX_TESTAPEX_NAME)).isEqualTo(2);
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
|
||||
|
||||
@@ -452,20 +452,20 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackApexWithApkCrashing_Phase3() throws Exception {
|
||||
public void testRollbackApexWithApkCrashing_Phase3_VerifyRollback() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(APK_IN_APEX_TESTAPEX_NAME)).isEqualTo(1);
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackApexDataDirectories_Phase1() throws Exception {
|
||||
public void testRollbackApexDataDirectories_Phase1_Install() throws Exception {
|
||||
int sessionId = Install.single(TEST_APEX_WITH_APK_V2).setStaged().setEnableRollback()
|
||||
.commit();
|
||||
InstallUtils.waitForSessionReady(sessionId);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackApexDataDirectories_Phase2() throws Exception {
|
||||
public void testRollbackApexDataDirectories_Phase2_Rollback() throws Exception {
|
||||
RollbackInfo available = RollbackUtils.getAvailableRollback(APK_IN_APEX_TESTAPEX_NAME);
|
||||
|
||||
RollbackUtils.rollback(available.getRollbackId(), TEST_APEX_WITH_APK_V2);
|
||||
@@ -477,19 +477,19 @@ public class StagedRollbackTest {
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackApkDataDirectories_Phase1() throws Exception {
|
||||
public void testRollbackApkDataDirectories_Phase1_InstallV1() throws Exception {
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(-1);
|
||||
Install.single(TestApp.A1).commit();
|
||||
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackApkDataDirectories_Phase2() throws Exception {
|
||||
public void testRollbackApkDataDirectories_Phase2_InstallV2() throws Exception {
|
||||
Install.single(TestApp.A2).setStaged().setEnableRollback().commit();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackApkDataDirectories_Phase3() throws Exception {
|
||||
public void testRollbackApkDataDirectories_Phase3_Rollback() throws Exception {
|
||||
RollbackInfo available = RollbackUtils.getAvailableRollback(TestApp.A);
|
||||
RollbackUtils.rollback(available.getRollbackId(), TestApp.A2);
|
||||
RollbackInfo committed = RollbackUtils.getCommittedRollbackById(available.getRollbackId());
|
||||
|
||||
@@ -97,14 +97,14 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
public void setUp() throws Exception {
|
||||
deleteFiles("/system/apex/" + APK_IN_APEX_TESTAPEX_NAME + "*.apex",
|
||||
"/data/apex/active/" + APK_IN_APEX_TESTAPEX_NAME + "*.apex");
|
||||
runPhase("testCleanUp");
|
||||
runPhase("expireRollbacks");
|
||||
mLogger.start(getDevice());
|
||||
}
|
||||
|
||||
@After
|
||||
public void tearDown() throws Exception {
|
||||
mLogger.stop();
|
||||
runPhase("testCleanUp");
|
||||
runPhase("expireRollbacks");
|
||||
deleteFiles("/system/apex/" + APK_IN_APEX_TESTAPEX_NAME + "*.apex",
|
||||
"/data/apex/active/" + APK_IN_APEX_TESTAPEX_NAME + "*.apex",
|
||||
apexDataDirDeSys(APK_IN_APEX_TESTAPEX_NAME) + "*",
|
||||
@@ -139,22 +139,27 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
}
|
||||
}
|
||||
|
||||
private void waitForDeviceNotAvailable(long timeout, TimeUnit unit) {
|
||||
assertWithMessage("waitForDeviceNotAvailable() timed out in %s %s", timeout, unit)
|
||||
.that(getDevice().waitForDeviceNotAvailable(unit.toMillis(timeout))).isTrue();
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests watchdog triggered staged rollbacks involving only apks.
|
||||
*/
|
||||
@Test
|
||||
public void testBadApkOnly() throws Exception {
|
||||
runPhase("testBadApkOnly_Phase1");
|
||||
runPhase("testBadApkOnly_Phase1_Install");
|
||||
getDevice().reboot();
|
||||
runPhase("testBadApkOnly_Phase2");
|
||||
runPhase("testBadApkOnly_Phase2_VerifyInstall");
|
||||
|
||||
// Trigger rollback and wait for reboot to happen
|
||||
runPhase("testBadApkOnly_Phase3");
|
||||
assertThat(getDevice().waitForDeviceNotAvailable(TimeUnit.MINUTES.toMillis(2))).isTrue();
|
||||
runPhase("testBadApkOnly_Phase3_Crash");
|
||||
waitForDeviceNotAvailable(2, TimeUnit.MINUTES);
|
||||
|
||||
getDevice().waitForDeviceAvailable();
|
||||
|
||||
runPhase("testBadApkOnly_Phase4");
|
||||
runPhase("testBadApkOnly_Phase4_VerifyRollback");
|
||||
|
||||
assertThat(mLogger).eventOccurred(ROLLBACK_INITIATE, null, REASON_APP_CRASH, TESTAPP_A);
|
||||
assertThat(mLogger).eventOccurred(ROLLBACK_BOOT_TRIGGERED, null, null, null);
|
||||
@@ -163,12 +168,12 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
|
||||
@Test
|
||||
public void testNativeWatchdogTriggersRollback() throws Exception {
|
||||
runPhase("testNativeWatchdogTriggersRollback_Phase1");
|
||||
runPhase("testNativeWatchdogTriggersRollback_Phase1_Install");
|
||||
|
||||
// Reboot device to activate staged package
|
||||
getDevice().reboot();
|
||||
|
||||
runPhase("testNativeWatchdogTriggersRollback_Phase2");
|
||||
runPhase("testNativeWatchdogTriggersRollback_Phase2_VerifyInstall");
|
||||
|
||||
// crash system_server enough times to trigger a rollback
|
||||
crashProcess("system_server", NATIVE_CRASHES_THRESHOLD);
|
||||
@@ -181,11 +186,11 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
// 3. Staged rollback session becomes ready.
|
||||
// 4. Device actually reboots.
|
||||
// So we give a generous timeout here.
|
||||
assertThat(getDevice().waitForDeviceNotAvailable(TimeUnit.MINUTES.toMillis(5))).isTrue();
|
||||
waitForDeviceNotAvailable(5, TimeUnit.MINUTES);
|
||||
getDevice().waitForDeviceAvailable();
|
||||
|
||||
// verify rollback committed
|
||||
runPhase("testNativeWatchdogTriggersRollback_Phase3");
|
||||
runPhase("testNativeWatchdogTriggersRollback_Phase3_VerifyRollback");
|
||||
|
||||
assertThat(mLogger).eventOccurred(ROLLBACK_INITIATE, null, REASON_NATIVE_CRASH, null);
|
||||
assertThat(mLogger).eventOccurred(ROLLBACK_BOOT_TRIGGERED, null, null, null);
|
||||
@@ -198,15 +203,15 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
assumeTrue(isCheckpointSupported());
|
||||
|
||||
// Install a package with rollback enabled.
|
||||
runPhase("testNativeWatchdogTriggersRollbackForAll_Phase1");
|
||||
runPhase("testNativeWatchdogTriggersRollbackForAll_Phase1_InstallA");
|
||||
getDevice().reboot();
|
||||
|
||||
// Once previous staged install is applied, install another package
|
||||
runPhase("testNativeWatchdogTriggersRollbackForAll_Phase2");
|
||||
runPhase("testNativeWatchdogTriggersRollbackForAll_Phase2_InstallB");
|
||||
getDevice().reboot();
|
||||
|
||||
// Verify the new staged install has also been applied successfully.
|
||||
runPhase("testNativeWatchdogTriggersRollbackForAll_Phase3");
|
||||
runPhase("testNativeWatchdogTriggersRollbackForAll_Phase3_VerifyInstall");
|
||||
|
||||
// crash system_server enough times to trigger a rollback
|
||||
crashProcess("system_server", NATIVE_CRASHES_THRESHOLD);
|
||||
@@ -219,11 +224,11 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
// 3. Staged rollback session becomes ready.
|
||||
// 4. Device actually reboots.
|
||||
// So we give a generous timeout here.
|
||||
assertThat(getDevice().waitForDeviceNotAvailable(TimeUnit.MINUTES.toMillis(5))).isTrue();
|
||||
waitForDeviceNotAvailable(5, TimeUnit.MINUTES);
|
||||
getDevice().waitForDeviceAvailable();
|
||||
|
||||
// verify all available rollbacks have been committed
|
||||
runPhase("testNativeWatchdogTriggersRollbackForAll_Phase4");
|
||||
runPhase("testNativeWatchdogTriggersRollbackForAll_Phase4_VerifyRollback");
|
||||
|
||||
assertThat(mLogger).eventOccurred(ROLLBACK_INITIATE, null, REASON_NATIVE_CRASH, null);
|
||||
assertThat(mLogger).eventOccurred(ROLLBACK_BOOT_TRIGGERED, null, null, null);
|
||||
@@ -235,33 +240,33 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
*/
|
||||
@Test
|
||||
public void testPreviouslyAbandonedRollbacks() throws Exception {
|
||||
runPhase("testPreviouslyAbandonedRollbacks_Phase1");
|
||||
runPhase("testPreviouslyAbandonedRollbacks_Phase1_InstallAndAbandon");
|
||||
getDevice().reboot();
|
||||
runPhase("testPreviouslyAbandonedRollbacks_Phase2");
|
||||
runPhase("testPreviouslyAbandonedRollbacks_Phase2_Rollback");
|
||||
getDevice().reboot();
|
||||
runPhase("testPreviouslyAbandonedRollbacks_Phase3");
|
||||
runPhase("testPreviouslyAbandonedRollbacks_Phase3_VerifyRollback");
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests we can enable rollback for a whitelisted app.
|
||||
* Tests we can enable rollback for a allowlisted app.
|
||||
*/
|
||||
@Test
|
||||
public void testRollbackWhitelistedApp() throws Exception {
|
||||
public void testRollbackAllowlistedApp() throws Exception {
|
||||
assumeTrue(hasMainlineModule());
|
||||
runPhase("testRollbackWhitelistedApp_Phase1");
|
||||
runPhase("testRollbackAllowlistedApp_Phase1_Install");
|
||||
getDevice().reboot();
|
||||
runPhase("testRollbackWhitelistedApp_Phase2");
|
||||
runPhase("testRollbackAllowlistedApp_Phase2_VerifyInstall");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRollbackDataPolicy() throws Exception {
|
||||
List<String> before = getSnapshotDirectories("/data/misc_ce/0/rollback");
|
||||
|
||||
runPhase("testRollbackDataPolicy_Phase1");
|
||||
runPhase("testRollbackDataPolicy_Phase1_Install");
|
||||
getDevice().reboot();
|
||||
runPhase("testRollbackDataPolicy_Phase2");
|
||||
runPhase("testRollbackDataPolicy_Phase2_Rollback");
|
||||
getDevice().reboot();
|
||||
runPhase("testRollbackDataPolicy_Phase3");
|
||||
runPhase("testRollbackDataPolicy_Phase3_VerifyRollback");
|
||||
|
||||
// Verify snapshots are deleted after restoration
|
||||
List<String> after = getSnapshotDirectories("/data/misc_ce/0/rollback");
|
||||
@@ -279,11 +284,11 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
public void testRollbackApexWithApk() throws Exception {
|
||||
getDevice().uninstallPackage("com.android.cts.install.lib.testapp.A");
|
||||
pushTestApex();
|
||||
runPhase("testRollbackApexWithApk_Phase1");
|
||||
runPhase("testRollbackApexWithApk_Phase1_Install");
|
||||
getDevice().reboot();
|
||||
runPhase("testRollbackApexWithApk_Phase2");
|
||||
runPhase("testRollbackApexWithApk_Phase2_Rollback");
|
||||
getDevice().reboot();
|
||||
runPhase("testRollbackApexWithApk_Phase3");
|
||||
runPhase("testRollbackApexWithApk_Phase3_VerifyRollback");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -295,15 +300,15 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
pushTestApex();
|
||||
|
||||
// Install an apex with apk that crashes
|
||||
runPhase("testRollbackApexWithApkCrashing_Phase1");
|
||||
runPhase("testRollbackApexWithApkCrashing_Phase1_Install");
|
||||
getDevice().reboot();
|
||||
// Verify apex was installed and then crash the apk
|
||||
runPhase("testRollbackApexWithApkCrashing_Phase2");
|
||||
runPhase("testRollbackApexWithApkCrashing_Phase2_Crash");
|
||||
// Wait for crash to trigger rollback
|
||||
assertThat(getDevice().waitForDeviceNotAvailable(TimeUnit.MINUTES.toMillis(5))).isTrue();
|
||||
waitForDeviceNotAvailable(5, TimeUnit.MINUTES);
|
||||
getDevice().waitForDeviceAvailable();
|
||||
// Verify rollback occurred due to crash of apk-in-apex
|
||||
runPhase("testRollbackApexWithApkCrashing_Phase3");
|
||||
runPhase("testRollbackApexWithApkCrashing_Phase3_VerifyRollback");
|
||||
|
||||
assertThat(mLogger).eventOccurred(ROLLBACK_INITIATE, null, REASON_APP_CRASH, TESTAPP_A);
|
||||
assertThat(mLogger).eventOccurred(ROLLBACK_BOOT_TRIGGERED, null, null, null);
|
||||
@@ -323,12 +328,12 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
String oldFilePath2 =
|
||||
apexDataDirDeSys(APK_IN_APEX_TESTAPEX_NAME) + TEST_SUBDIR + TEST_FILENAME_2;
|
||||
runAsRoot(() -> {
|
||||
assertThat(getDevice().pushString(TEST_STRING_1, oldFilePath1)).isTrue();
|
||||
assertThat(getDevice().pushString(TEST_STRING_2, oldFilePath2)).isTrue();
|
||||
pushString(TEST_STRING_1, oldFilePath1);
|
||||
pushString(TEST_STRING_2, oldFilePath2);
|
||||
});
|
||||
|
||||
// Install new version of the APEX with rollback enabled
|
||||
runPhase("testRollbackApexDataDirectories_Phase1");
|
||||
runPhase("testRollbackApexDataDirectories_Phase1_Install");
|
||||
getDevice().reboot();
|
||||
|
||||
// Replace files in data directory
|
||||
@@ -338,20 +343,20 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
runAsRoot(() -> {
|
||||
getDevice().deleteFile(oldFilePath1);
|
||||
getDevice().deleteFile(oldFilePath2);
|
||||
assertThat(getDevice().pushString(TEST_STRING_3, newFilePath3)).isTrue();
|
||||
assertThat(getDevice().pushString(TEST_STRING_4, newFilePath4)).isTrue();
|
||||
pushString(TEST_STRING_3, newFilePath3);
|
||||
pushString(TEST_STRING_4, newFilePath4);
|
||||
});
|
||||
|
||||
// Roll back the APEX
|
||||
runPhase("testRollbackApexDataDirectories_Phase2");
|
||||
runPhase("testRollbackApexDataDirectories_Phase2_Rollback");
|
||||
getDevice().reboot();
|
||||
|
||||
// Verify that old files have been restored and new files are gone
|
||||
runAsRoot(() -> {
|
||||
assertThat(getDevice().pullFileContents(oldFilePath1)).isEqualTo(TEST_STRING_1);
|
||||
assertThat(getDevice().pullFileContents(oldFilePath2)).isEqualTo(TEST_STRING_2);
|
||||
assertThat(getDevice().pullFile(newFilePath3)).isNull();
|
||||
assertThat(getDevice().pullFile(newFilePath4)).isNull();
|
||||
assertFileContents(TEST_STRING_1, oldFilePath1);
|
||||
assertFileContents(TEST_STRING_2, oldFilePath2);
|
||||
assertFileNotExists(newFilePath3);
|
||||
assertFileNotExists(newFilePath4);
|
||||
});
|
||||
|
||||
// Verify snapshots are deleted after restoration
|
||||
@@ -377,12 +382,12 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
String oldFilePath2 =
|
||||
apexDataDirDeUser(APK_IN_APEX_TESTAPEX_NAME, 0) + TEST_SUBDIR + TEST_FILENAME_2;
|
||||
runAsRoot(() -> {
|
||||
assertThat(getDevice().pushString(TEST_STRING_1, oldFilePath1)).isTrue();
|
||||
assertThat(getDevice().pushString(TEST_STRING_2, oldFilePath2)).isTrue();
|
||||
pushString(TEST_STRING_1, oldFilePath1);
|
||||
pushString(TEST_STRING_2, oldFilePath2);
|
||||
});
|
||||
|
||||
// Install new version of the APEX with rollback enabled
|
||||
runPhase("testRollbackApexDataDirectories_Phase1");
|
||||
runPhase("testRollbackApexDataDirectories_Phase1_Install");
|
||||
getDevice().reboot();
|
||||
|
||||
// Replace files in data directory
|
||||
@@ -393,20 +398,20 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
runAsRoot(() -> {
|
||||
getDevice().deleteFile(oldFilePath1);
|
||||
getDevice().deleteFile(oldFilePath2);
|
||||
assertThat(getDevice().pushString(TEST_STRING_3, newFilePath3)).isTrue();
|
||||
assertThat(getDevice().pushString(TEST_STRING_4, newFilePath4)).isTrue();
|
||||
pushString(TEST_STRING_3, newFilePath3);
|
||||
pushString(TEST_STRING_4, newFilePath4);
|
||||
});
|
||||
|
||||
// Roll back the APEX
|
||||
runPhase("testRollbackApexDataDirectories_Phase2");
|
||||
runPhase("testRollbackApexDataDirectories_Phase2_Rollback");
|
||||
getDevice().reboot();
|
||||
|
||||
// Verify that old files have been restored and new files are gone
|
||||
runAsRoot(() -> {
|
||||
assertThat(getDevice().pullFileContents(oldFilePath1)).isEqualTo(TEST_STRING_1);
|
||||
assertThat(getDevice().pullFileContents(oldFilePath2)).isEqualTo(TEST_STRING_2);
|
||||
assertThat(getDevice().pullFile(newFilePath3)).isNull();
|
||||
assertThat(getDevice().pullFile(newFilePath4)).isNull();
|
||||
assertFileContents(TEST_STRING_1, oldFilePath1);
|
||||
assertFileContents(TEST_STRING_2, oldFilePath2);
|
||||
assertFileNotExists(newFilePath3);
|
||||
assertFileNotExists(newFilePath4);
|
||||
});
|
||||
|
||||
// Verify snapshots are deleted after restoration
|
||||
@@ -431,12 +436,12 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
String oldFilePath2 =
|
||||
apexDataDirCe(APK_IN_APEX_TESTAPEX_NAME, 0) + TEST_SUBDIR + TEST_FILENAME_2;
|
||||
runAsRoot(() -> {
|
||||
assertThat(getDevice().pushString(TEST_STRING_1, oldFilePath1)).isTrue();
|
||||
assertThat(getDevice().pushString(TEST_STRING_2, oldFilePath2)).isTrue();
|
||||
pushString(TEST_STRING_1, oldFilePath1);
|
||||
pushString(TEST_STRING_2, oldFilePath2);
|
||||
});
|
||||
|
||||
// Install new version of the APEX with rollback enabled
|
||||
runPhase("testRollbackApexDataDirectories_Phase1");
|
||||
runPhase("testRollbackApexDataDirectories_Phase1_Install");
|
||||
getDevice().reboot();
|
||||
|
||||
// Replace files in data directory
|
||||
@@ -446,20 +451,20 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
runAsRoot(() -> {
|
||||
getDevice().deleteFile(oldFilePath1);
|
||||
getDevice().deleteFile(oldFilePath2);
|
||||
assertThat(getDevice().pushString(TEST_STRING_3, newFilePath3)).isTrue();
|
||||
assertThat(getDevice().pushString(TEST_STRING_4, newFilePath4)).isTrue();
|
||||
pushString(TEST_STRING_3, newFilePath3);
|
||||
pushString(TEST_STRING_4, newFilePath4);
|
||||
});
|
||||
|
||||
// Roll back the APEX
|
||||
runPhase("testRollbackApexDataDirectories_Phase2");
|
||||
runPhase("testRollbackApexDataDirectories_Phase2_Rollback");
|
||||
getDevice().reboot();
|
||||
|
||||
// Verify that old files have been restored and new files are gone
|
||||
runAsRoot(() -> {
|
||||
assertThat(getDevice().pullFileContents(oldFilePath1)).isEqualTo(TEST_STRING_1);
|
||||
assertThat(getDevice().pullFileContents(oldFilePath2)).isEqualTo(TEST_STRING_2);
|
||||
assertThat(getDevice().pullFile(newFilePath3)).isNull();
|
||||
assertThat(getDevice().pullFile(newFilePath4)).isNull();
|
||||
assertFileContents(TEST_STRING_1, oldFilePath1);
|
||||
assertFileContents(TEST_STRING_2, oldFilePath2);
|
||||
assertFileNotExists(newFilePath3);
|
||||
assertFileNotExists(newFilePath4);
|
||||
});
|
||||
|
||||
// Verify snapshots are deleted after restoration
|
||||
@@ -477,18 +482,18 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
@Test
|
||||
public void testRollbackApkDataDirectories_De() throws Exception {
|
||||
// Install version 1 of TESTAPP_A
|
||||
runPhase("testRollbackApkDataDirectories_Phase1");
|
||||
runPhase("testRollbackApkDataDirectories_Phase1_InstallV1");
|
||||
|
||||
// Push files to apk data directory
|
||||
String oldFilePath1 = apkDataDirDe(TESTAPP_A, 0) + "/" + TEST_FILENAME_1;
|
||||
String oldFilePath2 = apkDataDirDe(TESTAPP_A, 0) + TEST_SUBDIR + TEST_FILENAME_2;
|
||||
runAsRoot(() -> {
|
||||
assertThat(getDevice().pushString(TEST_STRING_1, oldFilePath1)).isTrue();
|
||||
assertThat(getDevice().pushString(TEST_STRING_2, oldFilePath2)).isTrue();
|
||||
pushString(TEST_STRING_1, oldFilePath1);
|
||||
pushString(TEST_STRING_2, oldFilePath2);
|
||||
});
|
||||
|
||||
// Install version 2 of TESTAPP_A with rollback enabled
|
||||
runPhase("testRollbackApkDataDirectories_Phase2");
|
||||
runPhase("testRollbackApkDataDirectories_Phase2_InstallV2");
|
||||
getDevice().reboot();
|
||||
|
||||
// Replace files in data directory
|
||||
@@ -497,20 +502,20 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
runAsRoot(() -> {
|
||||
getDevice().deleteFile(oldFilePath1);
|
||||
getDevice().deleteFile(oldFilePath2);
|
||||
assertThat(getDevice().pushString(TEST_STRING_3, newFilePath3)).isTrue();
|
||||
assertThat(getDevice().pushString(TEST_STRING_4, newFilePath4)).isTrue();
|
||||
pushString(TEST_STRING_3, newFilePath3);
|
||||
pushString(TEST_STRING_4, newFilePath4);
|
||||
});
|
||||
|
||||
// Roll back the APK
|
||||
runPhase("testRollbackApkDataDirectories_Phase3");
|
||||
runPhase("testRollbackApkDataDirectories_Phase3_Rollback");
|
||||
getDevice().reboot();
|
||||
|
||||
// Verify that old files have been restored and new files are gone
|
||||
runAsRoot(() -> {
|
||||
assertThat(getDevice().pullFileContents(oldFilePath1)).isEqualTo(TEST_STRING_1);
|
||||
assertThat(getDevice().pullFileContents(oldFilePath2)).isEqualTo(TEST_STRING_2);
|
||||
assertThat(getDevice().pullFile(newFilePath3)).isNull();
|
||||
assertThat(getDevice().pullFile(newFilePath4)).isNull();
|
||||
assertFileContents(TEST_STRING_1, oldFilePath1);
|
||||
assertFileContents(TEST_STRING_2, oldFilePath2);
|
||||
assertFileNotExists(newFilePath3);
|
||||
assertFileNotExists(newFilePath4);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -524,12 +529,12 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
String oldFilePath2 =
|
||||
apexDataDirCe(APK_IN_APEX_TESTAPEX_NAME, 0) + TEST_SUBDIR + TEST_FILENAME_2;
|
||||
runAsRoot(() -> {
|
||||
assertThat(getDevice().pushString(TEST_STRING_1, oldFilePath1)).isTrue();
|
||||
assertThat(getDevice().pushString(TEST_STRING_2, oldFilePath2)).isTrue();
|
||||
pushString(TEST_STRING_1, oldFilePath1);
|
||||
pushString(TEST_STRING_2, oldFilePath2);
|
||||
});
|
||||
|
||||
// Install new version of the APEX with rollback enabled
|
||||
runPhase("testRollbackApexDataDirectories_Phase1");
|
||||
runPhase("testRollbackApexDataDirectories_Phase1_Install");
|
||||
getDevice().reboot();
|
||||
|
||||
List<String> after = getSnapshotDirectories("/data/misc_ce/0/apexrollback");
|
||||
@@ -538,10 +543,10 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
// There should be only one /data/misc_ce/0/apexrollback/<rollbackId> created during test
|
||||
assertThat(after).hasSize(1);
|
||||
// Expire all rollbacks and check CE snapshot directories are deleted
|
||||
runPhase("testCleanUp");
|
||||
runPhase("expireRollbacks");
|
||||
runAsRoot(() -> {
|
||||
for (String dir : after) {
|
||||
assertThat(getDevice().getFileEntry(dir)).isNull();
|
||||
assertFileNotExists(dir);
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -560,6 +565,23 @@ public class StagedRollbackTest extends BaseHostJUnit4Test {
|
||||
getDevice().reboot();
|
||||
}
|
||||
|
||||
private void pushString(String contents, String path) throws Exception {
|
||||
assertWithMessage("Failed to push file to device, content=%s path=%s", contents, path)
|
||||
.that(getDevice().pushString(contents, path)).isTrue();
|
||||
}
|
||||
|
||||
private void assertFileContents(String expectedContents, String path) throws Exception {
|
||||
String actualContents = getDevice().pullFileContents(path);
|
||||
assertWithMessage("Failed to retrieve file=%s", path).that(actualContents).isNotNull();
|
||||
assertWithMessage("Mismatched file contents, path=%s", path)
|
||||
.that(actualContents).isEqualTo(expectedContents);
|
||||
}
|
||||
|
||||
private void assertFileNotExists(String path) throws Exception {
|
||||
assertWithMessage("File shouldn't exist, path=%s", path)
|
||||
.that(getDevice().getFileEntry(path)).isNull();
|
||||
}
|
||||
|
||||
private static String apexDataDirDeSys(String apexName) {
|
||||
return String.format("/data/misc/apexdata/%s", apexName);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user