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:
JW Wang
2021-01-22 05:49:49 +00:00
committed by Android (Google) Code Review
2 changed files with 133 additions and 111 deletions

View File

@@ -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());

View File

@@ -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);
}