Loading services/core/java/com/android/server/rollback/TEST_MAPPING +3 −6 Original line number Diff line number Diff line { "presubmit": [ { "name": "RollbackTest" }, { "name": "StagedRollbackTest" }, { "name": "FrameworksServicesTests", "options": [ Loading @@ -21,6 +15,9 @@ }, { "path": "cts/hostsidetests/rollback" }, { "path": "frameworks/base/tests/RollbackTest" } ] } tests/RollbackTest/Android.bp +8 −0 Original line number Diff line number Diff line Loading @@ -105,3 +105,11 @@ java_test_host { test_suites: ["general-tests"], test_config: "StagedRollbackTest.xml", } java_test_host { name: "SecondaryUserRollbackTest", srcs: ["SecondaryUserRollbackTest/src/**/*.java"], libs: ["tradefed"], test_suites: ["general-tests"], test_config: "SecondaryUserRollbackTest.xml", } tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java +9 −3 Original line number Diff line number Diff line Loading @@ -147,9 +147,15 @@ public class RollbackTest { // TODO: Race condition between the timeout and when the broadcast is // received could lead to test flakiness. Intent broadcast = broadcastReceiver.poll(5, TimeUnit.SECONDS); if (context.getUser().isSystem()) { // Only system user should receive those broadcasts. assertNotNull(broadcast); assertNull(broadcastReceiver.poll(0, TimeUnit.SECONDS)); } else { // This is in case the test was running under a secondary user, in which case // the broadcast won't be received here. assertNull(broadcast); } // Verify the recent rollback has been recorded. rollback = getUniqueRollbackInfoForPackage( rm.getRecentlyCommittedRollbacks(), TEST_APP_A); Loading tests/RollbackTest/SecondaryUserRollbackTest.xml 0 → 100644 +25 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- 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. --> <configuration description="Runs the rollback test from a secondary user"> <option name="test-suite-tag" value="SecondaryUserRollbackTest" /> <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> <test class="com.android.tradefed.testtype.HostTest" > <option name="class" value="com.android.tests.rollback.host.SecondaryUserRollbackTest" /> </test> </configuration> tests/RollbackTest/SecondaryUserRollbackTest/src/com/android/tests/rollback/host/SecondaryUserRollbackTest.java 0 → 100644 +92 −0 Original line number Diff line number Diff line /* * 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.host; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; /** * Runs rollback tests from a secondary user. */ @RunWith(DeviceJUnit4ClassRunner.class) public class SecondaryUserRollbackTest extends BaseHostJUnit4Test { private static final int SYSTEM_USER_ID = 0; // The user that was running originally when the test starts. private int mOriginalUser = SYSTEM_USER_ID; private int mSecondaryUserId = -1; private static final long SWITCH_USER_COMPLETED_NUMBER_OF_POLLS = 60; private static final long SWITCH_USER_COMPLETED_POLL_INTERVAL_IN_MILLIS = 1000; @After public void tearDown() throws Exception { getDevice().switchUser(mOriginalUser); getDevice().executeShellCommand("pm uninstall com.android.tests.rollback.testapp.A"); getDevice().executeShellCommand("pm uninstall com.android.tests.rollback.testapp.B"); removeSecondaryUserIfNecessary(); } @Before public void setup() throws Exception { createAndSwitchToSecondaryUserIfNecessary(); installPackageAsUser("RollbackTest.apk", true, mSecondaryUserId, "--user current"); } @Test public void testBasic() throws Exception { assertTrue(runDeviceTests("com.android.tests.rollback", "com.android.tests.rollback.RollbackTest", "testBasic")); } private void removeSecondaryUserIfNecessary() throws Exception { if (mSecondaryUserId != -1) { getDevice().removeUser(mSecondaryUserId); mSecondaryUserId = -1; } } private void createAndSwitchToSecondaryUserIfNecessary() throws Exception { if (mSecondaryUserId == -1) { mOriginalUser = getDevice().getCurrentUser(); mSecondaryUserId = getDevice().createUser("SecondaryUserRollbackTest_User"); assertTrue(getDevice().switchUser(mSecondaryUserId)); // give time for user to be switched waitForSwitchUserCompleted(mSecondaryUserId); } } private void waitForSwitchUserCompleted(int userId) throws Exception { for (int i = 0; i < SWITCH_USER_COMPLETED_NUMBER_OF_POLLS; ++i) { String logs = getDevice().executeAdbCommand("logcat", "-v", "brief", "-d", "ActivityManager:D"); if (logs.contains("Posting BOOT_COMPLETED user #" + userId)) { return; } Thread.sleep(SWITCH_USER_COMPLETED_POLL_INTERVAL_IN_MILLIS); } fail("User switch to user " + userId + " timed out"); } } Loading
services/core/java/com/android/server/rollback/TEST_MAPPING +3 −6 Original line number Diff line number Diff line { "presubmit": [ { "name": "RollbackTest" }, { "name": "StagedRollbackTest" }, { "name": "FrameworksServicesTests", "options": [ Loading @@ -21,6 +15,9 @@ }, { "path": "cts/hostsidetests/rollback" }, { "path": "frameworks/base/tests/RollbackTest" } ] }
tests/RollbackTest/Android.bp +8 −0 Original line number Diff line number Diff line Loading @@ -105,3 +105,11 @@ java_test_host { test_suites: ["general-tests"], test_config: "StagedRollbackTest.xml", } java_test_host { name: "SecondaryUserRollbackTest", srcs: ["SecondaryUserRollbackTest/src/**/*.java"], libs: ["tradefed"], test_suites: ["general-tests"], test_config: "SecondaryUserRollbackTest.xml", }
tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java +9 −3 Original line number Diff line number Diff line Loading @@ -147,9 +147,15 @@ public class RollbackTest { // TODO: Race condition between the timeout and when the broadcast is // received could lead to test flakiness. Intent broadcast = broadcastReceiver.poll(5, TimeUnit.SECONDS); if (context.getUser().isSystem()) { // Only system user should receive those broadcasts. assertNotNull(broadcast); assertNull(broadcastReceiver.poll(0, TimeUnit.SECONDS)); } else { // This is in case the test was running under a secondary user, in which case // the broadcast won't be received here. assertNull(broadcast); } // Verify the recent rollback has been recorded. rollback = getUniqueRollbackInfoForPackage( rm.getRecentlyCommittedRollbacks(), TEST_APP_A); Loading
tests/RollbackTest/SecondaryUserRollbackTest.xml 0 → 100644 +25 −0 Original line number Diff line number Diff line <?xml version="1.0" encoding="utf-8"?> <!-- 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. --> <configuration description="Runs the rollback test from a secondary user"> <option name="test-suite-tag" value="SecondaryUserRollbackTest" /> <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> <test class="com.android.tradefed.testtype.HostTest" > <option name="class" value="com.android.tests.rollback.host.SecondaryUserRollbackTest" /> </test> </configuration>
tests/RollbackTest/SecondaryUserRollbackTest/src/com/android/tests/rollback/host/SecondaryUserRollbackTest.java 0 → 100644 +92 −0 Original line number Diff line number Diff line /* * 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.host; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import com.android.tradefed.testtype.DeviceJUnit4ClassRunner; import com.android.tradefed.testtype.junit4.BaseHostJUnit4Test; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; /** * Runs rollback tests from a secondary user. */ @RunWith(DeviceJUnit4ClassRunner.class) public class SecondaryUserRollbackTest extends BaseHostJUnit4Test { private static final int SYSTEM_USER_ID = 0; // The user that was running originally when the test starts. private int mOriginalUser = SYSTEM_USER_ID; private int mSecondaryUserId = -1; private static final long SWITCH_USER_COMPLETED_NUMBER_OF_POLLS = 60; private static final long SWITCH_USER_COMPLETED_POLL_INTERVAL_IN_MILLIS = 1000; @After public void tearDown() throws Exception { getDevice().switchUser(mOriginalUser); getDevice().executeShellCommand("pm uninstall com.android.tests.rollback.testapp.A"); getDevice().executeShellCommand("pm uninstall com.android.tests.rollback.testapp.B"); removeSecondaryUserIfNecessary(); } @Before public void setup() throws Exception { createAndSwitchToSecondaryUserIfNecessary(); installPackageAsUser("RollbackTest.apk", true, mSecondaryUserId, "--user current"); } @Test public void testBasic() throws Exception { assertTrue(runDeviceTests("com.android.tests.rollback", "com.android.tests.rollback.RollbackTest", "testBasic")); } private void removeSecondaryUserIfNecessary() throws Exception { if (mSecondaryUserId != -1) { getDevice().removeUser(mSecondaryUserId); mSecondaryUserId = -1; } } private void createAndSwitchToSecondaryUserIfNecessary() throws Exception { if (mSecondaryUserId == -1) { mOriginalUser = getDevice().getCurrentUser(); mSecondaryUserId = getDevice().createUser("SecondaryUserRollbackTest_User"); assertTrue(getDevice().switchUser(mSecondaryUserId)); // give time for user to be switched waitForSwitchUserCompleted(mSecondaryUserId); } } private void waitForSwitchUserCompleted(int userId) throws Exception { for (int i = 0; i < SWITCH_USER_COMPLETED_NUMBER_OF_POLLS; ++i) { String logs = getDevice().executeAdbCommand("logcat", "-v", "brief", "-d", "ActivityManager:D"); if (logs.contains("Posting BOOT_COMPLETED user #" + userId)) { return; } Thread.sleep(SWITCH_USER_COMPLETED_POLL_INTERVAL_IN_MILLIS); } fail("User switch to user " + userId + " timed out"); } }