]> xenbits.xensource.com Git - people/iwj/qemu.git/commitdiff
qapi: Rename generated qmp-marshal.c to qmp-commands.c
authorMarkus Armbruster <armbru@redhat.com>
Sun, 11 Feb 2018 09:35:56 +0000 (10:35 +0100)
committerEric Blake <eblake@redhat.com>
Fri, 2 Mar 2018 19:14:10 +0000 (13:14 -0600)
All generated .c are named like their .h, except for qmp-marshal.c and
qmp-commands.h.  To add to the confusion, tests-qmp-commands.c falsely
matches generated test-qmp-commands.h.

Get rid of this unnecessary complication.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Message-Id: <20180211093607.27351-19-armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
.gitignore
Makefile
Makefile.objs
docs/devel/qapi-code-gen.txt
qga/Makefile.objs
scripts/qapi/commands.py
tests/.gitignore
tests/Makefile.include
tests/test-qmp-cmds.c [new file with mode: 0644]
tests/test-qmp-commands.c [deleted file]

index 2f9a92f6cc92c150b6cbdcb07ee7657396c2f9ca..7d783e6e66b06e890e57df51a53eb1b33d398cfe 100644 (file)
@@ -33,9 +33,8 @@
 /qapi-visit.[ch]
 /qapi-event.[ch]
 /qapi-doc.texi
-/qmp-commands.h
+/qmp-commands.[ch]
 /qmp-introspect.[ch]
-/qmp-marshal.c
 /qemu-doc.html
 /qemu-doc.info
 /qemu-doc.txt
index 53c7dc5d19e1aeeece9da67d98fefaf13ca98024..b9f320f6ba725237e8110688021ef5e718746de5 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -91,7 +91,7 @@ include $(SRC_PATH)/rules.mak
 
 GENERATED_FILES = qemu-version.h config-host.h qemu-options.def
 GENERATED_FILES += qmp-commands.h qapi-types.h qapi-visit.h qapi-event.h
-GENERATED_FILES += qmp-marshal.c qapi-types.c qapi-visit.c qapi-event.c
+GENERATED_FILES += qmp-commands.c qapi-types.c qapi-visit.c qapi-event.c
 GENERATED_FILES += qmp-introspect.h
 GENERATED_FILES += qmp-introspect.c
 GENERATED_FILES += qapi-doc.texi
@@ -495,7 +495,7 @@ $(SRC_PATH)/scripts/qapi-gen.py
 
 qga/qapi-generated/qga-qapi-types.c qga/qapi-generated/qga-qapi-types.h \
 qga/qapi-generated/qga-qapi-visit.c qga/qapi-generated/qga-qapi-visit.h \
-qga/qapi-generated/qga-qmp-commands.h qga/qapi-generated/qga-qmp-marshal.c \
+qga/qapi-generated/qga-qmp-commands.h qga/qapi-generated/qga-qmp-commands.c \
 qga/qapi-generated/qga-qapi-doc.texi: \
 qga/qapi-generated/qapi-gen-timestamp ;
 qga/qapi-generated/qapi-gen-timestamp: $(SRC_PATH)/qga/qapi-schema.json $(qapi-py)
@@ -521,7 +521,7 @@ qapi-modules = $(SRC_PATH)/qapi-schema.json $(SRC_PATH)/qapi/common.json \
 
 qapi-types.c qapi-types.h \
 qapi-visit.c qapi-visit.h \
-qmp-commands.h qmp-marshal.c \
+qmp-commands.h qmp-commands.c \
 qapi-event.c qapi-event.h \
 qmp-introspect.h qmp-introspect.c \
 qapi-doc.texi: \
index 5dc134818c9706bf94fe96a6f1eb9a8ebdecbc81..7aa67d89f8ec8e0b76ed342048000dd8ac2aacfb 100644 (file)
@@ -78,7 +78,7 @@ common-obj-$(CONFIG_FDT) += device_tree.o
 ######################################################################
 # qapi
 
-common-obj-y += qmp-marshal.o
+common-obj-y += qmp-commands.o
 common-obj-y += qmp-introspect.o
 common-obj-y += qmp.o hmp.o
 endif
