summaryrefslogtreecommitdiffstats
path: root/src/VBox/Frontends/VBoxHeadless/testcase
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-06 03:01:46 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-06 03:01:46 +0000
commitf8fe689a81f906d1b91bb3220acde2a4ecb14c5b (patch)
tree26484e9d7e2c67806c2d1760196ff01aaa858e8c /src/VBox/Frontends/VBoxHeadless/testcase
parentInitial commit. (diff)
downloadvirtualbox-f8fe689a81f906d1b91bb3220acde2a4ecb14c5b.tar.xz
virtualbox-f8fe689a81f906d1b91bb3220acde2a4ecb14c5b.zip
Adding upstream version 6.0.4-dfsg.upstream/6.0.4-dfsgupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/VBox/Frontends/VBoxHeadless/testcase')
-rw-r--r--src/VBox/Frontends/VBoxHeadless/testcase/Makefile.kmk28
-rw-r--r--src/VBox/Frontends/VBoxHeadless/testcase/tstHeadless.cpp207
2 files changed, 235 insertions, 0 deletions
diff --git a/src/VBox/Frontends/VBoxHeadless/testcase/Makefile.kmk b/src/VBox/Frontends/VBoxHeadless/testcase/Makefile.kmk
new file mode 100644
index 00000000..ce73da54
--- /dev/null
+++ b/src/VBox/Frontends/VBoxHeadless/testcase/Makefile.kmk
@@ -0,0 +1,28 @@
+# $Id: Makefile.kmk $
+## @file
+# Sub-Makefile for the VRDP (headless RDP server) frontend testcase.
+#
+
+#
+# Copyright (C) 2006-2019 Oracle Corporation
+#
+# This file is part of VirtualBox Open Source Edition (OSE), as
+# available from http://www.virtualbox.org. This file is free software;
+# you can redistribute it and/or modify it under the terms of the GNU
+# General Public License (GPL) as published by the Free Software
+# Foundation, in version 2 as it comes in the "COPYING" file of the
+# VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+# hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+#
+
+SUB_DEPTH = ../../../../..
+include $(KBUILD_PATH)/subheader.kmk
+
+ifdef VBOX_WITH_TESTCASES
+ PROGRAMS += tstHeadless
+ tstHeadless_TEMPLATE = VBOXMAINCLIENTTSTEXE
+ tstHeadless_SOURCES = tstHeadless.cpp
+endif
+
+include $(FILE_KBUILD_SUB_FOOTER)
+
diff --git a/src/VBox/Frontends/VBoxHeadless/testcase/tstHeadless.cpp b/src/VBox/Frontends/VBoxHeadless/testcase/tstHeadless.cpp
new file mode 100644
index 00000000..693ce227
--- /dev/null
+++ b/src/VBox/Frontends/VBoxHeadless/testcase/tstHeadless.cpp
@@ -0,0 +1,207 @@
+/** @file
+ *
+ * VBox frontends: VBoxHeadless frontend:
+ * Testcases
+ */
+
+/*
+ * Copyright (C) 2006-2019 Oracle Corporation
+ *
+ * This file is part of VirtualBox Open Source Edition (OSE), as
+ * available from http://www.virtualbox.org. This file is free software;
+ * you can redistribute it and/or modify it under the terms of the GNU
+ * General Public License (GPL) as published by the Free Software
+ * Foundation, in version 2 as it comes in the "COPYING" file of the
+ * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
+ * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
+ */
+
+#include <VBox/com/com.h>
+#include <VBox/com/string.h>
+#include <VBox/com/Guid.h>
+#include <VBox/com/ErrorInfo.h>
+#include <VBox/com/errorprint.h>
+
+#include <VBox/com/VirtualBox.h>
+
+using namespace com;
+
+#include <VBox/log.h>
+#include <iprt/initterm.h>
+#include <iprt/stream.h>
+
+
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Entry point.
+ */
+int main(int argc, char **argv)
+{
+ // initialize VBox Runtime
+ RTR3InitExe(argc, &argv, 0);
+
+ // the below cannot be Bstr because on Linux Bstr doesn't work
+ // until XPCOM (nsMemory) is initialized
+ const char *name = NULL;
+ const char *operation = NULL;
+
+ // parse the command line
+ if (argc > 1)
+ name = argv [1];
+ if (argc > 2)
+ operation = argv [2];
+
+ if (!name || !operation)
+ {
+ RTPrintf("\nUsage:\n\n"
+ "%s <machine_name> [on|off|pause|resume]\n\n",
+ argv [0]);
+ return 0;
+ }
+
+ RTPrintf("\n");
+ RTPrintf("tstHeadless STARTED.\n");
+
+ RTPrintf("VM name : {%s}\n"
+ "Operation : %s\n\n",
+ name, operation);
+
+ HRESULT rc;
+
+ rc = com::Initialize();
+ if (FAILED(rc))
+ {
+ RTPrintf("ERROR: failed to initialize COM!\n");
+ return rc;
+ }
+
+ do
+ {
+ ComPtr <IVirtualBoxClient> virtualBoxClient;
+ ComPtr <IVirtualBox> virtualBox;
+ ComPtr <ISession> session;
+
+ RTPrintf("Creating VirtualBox object...\n");
+ rc = virtualBoxClient.createInprocObject(CLSID_VirtualBoxClient);
+ if (SUCCEEDED(rc))
+ rc = virtualBoxClient->COMGETTER(VirtualBox)(virtualBox.asOutParam());
+ if (FAILED(rc))
+ RTPrintf("ERROR: failed to create the VirtualBox object!\n");
+ else
+ {
+ rc = session.createInprocObject(CLSID_Session);
+ if (FAILED(rc))
+ RTPrintf("ERROR: failed to create a session object!\n");
+ }
+
+ if (FAILED(rc))
+ {
+ com::ErrorInfo info;
+ if (!info.isFullAvailable() && !info.isBasicAvailable())
+ {
+ com::GluePrintRCMessage(rc);
+ RTPrintf("Most likely, the VirtualBox COM server is not running or failed to start.\n");
+ }
+ else
+ com::GluePrintErrorInfo(info);
+ break;
+ }
+
+ ComPtr <IMachine> m;
+
+ // find ID by name
+ CHECK_ERROR_BREAK(virtualBox, FindMachine(Bstr(name).raw(),
+ m.asOutParam()));
+
+ if (!strcmp(operation, "on"))
+ {
+ ComPtr <IProgress> progress;
+ RTPrintf("Opening a new (remote) session...\n");
+ CHECK_ERROR_BREAK(m,
+ LaunchVMProcess(session, Bstr("vrdp").raw(),
+ NULL, progress.asOutParam()));
+
+ RTPrintf("Waiting for the remote session to open...\n");
+ CHECK_ERROR_BREAK(progress, WaitForCompletion(-1));
+
+ BOOL completed;
+ CHECK_ERROR_BREAK(progress, COMGETTER(Completed)(&completed));
+ ASSERT(completed);
+
+ LONG resultCode;
+ CHECK_ERROR_BREAK(progress, COMGETTER(ResultCode)(&resultCode));
+ if (FAILED(resultCode))
+ {
+ ProgressErrorInfo info(progress);
+ com::GluePrintErrorInfo(info);
+ }
+ else
+ {
+ RTPrintf("Remote session has been successfully opened.\n");
+ }
+ }
+ else
+ {
+ RTPrintf("Opening an existing session...\n");
+ CHECK_ERROR_BREAK(m, LockMachine(session, LockType_Shared));
+
+ ComPtr <IConsole> console;
+ CHECK_ERROR_BREAK(session, COMGETTER(Console)(console.asOutParam()));
+
+ if (!strcmp(operation, "off"))
+ {
+ ComPtr <IProgress> progress;
+ RTPrintf("Powering the VM off...\n");
+ CHECK_ERROR_BREAK(console, PowerDown(progress.asOutParam()));
+
+ RTPrintf("Waiting for the VM to power down...\n");
+ CHECK_ERROR_BREAK(progress, WaitForCompletion(-1));
+
+ BOOL completed;
+ CHECK_ERROR_BREAK(progress, COMGETTER(Completed)(&completed));
+ ASSERT(completed);
+
+ LONG resultCode;
+ CHECK_ERROR_BREAK(progress, COMGETTER(ResultCode)(&resultCode));
+ if (FAILED(resultCode))
+ {
+ ProgressErrorInfo info(progress);
+ com::GluePrintErrorInfo(info);
+ }
+ else
+ {
+ RTPrintf("VM is powered down.\n");
+ }
+ }
+ else
+ if (!strcmp(operation, "pause"))
+ {
+ RTPrintf("Pausing the VM...\n");
+ CHECK_ERROR_BREAK(console, Pause());
+ }
+ else
+ if (!strcmp(operation, "resume"))
+ {
+ RTPrintf("Resuming the VM...\n");
+ CHECK_ERROR_BREAK(console, Resume());
+ }
+ else
+ {
+ RTPrintf("Invalid operation!\n");
+ }
+ }
+
+ RTPrintf("Closing the session (may fail after power off)...\n");
+ CHECK_ERROR(session, UnlockMachine());
+ }
+ while (0);
+ RTPrintf("\n");
+
+ com::Shutdown();
+
+ RTPrintf("tstHeadless FINISHED.\n");
+
+ return rc;
+}
+