summaryrefslogtreecommitdiff
path: root/tests/RollbackTest
diff options
context:
space:
mode:
authorJW Wang <wangchun@google.com>2020-03-24 16:09:58 +0800
committerJW Wang <wangchun@google.com>2020-03-24 16:09:58 +0800
commita09e3c09832912c649e343b8486e0951457551f7 (patch)
treec8555c471f89e34f7639e95c1d5230bfa46f23a9 /tests/RollbackTest
parente0b1bfb87d020f5da3cd32a3473e13297fbbe11d (diff)
Fix a flaky test
It is possible to have multiple committed rollbacks which include the same app. Uninstalling an app will delete committed rollbacks which include the app. However, there is a race condition between when the app is uninstalled and when rollback manager deletes the rollback as is stated here: https://cs.corp.google.com/android/frameworks/base/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java?rcl=75dfeca3d40624b745f41155aa38bc5e3fa405fe&l=116 We hit the assertion in #getUniqueRollbackInfoForPackage when there are multiple rollbacks including the same package which is caused by the race condition above. Let's rewrite the code by calling #hasRollbackInclude instead which will not throw. Also do some cleanup in the xml to improve the isolation of our tests. Bug: 152271716 Test: atest RollbackTest Change-Id: Iad3effe52db2a0d2d5e3914bcd08ed93926f3fd3
Diffstat (limited to 'tests/RollbackTest')
-rw-r--r--tests/RollbackTest/RollbackTest.xml4
-rw-r--r--tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java14
2 files changed, 12 insertions, 6 deletions
diff --git a/tests/RollbackTest/RollbackTest.xml b/tests/RollbackTest/RollbackTest.xml
index 269cec1ccca9..7b85cc84f1f5 100644
--- a/tests/RollbackTest/RollbackTest.xml
+++ b/tests/RollbackTest/RollbackTest.xml
@@ -23,6 +23,10 @@
<option name="run-command" value="am broadcast -a 'com.google.android.gms.phenotype.FLAG_OVERRIDE' --es package &quot;com.google.android.gms.platformconfigurator&quot; --es user '\\*' --esa flags &quot;ModuleConfig__versioned_immediate_commit_packages&quot; --esa types &quot;bytes&quot; --esa values &quot;Cm5vdGFwYWNrYWdlOgA=&quot; com.google.android.gms" />
<option name="teardown-command" value="am broadcast -a 'com.google.android.gms.phenotype.FLAG_OVERRIDE' --es action delete --es package &quot;com.google.android.gms.platformconfigurator&quot; --es user '\*' --esa flag &quot;ModuleConfig__immediate_commit_packages&quot; com.google.android.gms" />
<option name="teardown-command" value="am broadcast -a 'com.google.android.gms.phenotype.FLAG_OVERRIDE' --es action delete --es package &quot;com.google.android.gms.platformconfigurator&quot; --es user '\*' --esa flag &quot;ModuleConfig__versioned_immediate_commit_packages&quot; com.google.android.gms" />
+ <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" />
+ <option name="teardown-command" value="pm uninstall com.android.cts.install.lib.testapp.A" />
+ <option name="teardown-command" value="pm uninstall com.android.cts.install.lib.testapp.B" />
</target_preparer>
<test class="com.android.tradefed.testtype.AndroidJUnitTest" >
<option name="package" value="com.android.tests.rollback" />
diff --git a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
index 5a92d6849434..cab8b4258bc8 100644
--- a/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
+++ b/tests/RollbackTest/RollbackTest/src/com/android/tests/rollback/RollbackTest.java
@@ -75,6 +75,12 @@ public class RollbackTest {
private static final String PROPERTY_ENABLE_ROLLBACK_TIMEOUT_MILLIS =
"enable_rollback_timeout";
+ private static boolean hasRollbackInclude(List<RollbackInfo> rollbacks, String packageName) {
+ return rollbacks.stream().anyMatch(
+ ri -> ri.getPackages().stream().anyMatch(
+ pri -> packageName.equals(pri.getPackageName())));
+ }
+
/**
* Test basic rollbacks.
*/
@@ -113,18 +119,14 @@ public class RollbackTest {
// Uninstall TestApp.A
Uninstall.packages(TestApp.A);
assertThat(InstallUtils.getInstalledVersion(TestApp.A)).isEqualTo(-1);
- // TODO: There is currently a race condition between when the app is
- // uninstalled and when rollback manager deletes the rollback. Fix it
- // so that's not the case!
for (int i = 0; i < 5; ++i) {
- RollbackInfo rollback = getUniqueRollbackInfoForPackage(
- rm.getRecentlyCommittedRollbacks(), TestApp.A);
- if (rollback != null) {
+ if (hasRollbackInclude(rm.getRecentlyCommittedRollbacks(), TestApp.A)) {
Log.i(TAG, "Sleeping 1 second to wait for uninstall to take effect.");
Thread.sleep(1000);
}
}
+ assertThat(hasRollbackInclude(rm.getRecentlyCommittedRollbacks(), TestApp.A)).isFalse();
// The app should not be available for rollback.
waitForUnavailableRollback(TestApp.A);