index a525ef369f42a9fcf172bc6e8945203032d15f63..c86792add2e2958e2b2ba03df4353c2188071f98 100644 (file)
@@ -1147,8 +1147,8 @@ declares qmp_COMMAND() that the user must implement.
 
 The following files are generated:
 
-$(prefix)qmp-marshal.c: Command marshal/dispatch functions for each
-                        QMP command defined in the schema
+$(prefix)qmp-commands.c: Command marshal/dispatch functions for each
+                         QMP command defined in the schema
 
 $(prefix)qmp-commands.h: Function prototypes for the QMP commands
                          specified in the schema
@@ -1170,7 +1170,7 @@ Example:
     void qmp_marshal_my_command(QDict *args, QObject **ret, Error **errp);
 
     #endif
-    $ cat qapi-generated/example-qmp-marshal.c
+    $ cat qapi-generated/example-qmp-commands.c
 [Uninteresting stuff omitted...]
 
     static void qmp_marshal_output_UserDefOne(UserDefOne *ret_in, QObject **ret_out, Error **errp)
index 1c5986c0bb591f15a582571a8143ef9b2665fab5..6151378ae42e8a6230aa633878c22e65699afe7a 100644 (file)
@@ -3,6 +3,6 @@ qga-obj-$(CONFIG_POSIX) += commands-posix.o channel-posix.o
 qga-obj-$(CONFIG_WIN32) += commands-win32.o channel-win32.o service-win32.o
 qga-obj-$(CONFIG_WIN32) += vss-win32.o
 qga-obj-y += qapi-generated/qga-qapi-types.o qapi-generated/qga-qapi-visit.o
-qga-obj-y += qapi-generated/qga-qmp-marshal.o
+qga-obj-y += qapi-generated/qga-qmp-commands.o
 
 qga-vss-dll-obj-$(CONFIG_QGA_VSS) += vss-win32/
index a744611d58060dc68ae44c08cb834d007bbfddd7..05fe33a03bc0e0b35e834b5453099ee89365beab 100644 (file)
@@ -289,5 +289,5 @@ void %(c_prefix)sqmp_init_marshal(QmpCommandList *cmds);
     schema.visit(vis)
     genc.add(vis.defn)
     genh.add(vis.decl)
-    genc.write(output_dir, prefix + 'qmp-marshal.c')
+    genc.write(output_dir, prefix + 'qmp-commands.c')
     genh.write(output_dir, prefix + 'qmp-commands.h')
index e5c744b7ed6c51618c4b5a4536afde3a388d25b0..2629cfc2f98c961d93609183c629dd8daa69025e 100644 (file)
@@ -70,13 +70,12 @@ test-qdist
 test-qga
 test-qht
 test-qht-par
-test-qmp-commands
-test-qmp-commands.h
+test-qmp-cmds
+test-qmp-commands.[ch]
 test-qmp-event
 test-qobject-input-strict
 test-qobject-input-visitor
 test-qmp-introspect.[ch]
-test-qmp-marshal.c
 test-qobject-output-visitor
 test-rcu-list
 test-replication
index 5b0de3768542aec555abc920af99605913825bbf..2de46f8acb75b4205aa38ab9a057350e1cabe905 100644 (file)
@@ -61,8 +61,8 @@ check-unit-y += tests/test-clone-visitor$(EXESUF)
 gcov-files-test-clone-visitor-y = qapi/qapi-clone-visitor.c
 check-unit-y += tests/test-qobject-input-visitor$(EXESUF)
 gcov-files-test-qobject-input-visitor-y = qapi/qobject-input-visitor.c
-check-unit-y += tests/test-qmp-commands$(EXESUF)
-gcov-files-test-qmp-commands-y = qapi/qmp-dispatch.c
+check-unit-y += tests/test-qmp-cmds$(EXESUF)
+gcov-files-test-qmp-cmds-y = qapi/qmp-dispatch.c
 check-unit-y += tests/test-string-input-visitor$(EXESUF)
 gcov-files-test-string-input-visitor-y = qapi/string-input-visitor.c
 check-unit-y += tests/test-string-output-visitor$(EXESUF)
