Refactor testRpcBinderLatency

Use the runVmTestService helper method, report microseconds.

Test: atest MicrodroidBenchmarkApp
Change-Id: I0137f5140144e38ae668bcd8b7a9ee4d161ad99b
diff --git a/tests/aidl/com/android/microdroid/testservice/IBenchmarkService.aidl b/tests/aidl/com/android/microdroid/testservice/IBenchmarkService.aidl
index 1eda67e..c8c8660 100644
--- a/tests/aidl/com/android/microdroid/testservice/IBenchmarkService.aidl
+++ b/tests/aidl/com/android/microdroid/testservice/IBenchmarkService.aidl
@@ -41,7 +41,4 @@
 
     /** Runs the vsock server on VM and receives data. */
     void runVsockServerAndReceiveData(int serverFd, int numBytesToReceive);
-
-    /** Adds two numbers and returns the result. */
-    int add(int a, int b);
 }
diff --git a/tests/benchmark/Android.bp b/tests/benchmark/Android.bp
index 9d2b6c7..dac4993 100644
--- a/tests/benchmark/Android.bp
+++ b/tests/benchmark/Android.bp
@@ -19,6 +19,7 @@
     jni_libs: [
         "MicrodroidBenchmarkNativeLib",
         "MicrodroidIdleNativeLib",
+        "MicrodroidTestNativeLib",
         "libiovsock_host_jni",
     ],
     jni_uses_platform_apis: true,
diff --git a/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java b/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
index fd0158b..612b1ae 100644
--- a/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
+++ b/tests/benchmark/src/java/com/android/microdroid/benchmark/MicrodroidBenchmarks.java
@@ -57,7 +57,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.OptionalLong;
-import java.util.Random;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Function;
 
@@ -72,7 +71,8 @@
 
     private static final String APEX_ETC_FS = "/apex/com.android.virt/etc/fs/";
     private static final double SIZE_MB = 1024.0 * 1024.0;
-    private static final double NANO_TO_MILLI = 1000000.0;
+    private static final double NANO_TO_MILLI = 1_000_000.0;
+    private static final double NANO_TO_MICRO = 1_000.0;
     private static final String MICRODROID_IMG_PREFIX = "microdroid_";
     private static final String MICRODROID_IMG_SUFFIX = ".img";
 
@@ -569,64 +569,51 @@
     }
 
     @Test
-    public void testVsockRpcBinderLatency() throws Exception {
+    public void testRpcBinderLatency() throws Exception {
+        final int NUM_WARMUPS = 10;
+        final int NUM_REQUESTS = 10_000;
+
         VirtualMachineConfig config =
                 newVmConfigBuilder()
-                        .setPayloadConfigPath("assets/vm_config_io.json")
+                        .setPayloadBinaryName("MicrodroidTestNativeLib.so")
                         .setDebugLevel(DEBUG_LEVEL_NONE)
                         .build();
 
-        List<Double> requestLatencies = new ArrayList<>(IO_TEST_TRIAL_COUNT);
+        List<Double> requestLatencies = new ArrayList<>(IO_TEST_TRIAL_COUNT * NUM_REQUESTS);
         for (int i = 0; i < IO_TEST_TRIAL_COUNT; ++i) {
-            String vmName = "test_vm_request_" + i;
-            VirtualMachine vm = forceCreateNewVirtualMachine(vmName, config);
-            BenchmarkVmListener.create(new VsockRpcBinderLatencyListener(requestLatencies))
-                    .runToFinish(TAG, vm);
-        }
-        reportMetrics(requestLatencies, "vsock/rpcbinder/request_latency", "ms");
-    }
+            VirtualMachine vm = forceCreateNewVirtualMachine("test_vm_latency" + i, config);
+            TestResults testResults =
+                    runVmTestService(
+                            TAG,
+                            vm,
+                            (ts, tr) -> {
+                                // Correctness check
+                                tr.mAddInteger = ts.addInteger(123, 456);
 
-    private static class VsockRpcBinderLatencyListener
-            implements BenchmarkVmListener.InnerListener {
-        private static final int NUM_REQUESTS = 10000;
-        private static final int NUM_WARMUP_REQUESTS = 10;
+                                // Warmup
+                                for (int j = 0; j < NUM_WARMUPS; j++) {
+                                    ts.addInteger(j, j + 1);
+                                }
 
-        private final List<Double> mResults;
-
-        VsockRpcBinderLatencyListener(List<Double> results) {
-            mResults = results;
-        }
-
-        @Override
-        public void onPayloadReady(VirtualMachine vm, IBenchmarkService benchmarkService)
-                throws RemoteException {
-            // Warm up a few times.
-            Random rand = new Random();
-            for (int i = 0; i < NUM_WARMUP_REQUESTS; i++) {
-                int a = rand.nextInt();
-                int b = rand.nextInt();
-                int c = benchmarkService.add(a, b);
-                assertThat(c).isEqualTo(a + b);
-            }
-
-            // Use the VM to compute Fibonnacci numbers, save timestamps between requests.
-            int a = 0;
-            int b = 1;
-            int c;
-            long timestamps[] = new long[NUM_REQUESTS + 1];
-            for (int i = 0; i < NUM_REQUESTS; i++) {
-                timestamps[i] = System.nanoTime();
-                c = benchmarkService.add(a, b);
-                a = b;
-                b = c;
-            }
-            timestamps[NUM_REQUESTS] = System.nanoTime();
-
-            // Log individual request latencies.
-            for (int i = 0; i < NUM_REQUESTS; i++) {
-                long diff = timestamps[i + 1] - timestamps[i];
-                mResults.add((double) diff / NANO_TO_MILLI);
+                                // Count Fibonacci numbers, measure latency.
+                                int a = 0;
+                                int b = 1;
+                                int c;
+                                tr.mTimings = new long[NUM_REQUESTS];
+                                for (int j = 0; j < NUM_REQUESTS; j++) {
+                                    long start = System.nanoTime();
+                                    c = ts.addInteger(a, b);
+                                    tr.mTimings[j] = System.nanoTime() - start;
+                                    a = b;
+                                    b = c;
+                                }
+                            });
+            testResults.assertNoException();
+            assertThat(testResults.mAddInteger).isEqualTo(579);
+            for (long duration : testResults.mTimings) {
+                requestLatencies.add((double) duration / NANO_TO_MICRO);
             }
         }
+        reportMetrics(requestLatencies, "latency/rpcbinder", "us");
     }
 }
diff --git a/tests/benchmark/src/native/benchmarkbinary.cpp b/tests/benchmark/src/native/benchmarkbinary.cpp
index 022698f..6cfc71d 100644
--- a/tests/benchmark/src/native/benchmarkbinary.cpp
+++ b/tests/benchmark/src/native/benchmarkbinary.cpp
@@ -96,11 +96,6 @@
         return resultStatus(res);
     }
 
-    ndk::ScopedAStatus add(int32_t a, int32_t b, int32_t* out) override {
-        *out = a + b;
-        return ndk::ScopedAStatus::ok();
-    }
-
 private:
     /**
      * Measures the read rate for reading the given file.