Merge "Fix flaky test & add func runOnHostRetryingOnFailure"
diff --git a/tests/hostside/helper/java/android/virt/test/VirtualizationTestCaseBase.java b/tests/hostside/helper/java/android/virt/test/VirtualizationTestCaseBase.java
index a55ebe1..10d1e8e 100644
--- a/tests/hostside/helper/java/android/virt/test/VirtualizationTestCaseBase.java
+++ b/tests/hostside/helper/java/android/virt/test/VirtualizationTestCaseBase.java
@@ -59,6 +59,11 @@
private static final long MICRODROID_MAX_LIFETIME_MINUTES = 20;
private static final long MICRODROID_ADB_CONNECT_TIMEOUT_MINUTES = 5;
+ protected static final long MICRODROID_COMMAND_TIMEOUT_MILLIS = 30000;
+ private static final long MICRODROID_COMMAND_RETRY_INTERVAL_MILLIS = 500;
+ protected static final int MICRODROID_ADB_CONNECT_MAX_ATTEMPTS =
+ (int) (MICRODROID_ADB_CONNECT_TIMEOUT_MINUTES * 60 * 1000
+ / MICRODROID_COMMAND_RETRY_INTERVAL_MILLIS);
public static void prepareVirtualizationTestSetup(ITestDevice androidDevice)
throws DeviceNotAvailableException {
@@ -128,12 +133,25 @@
return result.getStdout().trim();
}
- // Same as runOnMicrodroid, but keeps retrying on error till timeout
- private static String runOnMicrodroidRetryingOnFailure(String... cmd) {
- final long timeoutMs = 30000; // 30 sec. Microdroid is extremely slow on GCE-on-CF.
- int attempts = (int) MICRODROID_ADB_CONNECT_TIMEOUT_MINUTES * 60 * 1000 / 500;
+ // Same as runOnHost, but keeps retrying on error for maximum attempts times
+ // Each attempt with timeoutMs
+ public static String runOnHostRetryingOnFailure(long timeoutMs, int attempts, String... cmd) {
CommandResult result = RunUtil.getDefault()
- .runTimedCmdRetry(timeoutMs, 500, attempts,
+ .runTimedCmdRetry(timeoutMs,
+ MICRODROID_COMMAND_RETRY_INTERVAL_MILLIS, attempts, cmd);
+ assertWithMessage("Command `" + cmd + "` has failed")
+ .about(command_results())
+ .that(result)
+ .isSuccess();
+ return result.getStdout().trim();
+ }
+
+ // Same as runOnMicrodroid, but keeps retrying on error for maximum attempts times
+ // Each attempt with timeoutMs
+ public static String runOnMicrodroidRetryingOnFailure(
+ long timeoutMs, int attempts, String... cmd) {
+ CommandResult result = RunUtil.getDefault()
+ .runTimedCmdRetry(timeoutMs, MICRODROID_COMMAND_RETRY_INTERVAL_MILLIS, attempts,
"adb", "-s", MICRODROID_SERIAL, "shell", join(cmd));
assertWithMessage("Command `" + cmd + "` has failed")
.about(command_results())
@@ -328,18 +346,14 @@
android.run(VIRT_APEX + "bin/vm", "stop", cid);
}
- public static void rootMicrodroid() {
- runOnHost("adb", "-s", MICRODROID_SERIAL, "root");
- runOnHostWithTimeout(
- MICRODROID_ADB_CONNECT_TIMEOUT_MINUTES * 60 * 1000,
- "adb",
- "-s",
- MICRODROID_SERIAL,
- "wait-for-device");
- // There have been tests when adb wait-for-device succeeded but the following command
- // fails with error: closed. Hence, we run adb shell true in microdroid with retries
+ public static void rootMicrodroid() throws InterruptedException {
+ runOnHostRetryingOnFailure(MICRODROID_COMMAND_TIMEOUT_MILLIS,
+ MICRODROID_ADB_CONNECT_MAX_ATTEMPTS, "adb", "-s", MICRODROID_SERIAL, "root");
+ // adbd reboots after root. Some commands (including wait-for-device) following this fails
+ // with error: closed. Hence, we run adb shell true in microdroid with retries
// before returning.
- runOnMicrodroidRetryingOnFailure("true");
+ runOnMicrodroidRetryingOnFailure(MICRODROID_COMMAND_TIMEOUT_MILLIS,
+ MICRODROID_ADB_CONNECT_MAX_ATTEMPTS, "true");
}
// Establish an adb connection to microdroid by letting Android forward the connection to
diff --git a/tests/hostside/java/android/virt/test/MicrodroidTestCase.java b/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
index bb27913..56829fc 100644
--- a/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
+++ b/tests/hostside/java/android/virt/test/MicrodroidTestCase.java
@@ -384,13 +384,16 @@
Optional.of(CPU_AFFINITY));
adbConnectToMicrodroid(getDevice(), cid);
waitForBootComplete();
- runOnMicrodroid("logcat -c");
+ runOnMicrodroidRetryingOnFailure(MICRODROID_COMMAND_TIMEOUT_MILLIS,
+ MICRODROID_ADB_CONNECT_MAX_ATTEMPTS,
+ "logcat -c");
// We need root permission to write to /data/tombstones/
rootMicrodroid();
// Write a test tombstone file in /data/tombstones
runOnMicrodroid("echo -n \'Test tombstone in VM with 34 bytes\'"
+ "> /data/tombstones/transmit.txt");
- // check if the tombstone have been tranferred from VM
+ // check if the tombstone have been tranferred from VM. This is a bit flaky - increasing
+ // timeout to 30s can result in SIGKILL inside microdroid due to logcat memory issue
assertNotEquals(runOnMicrodroid("timeout 15s logcat | grep -m 1 "
+ "'tombstone_transmit.microdroid:.*data/tombstones/transmit.txt'"),
"");