Merge "Apply new api linter for our tests" into main
diff --git a/android/virtmgr/src/crosvm.rs b/android/virtmgr/src/crosvm.rs
index 9ee181a..77710c3 100644
--- a/android/virtmgr/src/crosvm.rs
+++ b/android/virtmgr/src/crosvm.rs
@@ -21,7 +21,7 @@
 use binder::ParcelFileDescriptor;
 use command_fds::CommandFdExt;
 use libc::{sysconf, _SC_CLK_TCK};
-use log::{debug, error, info};
+use log::{debug, error, info, warn};
 use semver::{Version, VersionReq};
 use nix::{fcntl::OFlag, unistd::pipe2, unistd::Uid, unistd::User};
 use regex::{Captures, Regex};
@@ -649,7 +649,7 @@
                         Ok(guest_time) => vm_metric.cpu_guest_time = Some(guest_time),
                         Err(e) => {
                             metric_countdown = 0;
-                            error!("Failed to get guest CPU time: {e:?}");
+                            warn!("Failed to get guest CPU time: {}", e);
                         }
                     }
 
@@ -663,7 +663,7 @@
                         }
                         Err(e) => {
                             metric_countdown = 0;
-                            error!("Failed to get guest RSS: {}", e);
+                            warn!("Failed to get guest RSS: {}", e);
                         }
                     }
                 }
@@ -857,6 +857,9 @@
     }
 
     let guest_time_ticks = data_list[42].parse::<i64>()?;
+    if guest_time_ticks == 0 {
+        bail!("zero value is measured on elapsed CPU guest_time");
+    }
     // SAFETY: It just returns an integer about CPU tick information.
     let ticks_per_sec = unsafe { sysconf(_SC_CLK_TCK) };
     Ok(guest_time_ticks * MILLIS_PER_SEC / ticks_per_sec)
@@ -887,7 +890,12 @@
             rss_crosvm_total += rss;
         }
     }
-
+    if rss_crosvm_total == 0 {
+        bail!("zero value is measured on RSS of crosvm");
+    }
+    if rss_vm_total == 0 {
+        bail!("zero value is measured on RSS of VM");
+    }
     Ok(Rss { vm: rss_vm_total, crosvm: rss_crosvm_total })
 }
 
diff --git a/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java b/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java
index 67249b4..18ed7b6 100644
--- a/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java
+++ b/tests/helper/src/java/com/android/microdroid/test/device/MicrodroidDeviceTestBase.java
@@ -58,9 +58,10 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
-import java.util.Arrays;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.List;
 import java.util.OptionalLong;
 import java.util.Set;
 import java.util.concurrent.CompletableFuture;
@@ -73,13 +74,21 @@
     private final String MAX_PERFORMANCE_TASK_PROFILE = "CPUSET_SP_TOP_APP";
 
     protected static final String KERNEL_VERSION = SystemProperties.get("ro.kernel.version");
+
+    private static final List<String> getSupportedOSes() {
+        List<String> ret = new ArrayList<>();
+        ret.add("microdroid");
+        if (Build.VERSION.SDK_INT >= 35) {
+            ret.add("microdroid_gki-android15-6.6");
+        }
+        if (Build.VERSION.SDK_INT >= 36) {
+            ret.add("microdroid_16k");
+        }
+        return ret;
+    }
+
     protected static final Set<String> SUPPORTED_OSES =
-            Collections.unmodifiableSet(
-                    new HashSet<>(
-                            Arrays.asList(
-                                    "microdroid",
-                                    "microdroid_16k",
-                                    "microdroid_gki-android15-6.6")));
+            Collections.unmodifiableSet(new HashSet<>(getSupportedOSes()));
 
     private static final long ONE_MEBI = 1024 * 1024;
     private static final long MIN_MEM_ARM64 = 170 * ONE_MEBI;
@@ -155,10 +164,12 @@
     }
 
     public VirtualMachineConfig.Builder newVmConfigBuilderWithPayloadConfig(String configPath) {
-        return new VirtualMachineConfig.Builder(mCtx)
-                .setProtectedVm(mProtectedVm)
-                .setOs(os())
-                .setPayloadConfigPath(configPath);
+        VirtualMachineConfig.Builder builder = new VirtualMachineConfig.Builder(mCtx);
+        builder.setProtectedVm(mProtectedVm).setPayloadConfigPath(configPath);
+        if (Build.VERSION.SDK_INT >= 35) {
+            builder.setOs(os());
+        }
+        return builder;
     }
 
     public VirtualMachineConfig.Builder newVmConfigBuilderWithPayloadBinary(String binaryPath) {
@@ -288,15 +299,18 @@
     }
 
     protected boolean isUpdatableVmSupported() throws VirtualMachineException {
-        return getVirtualMachineManager().isUpdatableVmSupported();
+        // Pre-36 OS doesn't have VirtualMachineManager#isUpdatableVmSupported.
+        if (Build.VERSION.SDK_INT >= 35) {
+            return getVirtualMachineManager().isUpdatableVmSupported();
+        }
+        return false;
     }
 
     protected void ensureVmAttestationSupported() throws Exception {
         // The first vendor API level is checked because VM attestation requires the VM DICE chain
         // to be ROM-rooted.
         int firstVendorApiLevel = getFirstVendorApiLevel();
-        boolean isRemoteAttestationSupported =
-                getVirtualMachineManager().isRemoteAttestationSupported();
+        boolean isRemoteAttestationSupported = isRemoteAttestationSupported();
         if (firstVendorApiLevel >= 202504) {
             assertWithMessage(
                             "First vendor API '"
@@ -309,6 +323,14 @@
         }
     }
 
+    protected boolean isRemoteAttestationSupported() throws VirtualMachineException {
+        // Pre-36 OS doesn't have VirtualMachineManager#isRemoteAttestionSupported
+        if (Build.VERSION.SDK_INT >= 35) {
+            return getVirtualMachineManager().isRemoteAttestationSupported();
+        }
+        return false;
+    }
+
     public abstract static class VmEventListener implements VirtualMachineCallback {
         private ExecutorService mExecutorService = Executors.newSingleThreadExecutor();
         private OptionalLong mVcpuStartedNanoTime = OptionalLong.empty();
diff --git a/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java b/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
index e4a3ff6..639224d 100644
--- a/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
+++ b/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
@@ -257,7 +257,7 @@
         assumeProtectedVM();
         assume().withMessage(
                         "This test does not apply to a device that supports Remote Attestation")
-                .that(getVirtualMachineManager().isRemoteAttestationSupported())
+                .that(isRemoteAttestationSupported())
                 .isFalse();
         VirtualMachineConfig config =
                 newVmConfigBuilderWithPayloadBinary(VM_ATTESTATION_PAYLOAD_PATH)
@@ -285,7 +285,7 @@
         // pVM remote attestation is only supported on protected VMs.
         assumeProtectedVM();
         assume().withMessage("Test needs Remote Attestation support")
-                .that(getVirtualMachineManager().isRemoteAttestationSupported())
+                .that(isRemoteAttestationSupported())
                 .isTrue();
         File vendorDiskImage = new File("/vendor/etc/avf/microdroid/microdroid_vendor.img");
         assumeTrue("Microdroid vendor image doesn't exist, skip", vendorDiskImage.exists());