From eb908a9ee1269b29d3a62273241ce413b46cc032 Mon Sep 17 00:00:00 2001 From: JW Wang Date: Wed, 19 Feb 2020 22:36:19 +0800 Subject: [PATCH 1/4] Wait for rollback becomes available (1/n) Sometimes RollbackManager is slow in making rollbacks available. Let's give it enough time to do the job and make test less flaky. Bug: 149876119 Test: atest MultiUserRollbackTest Change-Id: I0a64e2dcde1f5e6dae618cacd6546ad953c1aca7 --- .../com/android/tests/rollback/MultiUserRollbackTest.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/MultiUserRollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/MultiUserRollbackTest.java index 0ffe041b03776..400bb04f0fabf 100644 --- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/MultiUserRollbackTest.java +++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/MultiUserRollbackTest.java @@ -17,13 +17,11 @@ package com.android.tests.rollback; import static com.android.cts.rollback.lib.RollbackInfoSubject.assertThat; -import static com.android.cts.rollback.lib.RollbackUtils.getUniqueRollbackInfoForPackage; import static com.google.common.truth.Truth.assertThat; import android.Manifest; import android.content.rollback.RollbackInfo; -import android.content.rollback.RollbackManager; import com.android.cts.install.lib.Install; import com.android.cts.install.lib.InstallUtils; @@ -77,13 +75,10 @@ public class MultiUserRollbackTest { */ @Test public void testMultipleUsersUpgradeToV2() throws Exception { - RollbackManager rm = RollbackUtils.getRollbackManager(); assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1); Install.single(TestApp.A2).setEnableRollback().commit(); assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2); - RollbackInfo rollback = getUniqueRollbackInfoForPackage( - rm.getAvailableRollbacks(), TestApp.A); - assertThat(rollback).isNotNull(); + RollbackInfo rollback = RollbackUtils.waitForAvailableRollback(TestApp.A); assertThat(rollback).packagesContainsExactly( Rollback.from(TestApp.A2).to(TestApp.A1)); } From f2a75879d3b1bd7090b859b64dc9d725907e5a1d Mon Sep 17 00:00:00 2001 From: JW Wang Date: Thu, 20 Feb 2020 12:15:20 +0800 Subject: [PATCH 2/4] No need to switch users before running tests (2/n) My local test shows that switch-user doesn't work on my physical device. In fact there are APIs to run tests against a particular user without switching. It also speeds up tests without switching users from time to time. Bug: 149876119 Test: atest MultiUserRollbackTest Change-Id: I34d26ddcb6a6e9cdc39228310830a3cd83212e4a --- .../rollback/host/MultiUserRollbackTest.java | 32 +++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java b/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java index 52f6eba4072b2..f2064b9dac9b5 100644 --- a/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java +++ b/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java @@ -27,6 +27,8 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import java.util.concurrent.TimeUnit; + /** * Runs rollback tests for multiple users. */ @@ -41,7 +43,6 @@ public class MultiUserRollbackTest extends BaseHostJUnit4Test { @After public void tearDown() throws Exception { - getDevice().switchUser(mOriginalUserId); getDevice().executeShellCommand("pm uninstall com.android.cts.install.lib.testapp.A"); removeSecondaryUserIfNecessary(); } @@ -49,8 +50,8 @@ public class MultiUserRollbackTest extends BaseHostJUnit4Test { @Before public void setup() throws Exception { mOriginalUserId = getDevice().getCurrentUser(); + createAndStartSecondaryUser(); installPackageAsUser("RollbackTest.apk", true, mOriginalUserId); - createAndSwitchToSecondaryUserIfNecessary(); installPackageAsUser("RollbackTest.apk", true, mSecondaryUserId); } @@ -64,7 +65,6 @@ public class MultiUserRollbackTest extends BaseHostJUnit4Test { runPhaseForUsers("testMultipleUsersInstallV1", mOriginalUserId, mSecondaryUserId); runPhaseForUsers("testMultipleUsersUpgradeToV2", mOriginalUserId); runPhaseForUsers("testMultipleUsersUpdateUserData", mOriginalUserId, mSecondaryUserId); - switchToUser(mOriginalUserId); getDevice().executeShellCommand("pm rollback-app com.android.cts.install.lib.testapp.A"); runPhaseForUsers("testMultipleUsersVerifyUserdataRollback", mOriginalUserId, mSecondaryUserId); @@ -74,11 +74,11 @@ public class MultiUserRollbackTest extends BaseHostJUnit4Test { * Run the phase for the given user ids, in the order they are given. */ private void runPhaseForUsers(String phase, int... userIds) throws Exception { + final long timeout = TimeUnit.MINUTES.toMillis(10); for (int userId: userIds) { - switchToUser(userId); - assertTrue(runDeviceTests("com.android.tests.rollback", + assertTrue(runDeviceTests(getDevice(), "com.android.tests.rollback", "com.android.tests.rollback.MultiUserRollbackTest", - phase)); + phase, userId, timeout)); } } @@ -89,6 +89,26 @@ public class MultiUserRollbackTest extends BaseHostJUnit4Test { } } + private void awaitUserUnlocked(int userId) throws Exception { + for (int i = 0; i < SWITCH_USER_COMPLETED_NUMBER_OF_POLLS; ++i) { + String userState = getDevice().executeShellCommand("am get-started-user-state " + + userId); + if (userState.contains("RUNNING_UNLOCKED")) { + return; + } + Thread.sleep(SWITCH_USER_COMPLETED_POLL_INTERVAL_IN_MILLIS); + } + fail("Timed out in unlocking user: " + userId); + } + + private void createAndStartSecondaryUser() throws Exception { + String name = "MultiUserRollbackTest_User" + System.currentTimeMillis(); + mSecondaryUserId = getDevice().createUser(name); + getDevice().startUser(mSecondaryUserId); + // Note we can't install apps on a locked user + awaitUserUnlocked(mSecondaryUserId); + } + private void createAndSwitchToSecondaryUserIfNecessary() throws Exception { if (mSecondaryUserId == -1) { mOriginalUserId = getDevice().getCurrentUser(); From 67eb86bb4c40a99b19222a81046a835e080ef11c Mon Sep 17 00:00:00 2001 From: JW Wang Date: Thu, 20 Feb 2020 13:43:48 +0800 Subject: [PATCH 3/4] Pass "-g --user all" when installing apps (3/n) '-g' to grant permissions automatically without checking the API level. This works around the issue of b/149733368#comment2. '--user all' to install the app on all users. This is more efficient than calling #installPackageAsUser one by one on each user. Bug: 149876119 Test: atest MultiUserRollbackTest Change-Id: Ia5d85d3c13925ae969ffab9319360c1fefe1f950 --- .../android/tests/rollback/host/MultiUserRollbackTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java b/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java index f2064b9dac9b5..ecd3db5c6849c 100644 --- a/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java +++ b/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java @@ -51,8 +51,8 @@ public class MultiUserRollbackTest extends BaseHostJUnit4Test { public void setup() throws Exception { mOriginalUserId = getDevice().getCurrentUser(); createAndStartSecondaryUser(); - installPackageAsUser("RollbackTest.apk", true, mOriginalUserId); - installPackageAsUser("RollbackTest.apk", true, mSecondaryUserId); + // TODO(b/149733368): Remove the '-g' workaround when the bug is fixed. + installPackage("RollbackTest.apk", "-g --user all"); } @Test From 14168f321a8c29a16ea70a1d4b4605a0166f90be Mon Sep 17 00:00:00 2001 From: JW Wang Date: Thu, 20 Feb 2020 13:51:17 +0800 Subject: [PATCH 4/4] Remove unused code (4/n) Bug: 149876119 Test: m Change-Id: I3f7c88eeb74ce5b44646fcb7a690665b78a17f2d --- .../rollback/host/MultiUserRollbackTest.java | 26 ------------------- 1 file changed, 26 deletions(-) diff --git a/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java b/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java index ecd3db5c6849c..e616ac46830f0 100644 --- a/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java +++ b/tests/RollbackTest/MultiUserRollbackTest/src/com/android/tests/rollback/host/MultiUserRollbackTest.java @@ -108,30 +108,4 @@ public class MultiUserRollbackTest extends BaseHostJUnit4Test { // Note we can't install apps on a locked user awaitUserUnlocked(mSecondaryUserId); } - - private void createAndSwitchToSecondaryUserIfNecessary() throws Exception { - if (mSecondaryUserId == -1) { - mOriginalUserId = getDevice().getCurrentUser(); - mSecondaryUserId = getDevice().createUser("MultiUserRollbackTest_User" - + System.currentTimeMillis()); - switchToUser(mSecondaryUserId); - } - } - - private void switchToUser(int userId) throws Exception { - if (getDevice().getCurrentUser() == userId) { - return; - } - - assertTrue(getDevice().switchUser(userId)); - for (int i = 0; i < SWITCH_USER_COMPLETED_NUMBER_OF_POLLS; ++i) { - String userState = getDevice().executeShellCommand("am get-started-user-state " - + userId); - if (userState.contains("RUNNING_UNLOCKED")) { - return; - } - Thread.sleep(SWITCH_USER_COMPLETED_POLL_INTERVAL_IN_MILLIS); - } - fail("User switch to user " + userId + " timed out"); - } }