@@ -580,7 +580,7 @@ test-obj-y = tests/check-qnum.o tests/check-qstring.o tests/check-qdict.o \
        tests/test-string-input-visitor.o tests/test-qobject-output-visitor.o \
        tests/test-clone-visitor.o \
        tests/test-qobject-input-visitor.o \
-       tests/test-qmp-commands.o tests/test-visitor-serialization.o \
+       tests/test-qmp-cmds.o tests/test-visitor-serialization.o \
        tests/test-x86-cpuid.o tests/test-mul64.o tests/test-int128.o \
        tests/test-opts-visitor.o tests/test-qmp-event.o \
        tests/rcutorture.o tests/test-rcu-list.o \
@@ -660,7 +660,7 @@ tests/test-replication$(EXESUF): tests/test-replication.o $(test-util-obj-y) \
 
 tests/test-qapi-types.c tests/test-qapi-types.h \
 tests/test-qapi-visit.c tests/test-qapi-visit.h \
-tests/test-qmp-commands.h tests/test-qmp-marshal.c \
+tests/test-qmp-commands.h tests/test-qmp-commands.c \
 tests/test-qapi-event.c tests/test-qapi-event.h \
 tests/test-qmp-introspect.c tests/test-qmp-introspect.h: \
 tests/test-qapi-gen-timestamp ;
@@ -683,7 +683,7 @@ tests/test-qmp-event$(EXESUF): tests/test-qmp-event.o $(test-qapi-obj-y)
 tests/test-qobject-output-visitor$(EXESUF): tests/test-qobject-output-visitor.o $(test-qapi-obj-y)
 tests/test-clone-visitor$(EXESUF): tests/test-clone-visitor.o $(test-qapi-obj-y)
 tests/test-qobject-input-visitor$(EXESUF): tests/test-qobject-input-visitor.o $(test-qapi-obj-y)
-tests/test-qmp-commands$(EXESUF): tests/test-qmp-commands.o tests/test-qmp-marshal.o $(test-qapi-obj-y)
+tests/test-qmp-cmds$(EXESUF): tests/test-qmp-cmds.o tests/test-qmp-commands.o $(test-qapi-obj-y)
 tests/test-visitor-serialization$(EXESUF): tests/test-visitor-serialization.o $(test-qapi-obj-y)
 tests/test-opts-visitor$(EXESUF): tests/test-opts-visitor.o $(test-qapi-obj-y)
 
