Merge changes from topic "migrate_CtsStagedInstallTest_RollbackTest"
am: 63e6d6af01
Change-Id: I362c1a03a1f8c106f684cd6a28fe63fbd5532d9c
This commit is contained in:
@@ -31,9 +31,9 @@ java_test_host {
|
|||||||
}
|
}
|
||||||
|
|
||||||
java_test_host {
|
java_test_host {
|
||||||
name: "SecondaryUserRollbackTest",
|
name: "MultiUserRollbackTest",
|
||||||
srcs: ["SecondaryUserRollbackTest/src/**/*.java"],
|
srcs: ["MultiUserRollbackTest/src/**/*.java"],
|
||||||
libs: ["tradefed"],
|
libs: ["tradefed"],
|
||||||
test_suites: ["general-tests"],
|
test_suites: ["general-tests"],
|
||||||
test_config: "SecondaryUserRollbackTest.xml",
|
test_config: "MultiUserRollbackTest.xml",
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,17 +13,12 @@
|
|||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
-->
|
-->
|
||||||
<configuration description="Runs the rollback test from a secondary user">
|
<configuration description="Runs rollback tests for multiple users">
|
||||||
<option name="test-suite-tag" value="SecondaryUserRollbackTest" />
|
<option name="test-suite-tag" value="MultiUserRollbackTest" />
|
||||||
<target_preparer class="com.android.tradefed.targetprep.suite.SuiteApkInstaller">
|
|
||||||
<option name="cleanup-apks" value="true" />
|
|
||||||
<option name="test-file-name" value="RollbackTest.apk" />
|
|
||||||
</target_preparer>
|
|
||||||
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
|
<target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
|
||||||
<option name="run-command" value="pm uninstall com.android.cts.install.lib.testapp.A" />
|
<option name="run-command" value="pm uninstall com.android.cts.install.lib.testapp.A" />
|
||||||
<option name="run-command" value="pm uninstall com.android.cts.install.lib.testapp.B" />
|
|
||||||
</target_preparer>
|
</target_preparer>
|
||||||
<test class="com.android.tradefed.testtype.HostTest" >
|
<test class="com.android.tradefed.testtype.HostTest" >
|
||||||
<option name="class" value="com.android.tests.rollback.host.SecondaryUserRollbackTest" />
|
<option name="class" value="com.android.tests.rollback.host.MultiUserRollbackTest" />
|
||||||
</test>
|
</test>
|
||||||
</configuration>
|
</configuration>
|
||||||
@@ -28,13 +28,12 @@ import org.junit.Test;
|
|||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Runs rollback tests from a secondary user.
|
* Runs rollback tests for multiple users.
|
||||||
*/
|
*/
|
||||||
@RunWith(DeviceJUnit4ClassRunner.class)
|
@RunWith(DeviceJUnit4ClassRunner.class)
|
||||||
public class SecondaryUserRollbackTest extends BaseHostJUnit4Test {
|
public class MultiUserRollbackTest extends BaseHostJUnit4Test {
|
||||||
private static final int SYSTEM_USER_ID = 0;
|
|
||||||
// The user that was running originally when the test starts.
|
// The user that was running originally when the test starts.
|
||||||
private int mOriginalUser = SYSTEM_USER_ID;
|
private int mOriginalUserId;
|
||||||
private int mSecondaryUserId = -1;
|
private int mSecondaryUserId = -1;
|
||||||
private static final long SWITCH_USER_COMPLETED_NUMBER_OF_POLLS = 60;
|
private static final long SWITCH_USER_COMPLETED_NUMBER_OF_POLLS = 60;
|
||||||
private static final long SWITCH_USER_COMPLETED_POLL_INTERVAL_IN_MILLIS = 1000;
|
private static final long SWITCH_USER_COMPLETED_POLL_INTERVAL_IN_MILLIS = 1000;
|
||||||
@@ -42,23 +41,45 @@ public class SecondaryUserRollbackTest extends BaseHostJUnit4Test {
|
|||||||
|
|
||||||
@After
|
@After
|
||||||
public void tearDown() throws Exception {
|
public void tearDown() throws Exception {
|
||||||
getDevice().switchUser(mOriginalUser);
|
getDevice().switchUser(mOriginalUserId);
|
||||||
getDevice().executeShellCommand("pm uninstall com.android.cts.install.lib.testapp.A");
|
getDevice().executeShellCommand("pm uninstall com.android.cts.install.lib.testapp.A");
|
||||||
getDevice().executeShellCommand("pm uninstall com.android.cts.install.lib.testapp.B");
|
|
||||||
removeSecondaryUserIfNecessary();
|
removeSecondaryUserIfNecessary();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setup() throws Exception {
|
public void setup() throws Exception {
|
||||||
|
mOriginalUserId = getDevice().getCurrentUser();
|
||||||
|
installPackageAsUser("RollbackTest.apk", true, mOriginalUserId);
|
||||||
createAndSwitchToSecondaryUserIfNecessary();
|
createAndSwitchToSecondaryUserIfNecessary();
|
||||||
installPackageAsUser("RollbackTest.apk", true, mSecondaryUserId, "--user current");
|
installPackageAsUser("RollbackTest.apk", true, mSecondaryUserId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testBasic() throws Exception {
|
public void testBasicForSecondaryUser() throws Exception {
|
||||||
|
runPhaseForUsers("testBasic", mSecondaryUserId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMultipleUsers() throws Exception {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the phase for the given user ids, in the order they are given.
|
||||||
|
*/
|
||||||
|
private void runPhaseForUsers(String phase, int... userIds) throws Exception {
|
||||||
|
for (int userId: userIds) {
|
||||||
|
switchToUser(userId);
|
||||||
assertTrue(runDeviceTests("com.android.tests.rollback",
|
assertTrue(runDeviceTests("com.android.tests.rollback",
|
||||||
"com.android.tests.rollback.RollbackTest",
|
"com.android.tests.rollback.MultiUserRollbackTest",
|
||||||
"testBasic"));
|
phase));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeSecondaryUserIfNecessary() throws Exception {
|
private void removeSecondaryUserIfNecessary() throws Exception {
|
||||||
@@ -70,19 +91,23 @@ public class SecondaryUserRollbackTest extends BaseHostJUnit4Test {
|
|||||||
|
|
||||||
private void createAndSwitchToSecondaryUserIfNecessary() throws Exception {
|
private void createAndSwitchToSecondaryUserIfNecessary() throws Exception {
|
||||||
if (mSecondaryUserId == -1) {
|
if (mSecondaryUserId == -1) {
|
||||||
mOriginalUser = getDevice().getCurrentUser();
|
mOriginalUserId = getDevice().getCurrentUser();
|
||||||
mSecondaryUserId = getDevice().createUser("SecondaryUserRollbackTest_User");
|
mSecondaryUserId = getDevice().createUser("MultiUserRollbackTest_User"
|
||||||
assertTrue(getDevice().switchUser(mSecondaryUserId));
|
+ System.currentTimeMillis());
|
||||||
// give time for user to be switched
|
switchToUser(mSecondaryUserId);
|
||||||
waitForSwitchUserCompleted(mSecondaryUserId);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void waitForSwitchUserCompleted(int userId) throws Exception {
|
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) {
|
for (int i = 0; i < SWITCH_USER_COMPLETED_NUMBER_OF_POLLS; ++i) {
|
||||||
String logs = getDevice().executeAdbCommand("logcat", "-v", "brief", "-d",
|
String userState = getDevice().executeShellCommand("am get-started-user-state "
|
||||||
"ActivityManager:D");
|
+ userId);
|
||||||
if (logs.contains("Posting BOOT_COMPLETED user #" + userId)) {
|
if (userState.contains("RUNNING_UNLOCKED")) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Thread.sleep(SWITCH_USER_COMPLETED_POLL_INTERVAL_IN_MILLIS);
|
Thread.sleep(SWITCH_USER_COMPLETED_POLL_INTERVAL_IN_MILLIS);
|
||||||
@@ -22,8 +22,9 @@
|
|||||||
<option name="package" value="com.android.tests.rollback" />
|
<option name="package" value="com.android.tests.rollback" />
|
||||||
<option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
|
<option name="runner" value="androidx.test.runner.AndroidJUnitRunner" />
|
||||||
|
|
||||||
<!-- Exclude the StagedRollbackTest tests, which needs to be specially
|
<!-- Exclude the StagedRollbackTest and MultiUserRollbackTest tests, which need to be
|
||||||
driven from the StagedRollbackTest host test -->
|
specially driven from the StagedRollbackTest and MultiUserRollbackTest host test -->
|
||||||
<option name="exclude-filter" value="com.android.tests.rollback.StagedRollbackTest" />
|
<option name="exclude-filter" value="com.android.tests.rollback.StagedRollbackTest" />
|
||||||
|
<option name="exclude-filter" value="com.android.tests.rollback.MultiUserRollbackTest" />
|
||||||
</test>
|
</test>
|
||||||
</configuration>
|
</configuration>
|
||||||
|
|||||||
@@ -0,0 +1,111 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2019 The Android Open Source Project
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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;
|
||||||
|
import com.android.cts.install.lib.TestApp;
|
||||||
|
import com.android.cts.rollback.lib.Rollback;
|
||||||
|
import com.android.cts.rollback.lib.RollbackUtils;
|
||||||
|
|
||||||
|
import org.junit.After;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.junit.runners.JUnit4;
|
||||||
|
|
||||||
|
|
||||||
|
@RunWith(JUnit4.class)
|
||||||
|
public class MultiUserRollbackTest {
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void adoptShellPermissions() {
|
||||||
|
InstallUtils.adoptShellPermissionIdentity(
|
||||||
|
Manifest.permission.INSTALL_PACKAGES,
|
||||||
|
Manifest.permission.DELETE_PACKAGES,
|
||||||
|
Manifest.permission.TEST_MANAGE_ROLLBACKS,
|
||||||
|
Manifest.permission.MANAGE_ROLLBACKS);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void dropShellPermissions() {
|
||||||
|
InstallUtils.dropShellPermissionIdentity();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testBasic() throws Exception {
|
||||||
|
new RollbackTest().testBasic();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Install version 1 of the test app. This method is run for both users.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMultipleUsersInstallV1() throws Exception {
|
||||||
|
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(-1);
|
||||||
|
Install.single(TestApp.A1).commit();
|
||||||
|
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||||
|
InstallUtils.processUserData(TestApp.A);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Upgrade the test app to version 2. This method should only run once as the system user,
|
||||||
|
* and will update the app for both users.
|
||||||
|
*/
|
||||||
|
@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();
|
||||||
|
assertThat(rollback).packagesContainsExactly(
|
||||||
|
Rollback.from(TestApp.A2).to(TestApp.A1));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This method is run for both users. Assert that the test app has upgraded for both users, and
|
||||||
|
* update their userdata to reflect this new version.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMultipleUsersUpdateUserData() {
|
||||||
|
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(2);
|
||||||
|
InstallUtils.processUserData(TestApp.A);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The system will have rolled back the test app at this stage. Verify that the rollback has
|
||||||
|
* taken place, and that the userdata has been correctly rolled back. This method is run for
|
||||||
|
* both users.
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void testMultipleUsersVerifyUserdataRollback() {
|
||||||
|
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(1);
|
||||||
|
InstallUtils.processUserData(TestApp.A);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
"name": "StagedRollbackTest"
|
"name": "StagedRollbackTest"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "SecondaryUserRollbackTest"
|
"name": "MultiUserRollbackTest"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user