Loading tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java +63 −4 Original line number Diff line number Diff line Loading @@ -21,14 +21,19 @@ import static com.android.cts.rollback.lib.RollbackUtils.getUniqueRollbackInfoFo import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; import android.Manifest; import android.annotation.Nullable; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.rollback.RollbackInfo; import android.content.rollback.RollbackManager; import android.text.TextUtils; import androidx.test.InstrumentationRegistry; Loading @@ -39,8 +44,7 @@ import com.android.cts.install.lib.TestApp; import com.android.cts.install.lib.Uninstall; import com.android.cts.rollback.lib.Rollback; import com.android.cts.rollback.lib.RollbackUtils; import static org.junit.Assert.fail; import com.android.internal.R; import org.junit.After; import org.junit.Before; Loading @@ -59,10 +63,11 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class StagedRollbackTest { private static final String TAG = "RollbackTest"; private static final String NETWORK_STACK_CONNECTOR_CLASS = "android.net.INetworkStackConnector"; private static final String MODULE_META_DATA_PACKAGE = getModuleMetadataPackageName(); /** * Adopts common shell permissions needed for rollback tests. */ Loading Loading @@ -182,6 +187,21 @@ public class StagedRollbackTest { networkStack)).isNull(); } @Test public void installModuleMetadataPackage() throws Exception { resetModuleMetadataPackage(); Context context = InstrumentationRegistry.getContext(); PackageInfo metadataPackageInfo = context.getPackageManager().getPackageInfo( MODULE_META_DATA_PACKAGE, 0); String metadataApkPath = metadataPackageInfo.applicationInfo.sourceDir; assertThat(metadataApkPath).isNotNull(); assertThat(metadataApkPath).isNotEqualTo(""); runShellCommand("pm install " + "-r --enable-rollback --staged --wait " + metadataApkPath); } @Test public void assertNetworkStackRollbackAvailable() throws Exception { RollbackManager rm = RollbackUtils.getRollbackManager(); Loading @@ -203,6 +223,20 @@ public class StagedRollbackTest { getNetworkStackPackageName())).isNull(); } @Test public void assertModuleMetadataRollbackAvailable() throws Exception { RollbackManager rm = RollbackUtils.getRollbackManager(); assertThat(getUniqueRollbackInfoForPackage(rm.getAvailableRollbacks(), MODULE_META_DATA_PACKAGE)).isNotNull(); } @Test public void assertModuleMetadataRollbackCommitted() throws Exception { RollbackManager rm = RollbackUtils.getRollbackManager(); assertThat(getUniqueRollbackInfoForPackage(rm.getRecentlyCommittedRollbacks(), MODULE_META_DATA_PACKAGE)).isNotNull(); } private String getNetworkStackPackageName() { Intent intent = new Intent(NETWORK_STACK_CONNECTOR_CLASS); ComponentName comp = intent.resolveSystemService( Loading Loading @@ -245,4 +279,29 @@ public class StagedRollbackTest { InstallUtils.processUserData(TestApp.A); Uninstall.packages(TestApp.A); } @Nullable private static String getModuleMetadataPackageName() { String packageName = InstrumentationRegistry.getContext().getResources().getString( R.string.config_defaultModuleMetadataProvider); if (TextUtils.isEmpty(packageName)) { return null; } return packageName; } private void resetModuleMetadataPackage() { RollbackManager rm = RollbackUtils.getRollbackManager(); assertThat(MODULE_META_DATA_PACKAGE).isNotNull(); rm.expireRollbackForPackage(MODULE_META_DATA_PACKAGE); assertThat(getUniqueRollbackInfoForPackage(rm.getAvailableRollbacks(), MODULE_META_DATA_PACKAGE)).isNull(); } private void runShellCommand(String cmd) { InstrumentationRegistry.getInstrumentation().getUiAutomation() .executeShellCommand(cmd); } } tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java +39 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import org.junit.runner.RunWith; */ @RunWith(DeviceJUnit4ClassRunner.class) public class StagedRollbackTest extends BaseHostJUnit4Test { private static final int NATIVE_CRASHES_THRESHOLD = 5; /** * Runs the given phase of a test by calling into the device. * Throws an exception if the test phase fails. Loading Loading @@ -83,6 +85,29 @@ public class StagedRollbackTest extends BaseHostJUnit4Test { runPhase("testBadApkOnlyConfirmRollback"); } @Test public void testNativeWatchdogTriggersRollback() throws Exception { //Stage install ModuleMetadata package - this simulates a Mainline module update runPhase("installModuleMetadataPackage"); // Reboot device to activate staged package getDevice().reboot(); getDevice().waitForDeviceAvailable(); runPhase("assertModuleMetadataRollbackAvailable"); // crash system_server enough times to trigger a rollback crashProcess("system_server", NATIVE_CRASHES_THRESHOLD); // Rollback should be committed automatically now // Give time for rollback to be committed assertTrue(getDevice().waitForDeviceNotAvailable(60000)); getDevice().waitForDeviceAvailable(); // verify rollback committed runPhase("assertModuleMetadataRollbackCommitted"); } /** * Tests failed network health check triggers watchdog staged rollbacks. */ Loading Loading @@ -177,4 +202,18 @@ public class StagedRollbackTest extends BaseHostJUnit4Test { getDevice().reboot(); runPhase("testPreviouslyAbandonedRollbacksCheckUserdataRollback"); } private void crashProcess(String processName, int numberOfCrashes) throws Exception { String pid = ""; String lastPid = "invalid"; for (int i = 0; i < numberOfCrashes; ++i) { // This condition makes sure before we kill the process, the process is running AND // the last crash was finished. while ("".equals(pid) || lastPid.equals(pid)) { pid = getDevice().executeShellCommand("pidof " + processName); } getDevice().executeShellCommand("kill " + pid); lastPid = pid; } } } Loading
tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/StagedRollbackTest.java +63 −4 Original line number Diff line number Diff line Loading @@ -21,14 +21,19 @@ import static com.android.cts.rollback.lib.RollbackUtils.getUniqueRollbackInfoFo import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.fail; import android.Manifest; import android.annotation.Nullable; import android.content.BroadcastReceiver; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageInstaller; import android.content.rollback.RollbackInfo; import android.content.rollback.RollbackManager; import android.text.TextUtils; import androidx.test.InstrumentationRegistry; Loading @@ -39,8 +44,7 @@ import com.android.cts.install.lib.TestApp; import com.android.cts.install.lib.Uninstall; import com.android.cts.rollback.lib.Rollback; import com.android.cts.rollback.lib.RollbackUtils; import static org.junit.Assert.fail; import com.android.internal.R; import org.junit.After; import org.junit.Before; Loading @@ -59,10 +63,11 @@ import org.junit.runners.JUnit4; @RunWith(JUnit4.class) public class StagedRollbackTest { private static final String TAG = "RollbackTest"; private static final String NETWORK_STACK_CONNECTOR_CLASS = "android.net.INetworkStackConnector"; private static final String MODULE_META_DATA_PACKAGE = getModuleMetadataPackageName(); /** * Adopts common shell permissions needed for rollback tests. */ Loading Loading @@ -182,6 +187,21 @@ public class StagedRollbackTest { networkStack)).isNull(); } @Test public void installModuleMetadataPackage() throws Exception { resetModuleMetadataPackage(); Context context = InstrumentationRegistry.getContext(); PackageInfo metadataPackageInfo = context.getPackageManager().getPackageInfo( MODULE_META_DATA_PACKAGE, 0); String metadataApkPath = metadataPackageInfo.applicationInfo.sourceDir; assertThat(metadataApkPath).isNotNull(); assertThat(metadataApkPath).isNotEqualTo(""); runShellCommand("pm install " + "-r --enable-rollback --staged --wait " + metadataApkPath); } @Test public void assertNetworkStackRollbackAvailable() throws Exception { RollbackManager rm = RollbackUtils.getRollbackManager(); Loading @@ -203,6 +223,20 @@ public class StagedRollbackTest { getNetworkStackPackageName())).isNull(); } @Test public void assertModuleMetadataRollbackAvailable() throws Exception { RollbackManager rm = RollbackUtils.getRollbackManager(); assertThat(getUniqueRollbackInfoForPackage(rm.getAvailableRollbacks(), MODULE_META_DATA_PACKAGE)).isNotNull(); } @Test public void assertModuleMetadataRollbackCommitted() throws Exception { RollbackManager rm = RollbackUtils.getRollbackManager(); assertThat(getUniqueRollbackInfoForPackage(rm.getRecentlyCommittedRollbacks(), MODULE_META_DATA_PACKAGE)).isNotNull(); } private String getNetworkStackPackageName() { Intent intent = new Intent(NETWORK_STACK_CONNECTOR_CLASS); ComponentName comp = intent.resolveSystemService( Loading Loading @@ -245,4 +279,29 @@ public class StagedRollbackTest { InstallUtils.processUserData(TestApp.A); Uninstall.packages(TestApp.A); } @Nullable private static String getModuleMetadataPackageName() { String packageName = InstrumentationRegistry.getContext().getResources().getString( R.string.config_defaultModuleMetadataProvider); if (TextUtils.isEmpty(packageName)) { return null; } return packageName; } private void resetModuleMetadataPackage() { RollbackManager rm = RollbackUtils.getRollbackManager(); assertThat(MODULE_META_DATA_PACKAGE).isNotNull(); rm.expireRollbackForPackage(MODULE_META_DATA_PACKAGE); assertThat(getUniqueRollbackInfoForPackage(rm.getAvailableRollbacks(), MODULE_META_DATA_PACKAGE)).isNull(); } private void runShellCommand(String cmd) { InstrumentationRegistry.getInstrumentation().getUiAutomation() .executeShellCommand(cmd); } }
tests/RollbackTest/StagedRollbackTest/src/com/android/tests/rollback/host/StagedRollbackTest.java +39 −0 Original line number Diff line number Diff line Loading @@ -33,6 +33,8 @@ import org.junit.runner.RunWith; */ @RunWith(DeviceJUnit4ClassRunner.class) public class StagedRollbackTest extends BaseHostJUnit4Test { private static final int NATIVE_CRASHES_THRESHOLD = 5; /** * Runs the given phase of a test by calling into the device. * Throws an exception if the test phase fails. Loading Loading @@ -83,6 +85,29 @@ public class StagedRollbackTest extends BaseHostJUnit4Test { runPhase("testBadApkOnlyConfirmRollback"); } @Test public void testNativeWatchdogTriggersRollback() throws Exception { //Stage install ModuleMetadata package - this simulates a Mainline module update runPhase("installModuleMetadataPackage"); // Reboot device to activate staged package getDevice().reboot(); getDevice().waitForDeviceAvailable(); runPhase("assertModuleMetadataRollbackAvailable"); // crash system_server enough times to trigger a rollback crashProcess("system_server", NATIVE_CRASHES_THRESHOLD); // Rollback should be committed automatically now // Give time for rollback to be committed assertTrue(getDevice().waitForDeviceNotAvailable(60000)); getDevice().waitForDeviceAvailable(); // verify rollback committed runPhase("assertModuleMetadataRollbackCommitted"); } /** * Tests failed network health check triggers watchdog staged rollbacks. */ Loading Loading @@ -177,4 +202,18 @@ public class StagedRollbackTest extends BaseHostJUnit4Test { getDevice().reboot(); runPhase("testPreviouslyAbandonedRollbacksCheckUserdataRollback"); } private void crashProcess(String processName, int numberOfCrashes) throws Exception { String pid = ""; String lastPid = "invalid"; for (int i = 0; i < numberOfCrashes; ++i) { // This condition makes sure before we kill the process, the process is running AND // the last crash was finished. while ("".equals(pid) || lastPid.equals(pid)) { pid = getDevice().executeShellCommand("pidof " + processName); } getDevice().executeShellCommand("kill " + pid); lastPid = pid; } } }