diff --git a/tests/test-qmp-cmds.c b/tests/test-qmp-cmds.c
new file mode 100644 (file)
index 0000000..24660d0
--- /dev/null
@@ -0,0 +1,286 @@
+#include "qemu/osdep.h"
+#include "qemu-common.h"
+#include "qapi/qmp/qdict.h"
+#include "qapi/qmp/qnum.h"
+#include "qapi/qmp/qstring.h"
+#include "test-qmp-commands.h"
+#include "qapi/error.h"
+#include "qemu/module.h"
+#include "qapi/qobject-input-visitor.h"
+#include "tests/test-qapi-types.h"
+#include "tests/test-qapi-visit.h"
+
+static QmpCommandList qmp_commands;
+
+void qmp_user_def_cmd(Error **errp)
+{
+}
+
+Empty2 *qmp_user_def_cmd0(Error **errp)
+{
+    return g_new0(Empty2, 1);
+}
+
+void qmp_user_def_cmd1(UserDefOne * ud1, Error **errp)
+{
+}
+
+UserDefTwo *qmp_user_def_cmd2(UserDefOne *ud1a,
+                              bool has_udb1, UserDefOne *ud1b,
+                              Error **errp)
+{
+    UserDefTwo *ret;
+    UserDefOne *ud1c = g_malloc0(sizeof(UserDefOne));
+    UserDefOne *ud1d = g_malloc0(sizeof(UserDefOne));
+
+    ud1c->string = strdup(ud1a->string);
+    ud1c->integer = ud1a->integer;
+    ud1d->string = strdup(has_udb1 ? ud1b->string : "blah0");
+    ud1d->integer = has_udb1 ? ud1b->integer : 0;
+
+    ret = g_new0(UserDefTwo, 1);
+    ret->string0 = strdup("blah1");
+    ret->dict1 = g_new0(UserDefTwoDict, 1);
+    ret->dict1->string1 = strdup("blah2");
+    ret->dict1->dict2 = g_new0(UserDefTwoDictDict, 1);
+    ret->dict1->dict2->userdef = ud1c;
+    ret->dict1->dict2->string = strdup("blah3");
+    ret->dict1->dict3 = g_new0(UserDefTwoDictDict, 1);
+    ret->dict1->has_dict3 = true;
+    ret->dict1->dict3->userdef = ud1d;
+    ret->dict1->dict3->string = strdup("blah4");
+
+    return ret;
+}
+
+int64_t qmp_guest_get_time(int64_t a, bool has_b, int64_t b, Error **errp)
+{
+    return a + (has_b ? b : 0);
+}
+
+QObject *qmp_guest_sync(QObject *arg, Error **errp)
+{
+    return arg;
+}
+
+void qmp_boxed_struct(UserDefZero *arg, Error **errp)
+{
+}
+
+void qmp_boxed_union(UserDefNativeListUnion *arg, Error **errp)
+{
+}
+
+__org_qemu_x_Union1 *qmp___org_qemu_x_command(__org_qemu_x_EnumList *a,
+                                              __org_qemu_x_StructList *b,
+                                              __org_qemu_x_Union2 *c,
+                                              __org_qemu_x_Alt *d,
+                                              Error **errp)
+{
+    __org_qemu_x_Union1 *ret = g_new0(__org_qemu_x_Union1, 1);
+
+    ret->type = ORG_QEMU_X_UNION1_KIND___ORG_QEMU_X_BRANCH;
+    ret->u.__org_qemu_x_branch.data = strdup("blah1");
+
+    /* Also test that 'wchar-t' was munged to 'q_wchar_t' */
+    if (b && b->value && !b->value->has_q_wchar_t) {
+        b->value->q_wchar_t = 1;
+    }
+    return ret;
+}
+
+
+/* test commands with no input and no return value */
+static void test_dispatch_cmd(void)
+{
+    QDict *req = qdict_new();
+    QObject *resp;
+
+    qdict_put_str(req, "execute", "user_def_cmd");
+
+    resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
+    assert(resp != NULL);
+    assert(!qdict_haskey(qobject_to_qdict(resp), "error"));
+
+    qobject_decref(resp);
+    QDECREF(req);
+}
+
+/* test commands that return an error due to invalid parameters */
+static void test_dispatch_cmd_failure(void)
+{
+    QDict *req = qdict_new();
+    QDict *args = qdict_new();
+    QObject *resp;
+
+    qdict_put_str(req, "execute", "user_def_cmd2");
+
+    resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
+    assert(resp != NULL);
+    assert(qdict_haskey(qobject_to_qdict(resp), "error"));
+
+    qobject_decref(resp);
+    QDECREF(req);
+
+    /* check that with extra arguments it throws an error */
+    req = qdict_new();
+    qdict_put_int(args, "a", 66);
+    qdict_put(req, "arguments", args);
+
+    qdict_put_str(req, "execute", "user_def_cmd");
+
+    resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
+    assert(resp != NULL);
+    assert(qdict_haskey(qobject_to_qdict(resp), "error"));
+
+    qobject_decref(resp);
+    QDECREF(req);
+}
+
+static QObject *test_qmp_dispatch(QDict *req)
+{
+    QObject *resp_obj;
+    QDict *resp;
+    QObject *ret;
+
+    resp_obj = qmp_dispatch(&qmp_commands, QOBJECT(req));
+    assert(resp_obj);
+    resp = qobject_to_qdict(resp_obj);
+    assert(resp && !qdict_haskey(resp, "error"));
+    ret = qdict_get(resp, "return");
+    assert(ret);
+    qobject_incref(ret);
+    qobject_decref(resp_obj);
+    return ret;
+}
+
+/* test commands that involve both input parameters and return values */
+static void test_dispatch_cmd_io(void)
+{
+    QDict *req = qdict_new();
+    QDict *args = qdict_new();
+    QDict *args3 = qdict_new();
+    QDict *ud1a = qdict_new();
+    QDict *ud1b = qdict_new();
+    QDict *ret, *ret_dict, *ret_dict_dict, *ret_dict_dict_userdef;
+    QDict *ret_dict_dict2, *ret_dict_dict2_userdef;
+    QNum *ret3;
+    int64_t val;
+
+    qdict_put_int(ud1a, "integer", 42);
+    qdict_put_str(ud1a, "string", "hello");
+    qdict_put_int(ud1b, "integer", 422);
+    qdict_put_str(ud1b, "string", "hello2");
+    qdict_put(args, "ud1a", ud1a);
+    qdict_put(args, "ud1b", ud1b);
+    qdict_put(req, "arguments", args);
+    qdict_put_str(req, "execute", "user_def_cmd2");
+
+    ret = qobject_to_qdict(test_qmp_dispatch(req));
+
+    assert(!strcmp(qdict_get_str(ret, "string0"), "blah1"));
+    ret_dict = qdict_get_qdict(ret, "dict1");
+    assert(!strcmp(qdict_get_str(ret_dict, "string1"), "blah2"));
+    ret_dict_dict = qdict_get_qdict(ret_dict, "dict2");
+    ret_dict_dict_userdef = qdict_get_qdict(ret_dict_dict, "userdef");
+    assert(qdict_get_int(ret_dict_dict_userdef, "integer") == 42);
+    assert(!strcmp(qdict_get_str(ret_dict_dict_userdef, "string"), "hello"));
+    assert(!strcmp(qdict_get_str(ret_dict_dict, "string"), "blah3"));
+    ret_dict_dict2 = qdict_get_qdict(ret_dict, "dict3");
+    ret_dict_dict2_userdef = qdict_get_qdict(ret_dict_dict2, "userdef");
+    assert(qdict_get_int(ret_dict_dict2_userdef, "integer") == 422);
+    assert(!strcmp(qdict_get_str(ret_dict_dict2_userdef, "string"), "hello2"));
+    assert(!strcmp(qdict_get_str(ret_dict_dict2, "string"), "blah4"));
+    QDECREF(ret);
+
+    qdict_put_int(args3, "a", 66);
+    qdict_put(req, "arguments", args3);
+    qdict_put_str(req, "execute", "guest-get-time");
+
+    ret3 = qobject_to_qnum(test_qmp_dispatch(req));
+    g_assert(qnum_get_try_int(ret3, &val));
+    g_assert_cmpint(val, ==, 66);
+    QDECREF(ret3);
+
+    QDECREF(req);
+}
+
+/* test generated dealloc functions for generated types */
+static void test_dealloc_types(void)
+{
+    UserDefOne *ud1test, *ud1a, *ud1b;
+    UserDefOneList *ud1list;
+
+    ud1test = g_malloc0(sizeof(UserDefOne));
+    ud1test->integer = 42;
+    ud1test->string = g_strdup("hi there 42");
+
+    qapi_free_UserDefOne(ud1test);
+
+    ud1a = g_malloc0(sizeof(UserDefOne));
+    ud1a->integer = 43;
+    ud1a->string = g_strdup("hi there 43");
+
+    ud1b = g_malloc0(sizeof(UserDefOne));
+    ud1b->integer = 44;
+    ud1b->string = g_strdup("hi there 44");
+
+    ud1list = g_malloc0(sizeof(UserDefOneList));
+    ud1list->value = ud1a;
+    ud1list->next = g_malloc0(sizeof(UserDefOneList));
+    ud1list->next->value = ud1b;
+
+    qapi_free_UserDefOneList(ud1list);
+}
+
+/* test generated deallocation on an object whose construction was prematurely
+ * terminated due to an error */
+static void test_dealloc_partial(void)
+{
+    static const char text[] = "don't leak me";
+
+    UserDefTwo *ud2 = NULL;
+    Error *err = NULL;
+
+    /* create partial object */
+    {
+        QDict *ud2_dict;
+        Visitor *v;
+
+        ud2_dict = qdict_new();
+        qdict_put_str(ud2_dict, "string0", text);
+
+        v = qobject_input_visitor_new(QOBJECT(ud2_dict));
+        visit_type_UserDefTwo(v, NULL, &ud2, &err);
+        visit_free(v);
+        QDECREF(ud2_dict);
+    }
+
+    /* verify that visit_type_XXX() cleans up properly on error */
+    error_free_or_abort(&err);
+    assert(!ud2);
+
+    /* Manually create a partial object, leaving ud2->dict1 at NULL */
+    ud2 = g_new0(UserDefTwo, 1);
+    ud2->string0 = g_strdup(text);
+
+    /* tear down partial object */
+    qapi_free_UserDefTwo(ud2);
+}
+
+
+int main(int argc, char **argv)
+{
+    g_test_init(&argc, &argv, NULL);
+
+    g_test_add_func("/0.15/dispatch_cmd", test_dispatch_cmd);
+    g_test_add_func("/0.15/dispatch_cmd_failure", test_dispatch_cmd_failure);
+    g_test_add_func("/0.15/dispatch_cmd_io", test_dispatch_cmd_io);
+    g_test_add_func("/0.15/dealloc_types", test_dealloc_types);
+    g_test_add_func("/0.15/dealloc_partial", test_dealloc_partial);
+
+    test_qmp_init_marshal(&qmp_commands);
+    g_test_run();
+
+    return 0;
+}
diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c
deleted file mode 100644 (file)
index 24660d0..0000000
+++ /dev/null
@@ -1,286 +0,0 @@
-#include "qemu/osdep.h"
-#include "qemu-common.h"
-#include "qapi/qmp/qdict.h"
-#include "qapi/qmp/qnum.h"
-#include "qapi/qmp/qstring.h"
-#include "test-qmp-commands.h"
-#include "qapi/error.h"
-#include "qemu/module.h"
-#include "qapi/qobject-input-visitor.h"
-#include "tests/test-qapi-types.h"
-#include "tests/test-qapi-visit.h"
-
-static QmpCommandList qmp_commands;
-
-void qmp_user_def_cmd(Error **errp)
-{
-}
-
-Empty2 *qmp_user_def_cmd0(Error **errp)
-{
-    return g_new0(Empty2, 1);
-}
-
-void qmp_user_def_cmd1(UserDefOne * ud1, Error **errp)
-{
-}
-
-UserDefTwo *qmp_user_def_cmd2(UserDefOne *ud1a,
-                              bool has_udb1, UserDefOne *ud1b,
-                              Error **errp)
-{
-    UserDefTwo *ret;
-    UserDefOne *ud1c = g_malloc0(sizeof(UserDefOne));
-    UserDefOne *ud1d = g_malloc0(sizeof(UserDefOne));
-
-    ud1c->string = strdup(ud1a->string);
-    ud1c->integer = ud1a->integer;
-    ud1d->string = strdup(has_udb1 ? ud1b->string : "blah0");
-    ud1d->integer = has_udb1 ? ud1b->integer : 0;
-
-    ret = g_new0(UserDefTwo, 1);
-    ret->string0 = strdup("blah1");
-    ret->dict1 = g_new0(UserDefTwoDict, 1);
-    ret->dict1->string1 = strdup("blah2");
-    ret->dict1->dict2 = g_new0(UserDefTwoDictDict, 1);
-    ret->dict1->dict2->userdef = ud1c;
-    ret->dict1->dict2->string = strdup("blah3");
-    ret->dict1->dict3 = g_new0(UserDefTwoDictDict, 1);
-    ret->dict1->has_dict3 = true;
-    ret->dict1->dict3->userdef = ud1d;
-    ret->dict1->dict3->string = strdup("blah4");
-
-    return ret;
-}
-
-int64_t qmp_guest_get_time(int64_t a, bool has_b, int64_t b, Error **errp)
-{
-    return a + (has_b ? b : 0);
-}
-
-QObject *qmp_guest_sync(QObject *arg, Error **errp)
-{
-    return arg;
-}
-
-void qmp_boxed_struct(UserDefZero *arg, Error **errp)
-{
-}
-
-void qmp_boxed_union(UserDefNativeListUnion *arg, Error **errp)
-{
-}
-
-__org_qemu_x_Union1 *qmp___org_qemu_x_command(__org_qemu_x_EnumList *a,
-                                              __org_qemu_x_StructList *b,
-                                              __org_qemu_x_Union2 *c,
-                                              __org_qemu_x_Alt *d,
-                                              Error **errp)
-{
-    __org_qemu_x_Union1 *ret = g_new0(__org_qemu_x_Union1, 1);
-
-    ret->type = ORG_QEMU_X_UNION1_KIND___ORG_QEMU_X_BRANCH;
-    ret->u.__org_qemu_x_branch.data = strdup("blah1");
-
-    /* Also test that 'wchar-t' was munged to 'q_wchar_t' */
-    if (b && b->value && !b->value->has_q_wchar_t) {
-        b->value->q_wchar_t = 1;
-    }
-    return ret;
-}
-
-
-/* test commands with no input and no return value */
-static void test_dispatch_cmd(void)
-{
-    QDict *req = qdict_new();
-    QObject *resp;
-
-    qdict_put_str(req, "execute", "user_def_cmd");
-
-    resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
-    assert(resp != NULL);
-    assert(!qdict_haskey(qobject_to_qdict(resp), "error"));
-
-    qobject_decref(resp);
-    QDECREF(req);
-}
-
-/* test commands that return an error due to invalid parameters */
-static void test_dispatch_cmd_failure(void)
-{
-    QDict *req = qdict_new();
-    QDict *args = qdict_new();
-    QObject *resp;
-
-    qdict_put_str(req, "execute", "user_def_cmd2");
-
-    resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
-    assert(resp != NULL);
-    assert(qdict_haskey(qobject_to_qdict(resp), "error"));
-
-    qobject_decref(resp);
-    QDECREF(req);
-
-    /* check that with extra arguments it throws an error */
-    req = qdict_new();
-    qdict_put_int(args, "a", 66);
-    qdict_put(req, "arguments", args);
-
-    qdict_put_str(req, "execute", "user_def_cmd");
-
-    resp = qmp_dispatch(&qmp_commands, QOBJECT(req));
-    assert(resp != NULL);
-    assert(qdict_haskey(qobject_to_qdict(resp), "error"));
-
-    qobject_decref(resp);
-    QDECREF(req);
-}
-
-static QObject *test_qmp_dispatch(QDict *req)
-{
-    QObject *resp_obj;
-    QDict *resp;
-    QObject *ret;
-
-    resp_obj = qmp_dispatch(&qmp_commands, QOBJECT(req));
-    assert(resp_obj);
-    resp = qobject_to_qdict(resp_obj);
-    assert(resp && !qdict_haskey(resp, "error"));
-    ret = qdict_get(resp, "return");
-    assert(ret);
-    qobject_incref(ret);
-    qobject_decref(resp_obj);
-    return ret;
-}
-
-/* test commands that involve both input parameters and return values */
-static void test_dispatch_cmd_io(void)
-{
-    QDict *req = qdict_new();
-    QDict *args = qdict_new();
-    QDict *args3 = qdict_new();
-    QDict *ud1a = qdict_new();
-    QDict *ud1b = qdict_new();
-    QDict *ret, *ret_dict, *ret_dict_dict, *ret_dict_dict_userdef;
-    QDict *ret_dict_dict2, *ret_dict_dict2_userdef;
-    QNum *ret3;
-    int64_t val;
-
-    qdict_put_int(ud1a, "integer", 42);
-    qdict_put_str(ud1a, "string", "hello");
-    qdict_put_int(ud1b, "integer", 422);
-    qdict_put_str(ud1b, "string", "hello2");
-    qdict_put(args, "ud1a", ud1a);
-    qdict_put(args, "ud1b", ud1b);
-    qdict_put(req, "arguments", args);
-    qdict_put_str(req, "execute", "user_def_cmd2");
-
-    ret = qobject_to_qdict(test_qmp_dispatch(req));
-
-    assert(!strcmp(qdict_get_str(ret, "string0"), "blah1"));
-    ret_dict = qdict_get_qdict(ret, "dict1");
-    assert(!strcmp(qdict_get_str(ret_dict, "string1"), "blah2"));
-    ret_dict_dict = qdict_get_qdict(ret_dict, "dict2");
-    ret_dict_dict_userdef = qdict_get_qdict(ret_dict_dict, "userdef");
-    assert(qdict_get_int(ret_dict_dict_userdef, "integer") == 42);
-    assert(!strcmp(qdict_get_str(ret_dict_dict_userdef, "string"), "hello"));
-    assert(!strcmp(qdict_get_str(ret_dict_dict, "string"), "blah3"));
-    ret_dict_dict2 = qdict_get_qdict(ret_dict, "dict3");
-    ret_dict_dict2_userdef = qdict_get_qdict(ret_dict_dict2, "userdef");
-    assert(qdict_get_int(ret_dict_dict2_userdef, "integer") == 422);
-    assert(!strcmp(qdict_get_str(ret_dict_dict2_userdef, "string"), "hello2"));
-    assert(!strcmp(qdict_get_str(ret_dict_dict2, "string"), "blah4"));
-    QDECREF(ret);
-
-    qdict_put_int(args3, "a", 66);
-    qdict_put(req, "arguments", args3);
-    qdict_put_str(req, "execute", "guest-get-time");
-
-    ret3 = qobject_to_qnum(test_qmp_dispatch(req));
-    g_assert(qnum_get_try_int(ret3, &val));
-    g_assert_cmpint(val, ==, 66);
-    QDECREF(ret3);
-
-    QDECREF(req);
-}
-
-/* test generated dealloc functions for generated types */
-static void test_dealloc_types(void)
-{
-    UserDefOne *ud1test, *ud1a, *ud1b;
-    UserDefOneList *ud1list;
-
-    ud1test = g_malloc0(sizeof(UserDefOne));
-    ud1test->integer = 42;
-    ud1test->string = g_strdup("hi there 42");
-
-    qapi_free_UserDefOne(ud1test);
-
-    ud1a = g_malloc0(sizeof(UserDefOne));
-    ud1a->integer = 43;
-    ud1a->string = g_strdup("hi there 43");
-
-    ud1b = g_malloc0(sizeof(UserDefOne));
-    ud1b->integer = 44;
-    ud1b->string = g_strdup("hi there 44");
-
-    ud1list = g_malloc0(sizeof(UserDefOneList));
-    ud1list->value = ud1a;
-    ud1list->next = g_malloc0(sizeof(UserDefOneList));
-    ud1list->next->value = ud1b;
-
-    qapi_free_UserDefOneList(ud1list);
-}
-
-/* test generated deallocation on an object whose construction was prematurely
- * terminated due to an error */
-static void test_dealloc_partial(void)
-{
-    static const char text[] = "don't leak me";
-
-    UserDefTwo *ud2 = NULL;
-    Error *err = NULL;
-
-    /* create partial object */
-    {
-        QDict *ud2_dict;
-        Visitor *v;
-
-        ud2_dict = qdict_new();
-        qdict_put_str(ud2_dict, "string0", text);
-
-        v = qobject_input_visitor_new(QOBJECT(ud2_dict));
-        visit_type_UserDefTwo(v, NULL, &ud2, &err);
-        visit_free(v);
-        QDECREF(ud2_dict);
-    }
-
-    /* verify that visit_type_XXX() cleans up properly on error */
-    error_free_or_abort(&err);
-    assert(!ud2);
-
-    /* Manually create a partial object, leaving ud2->dict1 at NULL */
-    ud2 = g_new0(UserDefTwo, 1);
-    ud2->string0 = g_strdup(text);
-
-    /* tear down partial object */
-    qapi_free_UserDefTwo(ud2);
-}
-
-
-int main(int argc, char **argv)
-{
-    g_test_init(&argc, &argv, NULL);
-
-    g_test_add_func("/0.15/dispatch_cmd", test_dispatch_cmd);
-    g_test_add_func("/0.15/dispatch_cmd_failure", test_dispatch_cmd_failure);
-    g_test_add_func("/0.15/dispatch_cmd_io", test_dispatch_cmd_io);
-    g_test_add_func("/0.15/dealloc_types", test_dealloc_types);
-    g_test_add_func("/0.15/dealloc_partial", test_dealloc_partial);
-
-    test_qmp_init_marshal(&qmp_commands);
-    g_test_run();
-
-    return 0;
-}