This patch exports a few utility functions and adds testing of shutdown
commands of the guest agent.
---
tests/qemuagenttest.c | 119 +++++++++++++++++++++++++++++++++++++++++++
tests/qemumonitortestutils.c | 21 ++++----
tests/qemumonitortestutils.h | 28 ++++++++--
3 files changed, 153 insertions(+), 15 deletions(-)
diff --git a/tests/qemuagenttest.c b/tests/qemuagenttest.c
index d0b450e..e314bb0 100644
--- a/tests/qemuagenttest.c
+++ b/tests/qemuagenttest.c
@@ -207,6 +207,124 @@ cleanup:
}
+struct qemuAgentShutdownTestData {
+ const char *mode;
+ qemuAgentEvent event;
+};
+
+
+static int
+qemuAgentShutdownTestMonitorHandler(qemuMonitorTestPtr test,
+ qemuMonitorTestItemPtr item,
+ const char *cmdstr)
+{
+ struct qemuAgentShutdownTestData *data;
+ virJSONValuePtr val = NULL;
+ virJSONValuePtr args;
+ const char *cmdname;
+ const char *mode;
+ int ret = -1;
+
+ data = qemuMonitorTestItemGetPrivateData(item);
+
+ if (!(val = virJSONValueFromString(cmdstr)))
+ return -1;
+
+ if (!(cmdname = virJSONValueObjectGetString(val, "execute"))) {
+ ret = qemuMonitorReportError(test, "Missing command name in %s",
cmdstr);
+ goto cleanup;
+ }
+
+ if (STRNEQ(cmdname, "guest-shutdown")) {
+ ret = qemuMonitorTestAddUnexpectedErrorResponse(test);
+ goto cleanup;
+ }
+
+ if (!(args = virJSONValueObjectGet(val, "arguments"))) {
+ ret = qemuMonitorReportError(test,
+ "Missing arguments section");
+ goto cleanup;
+ }
+
+ if (!(mode = virJSONValueObjectGetString(args, "mode"))) {
+ ret = qemuMonitorReportError(test, "Missing shutdown mode");
+ goto cleanup;
+ }
+
+ /* now don't reply but return a qemu agent event */
+ qemuAgentNotifyEvent(qemuMonitorTestGetAgent(test),
+ data->event);
+
+ ret = 0;
+
+cleanup:
+ virJSONValueFree(val);
+ return ret;
+
+}
+
+
+static int
+testQemuAgentShutdown(const void *data)
+{
+ virDomainXMLOptionPtr xmlopt = (virDomainXMLOptionPtr)data;
+ qemuMonitorTestPtr test = qemuMonitorTestNewAgent(xmlopt);
+ struct qemuAgentShutdownTestData priv;
+ int ret = -1;
+
+ if (!test)
+ return -1;
+
+ if (qemuMonitorTestAddAgentSyncResponse(test) < 0)
+ goto cleanup;
+
+ priv.event = QEMU_AGENT_EVENT_SHUTDOWN;
+ priv.mode = "shutdown";
+
+ if (qemuMonitorTestAddHandler(test, qemuAgentShutdownTestMonitorHandler,
+ &priv, NULL) < 0)
+ goto cleanup;
+
+ if (qemuAgentShutdown(qemuMonitorTestGetAgent(test),
+ QEMU_AGENT_SHUTDOWN_HALT) < 0)
+ goto cleanup;
+
+ if (qemuMonitorTestAddAgentSyncResponse(test) < 0)
+ goto cleanup;
+
+ priv.event = QEMU_AGENT_EVENT_SHUTDOWN;
+ priv.mode = "powerdown";
+
+ if (qemuMonitorTestAddHandler(test, qemuAgentShutdownTestMonitorHandler,
+ &priv, NULL) < 0)
+ goto cleanup;
+
+ if (qemuAgentShutdown(qemuMonitorTestGetAgent(test),
+ QEMU_AGENT_SHUTDOWN_POWERDOWN) < 0)
+ goto cleanup;
+
+ if (qemuMonitorTestAddAgentSyncResponse(test) < 0)
+ goto cleanup;
+
+ priv.event = QEMU_AGENT_EVENT_RESET;
+ priv.mode = "reboot";
+
+ if (qemuMonitorTestAddHandler(test, qemuAgentShutdownTestMonitorHandler,
+ &priv, NULL) < 0)
+ goto cleanup;
+
+ if (qemuAgentShutdown(qemuMonitorTestGetAgent(test),
+ QEMU_AGENT_SHUTDOWN_REBOOT) < 0)
+ goto cleanup;
+
+ ret = 0;
+
+cleanup:
+ qemuMonitorTestFree(test);
+ return ret;
+}
+
+
static int
mymain(void)
{
@@ -232,6 +350,7 @@ mymain(void)
DO_TEST(FSThaw);
DO_TEST(FSTrim);
DO_TEST(Suspend);
+ DO_TEST(Shutdown);
virObjectUnref(xmlopt);
diff --git a/tests/qemumonitortestutils.c b/tests/qemumonitortestutils.c
index f383915..32217a3 100644
--- a/tests/qemumonitortestutils.c
+++ b/tests/qemumonitortestutils.c
@@ -37,12 +37,6 @@
#define VIR_FROM_THIS VIR_FROM_NONE
-typedef struct _qemuMonitorTestItem qemuMonitorTestItem;
-typedef qemuMonitorTestItem *qemuMonitorTestItemPtr;
-typedef int (*qemuMonitorTestResponseCallback)(qemuMonitorTestPtr test,
- qemuMonitorTestItemPtr item,
- const char *message);
-
struct _qemuMonitorTestItem {
qemuMonitorTestResponseCallback cb;
void *opaque;
@@ -96,7 +90,7 @@ qemuMonitorTestItemFree(qemuMonitorTestItemPtr item)
/*
* Appends data for a reply to the outgoing buffer
*/
-static int
+int
qemuMonitorTestAddReponse(qemuMonitorTestPtr test,
const char *response)
{
@@ -119,7 +113,7 @@ qemuMonitorTestAddReponse(qemuMonitorTestPtr test,
}
-static int
+int
qemuMonitorTestAddUnexpectedErrorResponse(qemuMonitorTestPtr test)
{
if (test->agent || test->json) {
@@ -133,7 +127,7 @@ qemuMonitorTestAddUnexpectedErrorResponse(qemuMonitorTestPtr test)
}
-static int
+int
qemuMonitorReportError(qemuMonitorTestPtr test, const char *errmsg, ...)
{
va_list msgargs;
@@ -167,7 +161,6 @@ cleanup:
}
-
static int
qemuMonitorTestProcessCommand(qemuMonitorTestPtr test,
const char *cmdstr)
@@ -383,7 +376,7 @@ qemuMonitorTestFree(qemuMonitorTestPtr test)
}
-static int
+int
qemuMonitorTestAddHandler(qemuMonitorTestPtr test,
qemuMonitorTestResponseCallback cb,
void *opaque,
@@ -414,6 +407,12 @@ error:
return -1;
}
+void *
+qemuMonitorTestItemGetPrivateData(qemuMonitorTestItemPtr item)
+{
+ return item ? item->opaque : NULL;
+}
+
typedef struct _qemuMonitorTestCommandArgs qemuMonitorTestCommandArgs;
typedef qemuMonitorTestCommandArgs *qemuMonitorTestCommandArgsPtr;
diff --git a/tests/qemumonitortestutils.h b/tests/qemumonitortestutils.h
index 5ec5707..845f567 100644
--- a/tests/qemumonitortestutils.h
+++ b/tests/qemumonitortestutils.h
@@ -27,10 +27,30 @@
typedef struct _qemuMonitorTest qemuMonitorTest;
typedef qemuMonitorTest *qemuMonitorTestPtr;
-int
-qemuMonitorTestAddItem(qemuMonitorTestPtr test,
- const char *command_name,
- const char *response);
+typedef struct _qemuMonitorTestItem qemuMonitorTestItem;
+typedef qemuMonitorTestItem *qemuMonitorTestItemPtr;
+typedef int (*qemuMonitorTestResponseCallback)(qemuMonitorTestPtr test,
+ qemuMonitorTestItemPtr item,
+ const char *message);
+
+int qemuMonitorTestAddHandler(qemuMonitorTestPtr test,
+ qemuMonitorTestResponseCallback cb,
+ void *opaque,
+ virFreeCallback freecb);
+
+int qemuMonitorTestAddReponse(qemuMonitorTestPtr test,
+ const char *response);
+
+int qemuMonitorTestAddUnexpectedErrorResponse(qemuMonitorTestPtr test);
+
+int qemuMonitorReportError(qemuMonitorTestPtr test, const char *errmsg, ...);
+
+void *qemuMonitorTestItemGetPrivateData(qemuMonitorTestItemPtr item);
+
+
+int qemuMonitorTestAddItem(qemuMonitorTestPtr test,
+ const char *command_name,
+ const char *response);
int qemuMonitorTestAddAgentSyncResponse(qemuMonitorTestPtr test);
--
1.8.3.2