Use Virt Manager for test

Bug: 171278952
Test: atest VirtualizationHostTestCases
Change-Id: Ib603194acb90d4e0952cf276c136efd246d0ce31
diff --git a/tests/hostside/native/vsock/Android.bp b/tests/hostside/native/vsock/Android.bp
index 13b46d5..966bc04 100644
--- a/tests/hostside/native/vsock/Android.bp
+++ b/tests/hostside/native/vsock/Android.bp
@@ -19,11 +19,13 @@
 cc_test {
     name: "virt_hostside_tests_vsock_server",
     srcs: ["server.cc"],
-    static_libs: [
+    shared_libs: [
+        "android.system.virtmanager-cpp",
         "libbase",
+        "libbinder",
         "liblog",
+        "libutils",
     ],
-    static_executable: true,
     test_suites: ["device-tests"],
 }
 
diff --git a/tests/hostside/native/vsock/server.cc b/tests/hostside/native/vsock/server.cc
index d4a99d2..1a1aa37 100644
--- a/tests/hostside/native/vsock/server.cc
+++ b/tests/hostside/native/vsock/server.cc
@@ -26,15 +26,21 @@
 #include "android-base/logging.h"
 #include "android-base/parseint.h"
 #include "android-base/unique_fd.h"
+#include "android/system/virtmanager/IVirtManager.h"
+#include "android/system/virtmanager/IVirtualMachine.h"
+#include "binder/IServiceManager.h"
 
+using namespace android;
 using namespace android::base;
+using namespace android::system::virtmanager;
 
 int main(int argc, const char *argv[]) {
     unsigned int port;
-    if (argc != 2 || !ParseUint(argv[1], &port)) {
-        LOG(ERROR) << "Usage: " << argv[0] << " <port>";
+    if (argc != 3 || !ParseUint(argv[1], &port)) {
+        LOG(ERROR) << "Usage: " << argv[0] << " <port> <vm_config.json>";
         return EXIT_FAILURE;
     }
+    String16 vm_config(argv[2]);
 
     unique_fd server_fd(TEMP_FAILURE_RETRY(socket(AF_VSOCK, SOCK_STREAM, 0)));
     if (server_fd < 0) {
@@ -61,6 +67,27 @@
         return EXIT_FAILURE;
     }
 
+    LOG(INFO) << "Getting Virt Manager";
+    sp<IVirtManager> virt_manager;
+    status_t err = getService<IVirtManager>(String16("android.system.virtmanager"), &virt_manager);
+    if (err != 0) {
+        LOG(ERROR) << "Error getting Virt Manager from Service Manager: " << err;
+        return EXIT_FAILURE;
+    }
+    sp<IVirtualMachine> vm;
+    binder::Status status = virt_manager->startVm(vm_config, &vm);
+    if (!status.isOk()) {
+        LOG(ERROR) << "Error starting VM: " << status;
+        return EXIT_FAILURE;
+    }
+    int32_t cid;
+    status = vm->getCid(&cid);
+    if (!status.isOk()) {
+        LOG(ERROR) << "Error getting CID: " << status;
+        return EXIT_FAILURE;
+    }
+    LOG(INFO) << "VM starting with CID " << cid;
+
     LOG(INFO) << "Accepting connection...";
     struct sockaddr_vm client_sa;
     socklen_t client_sa_len = sizeof(client_sa);