xref: /qemu/tests/unit/test-qmp-cmds.c (revision 2e2e0df2706886488caf3d0dd22d4fe3acc4d4e0)
1681c28a3SPeter Maydell #include "qemu/osdep.h"
26b673957SMarkus Armbruster #include "qapi/qmp/qdict.h"
315280c36SMarkus Armbruster #include "qapi/qmp/qnum.h"
46b673957SMarkus Armbruster #include "qapi/qmp/qstring.h"
5e688df6bSMarkus Armbruster #include "qapi/error.h"
6b3db211fSDaniel P. Berrange #include "qapi/qobject-input-visitor.h"
7d98150f0SLaszlo Ersek #include "tests/test-qapi-types.h"
8d98150f0SLaszlo Ersek #include "tests/test-qapi-visit.h"
9eb815e24SMarkus Armbruster #include "test-qapi-commands.h"
1069ed8366SMichael Roth 
111527badbSMarkus Armbruster static QmpCommandList qmp_commands;
121527badbSMarkus Armbruster 
131f7b9f31SMarc-André Lureau #if defined(TEST_IF_STRUCT) && defined(TEST_IF_CMD)
14967c8851SMarc-André Lureau UserDefThree *qmp_TestIfCmd(TestIfStruct *foo, Error **errp)
15967c8851SMarc-André Lureau {
16967c8851SMarc-André Lureau     return NULL;
17967c8851SMarc-André Lureau }
181f7b9f31SMarc-André Lureau #endif
19967c8851SMarc-André Lureau 
20967c8851SMarc-André Lureau UserDefThree *qmp_TestCmdReturnDefThree(Error **errp)
21967c8851SMarc-André Lureau {
22967c8851SMarc-André Lureau     return NULL;
23967c8851SMarc-André Lureau }
24967c8851SMarc-André Lureau 
2569ed8366SMichael Roth void qmp_user_def_cmd(Error **errp)
2669ed8366SMichael Roth {
2769ed8366SMichael Roth }
2869ed8366SMichael Roth 
297b13f2c2SIgor Mammedov void qmp_test_flags_command(Error **errp)
301a1b11dcSPeter Xu {
311a1b11dcSPeter Xu }
321a1b11dcSPeter Xu 
33ae6bf766SMarc-André Lureau void qmp_cmd_success_response(Error **errp)
34ae6bf766SMarc-André Lureau {
35ae6bf766SMarc-André Lureau }
36ae6bf766SMarc-André Lureau 
37972a1101SEric Blake Empty2 *qmp_user_def_cmd0(Error **errp)
38972a1101SEric Blake {
39972a1101SEric Blake     return g_new0(Empty2, 1);
40972a1101SEric Blake }
41972a1101SEric Blake 
4269ed8366SMichael Roth void qmp_user_def_cmd1(UserDefOne * ud1, Error **errp)
4369ed8366SMichael Roth {
4469ed8366SMichael Roth }
4569ed8366SMichael Roth 
468aa3a33eSKevin Wolf void qmp_test_features(FeatureStruct0 *fs0, FeatureStruct1 *fs1,
478aa3a33eSKevin Wolf                        FeatureStruct2 *fs2, FeatureStruct3 *fs3,
488aa3a33eSKevin Wolf                        FeatureStruct4 *fs4, CondFeatureStruct1 *cfs1,
498aa3a33eSKevin Wolf                        CondFeatureStruct2 *cfs2, CondFeatureStruct3 *cfs3,
508aa3a33eSKevin Wolf                        Error **errp)
518aa3a33eSKevin Wolf {
528aa3a33eSKevin Wolf }
538aa3a33eSKevin Wolf 
54*2e2e0df2SPeter Krempa void qmp_test_command_features0(Error **errp)
55*2e2e0df2SPeter Krempa {
56*2e2e0df2SPeter Krempa }
57*2e2e0df2SPeter Krempa 
58*2e2e0df2SPeter Krempa void qmp_test_command_features1(Error **errp)
59*2e2e0df2SPeter Krempa {
60*2e2e0df2SPeter Krempa }
61*2e2e0df2SPeter Krempa 
62*2e2e0df2SPeter Krempa void qmp_test_command_features3(Error **errp)
63*2e2e0df2SPeter Krempa {
64*2e2e0df2SPeter Krempa }
65*2e2e0df2SPeter Krempa 
66*2e2e0df2SPeter Krempa void qmp_test_command_cond_features1(Error **errp)
67*2e2e0df2SPeter Krempa {
68*2e2e0df2SPeter Krempa }
69*2e2e0df2SPeter Krempa 
70*2e2e0df2SPeter Krempa void qmp_test_command_cond_features2(Error **errp)
71*2e2e0df2SPeter Krempa {
72*2e2e0df2SPeter Krempa }
73*2e2e0df2SPeter Krempa 
74*2e2e0df2SPeter Krempa void qmp_test_command_cond_features3(Error **errp)
75*2e2e0df2SPeter Krempa {
76*2e2e0df2SPeter Krempa }
77*2e2e0df2SPeter Krempa 
78ab22ad96SMarkus Armbruster UserDefTwo *qmp_user_def_cmd2(UserDefOne *ud1a,
79ab22ad96SMarkus Armbruster                               bool has_udb1, UserDefOne *ud1b,
80ab22ad96SMarkus Armbruster                               Error **errp)
8169ed8366SMichael Roth {
8269ed8366SMichael Roth     UserDefTwo *ret;
837267c094SAnthony Liguori     UserDefOne *ud1c = g_malloc0(sizeof(UserDefOne));
847267c094SAnthony Liguori     UserDefOne *ud1d = g_malloc0(sizeof(UserDefOne));
8569ed8366SMichael Roth 
8669ed8366SMichael Roth     ud1c->string = strdup(ud1a->string);
87ddf21908SEric Blake     ud1c->integer = ud1a->integer;
88ab22ad96SMarkus Armbruster     ud1d->string = strdup(has_udb1 ? ud1b->string : "blah0");
89ddf21908SEric Blake     ud1d->integer = has_udb1 ? ud1b->integer : 0;
9069ed8366SMichael Roth 
91b6fcf32dSEric Blake     ret = g_new0(UserDefTwo, 1);
92b6fcf32dSEric Blake     ret->string0 = strdup("blah1");
936446a592SEric Blake     ret->dict1 = g_new0(UserDefTwoDict, 1);
946446a592SEric Blake     ret->dict1->string1 = strdup("blah2");
956446a592SEric Blake     ret->dict1->dict2 = g_new0(UserDefTwoDictDict, 1);
966446a592SEric Blake     ret->dict1->dict2->userdef = ud1c;
976446a592SEric Blake     ret->dict1->dict2->string = strdup("blah3");
986446a592SEric Blake     ret->dict1->dict3 = g_new0(UserDefTwoDictDict, 1);
996446a592SEric Blake     ret->dict1->has_dict3 = true;
1006446a592SEric Blake     ret->dict1->dict3->userdef = ud1d;
1016446a592SEric Blake     ret->dict1->dict3->string = strdup("blah4");
10269ed8366SMichael Roth 
10369ed8366SMichael Roth     return ret;
10469ed8366SMichael Roth }
10569ed8366SMichael Roth 
106cae95eaeSEric Blake int64_t qmp_guest_get_time(int64_t a, bool has_b, int64_t b, Error **errp)
107c2216a8aSMarkus Armbruster {
108c2216a8aSMarkus Armbruster     return a + (has_b ? b : 0);
109c2216a8aSMarkus Armbruster }
110c2216a8aSMarkus Armbruster 
11128770e05SMarkus Armbruster QObject *qmp_guest_sync(QObject *arg, Error **errp)
11228770e05SMarkus Armbruster {
11328770e05SMarkus Armbruster     return arg;
11428770e05SMarkus Armbruster }
11528770e05SMarkus Armbruster 
116c818408eSEric Blake void qmp_boxed_struct(UserDefZero *arg, Error **errp)
117c818408eSEric Blake {
118c818408eSEric Blake }
119c818408eSEric Blake 
120b359f4b2SMarkus Armbruster void qmp_boxed_union(UserDefListUnion *arg, Error **errp)
121c818408eSEric Blake {
122c818408eSEric Blake }
123c818408eSEric Blake 
124675b214bSMarkus Armbruster void qmp_boxed_empty(Empty1 *arg, Error **errp)
125675b214bSMarkus Armbruster {
126675b214bSMarkus Armbruster }
127675b214bSMarkus Armbruster 
128e3c4c3d7SEric Blake __org_qemu_x_Union1 *qmp___org_qemu_x_command(__org_qemu_x_EnumList *a,
129e3c4c3d7SEric Blake                                               __org_qemu_x_StructList *b,
130e3c4c3d7SEric Blake                                               __org_qemu_x_Union2 *c,
131e3c4c3d7SEric Blake                                               __org_qemu_x_Alt *d,
132e3c4c3d7SEric Blake                                               Error **errp)
133e3c4c3d7SEric Blake {
134e3c4c3d7SEric Blake     __org_qemu_x_Union1 *ret = g_new0(__org_qemu_x_Union1, 1);
135e3c4c3d7SEric Blake 
136c363acefSEric Blake     ret->type = ORG_QEMU_X_UNION1_KIND___ORG_QEMU_X_BRANCH;
13732bafa8fSEric Blake     ret->u.__org_qemu_x_branch.data = strdup("blah1");
138e3c4c3d7SEric Blake 
139c43567c1SEric Blake     /* Also test that 'wchar-t' was munged to 'q_wchar_t' */
140c43567c1SEric Blake     if (b && b->value && !b->value->has_q_wchar_t) {
141c43567c1SEric Blake         b->value->q_wchar_t = 1;
142c43567c1SEric Blake     }
143e3c4c3d7SEric Blake     return ret;
144e3c4c3d7SEric Blake }
145e3c4c3d7SEric Blake 
146e3c4c3d7SEric Blake 
14769ed8366SMichael Roth /* test commands with no input and no return value */
14869ed8366SMichael Roth static void test_dispatch_cmd(void)
14969ed8366SMichael Roth {
15069ed8366SMichael Roth     QDict *req = qdict_new();
151d43b1694SMarkus Armbruster     QDict *resp;
15269ed8366SMichael Roth 
15346f5ac20SEric Blake     qdict_put_str(req, "execute", "user_def_cmd");
15469ed8366SMichael Roth 
155674ed722SMarkus Armbruster     resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false);
15669ed8366SMichael Roth     assert(resp != NULL);
157d43b1694SMarkus Armbruster     assert(!qdict_haskey(resp, "error"));
15869ed8366SMichael Roth 
159cb3e7f08SMarc-André Lureau     qobject_unref(resp);
160cb3e7f08SMarc-André Lureau     qobject_unref(req);
16169ed8366SMichael Roth }
16269ed8366SMichael Roth 
163c55f070bSPeter Xu static void test_dispatch_cmd_oob(void)
164c55f070bSPeter Xu {
165c55f070bSPeter Xu     QDict *req = qdict_new();
166c55f070bSPeter Xu     QDict *resp;
167c55f070bSPeter Xu 
168c55f070bSPeter Xu     qdict_put_str(req, "exec-oob", "test-flags-command");
169c55f070bSPeter Xu 
170c55f070bSPeter Xu     resp = qmp_dispatch(&qmp_commands, QOBJECT(req), true);
171c55f070bSPeter Xu     assert(resp != NULL);
172c55f070bSPeter Xu     assert(!qdict_haskey(resp, "error"));
173c55f070bSPeter Xu 
174c55f070bSPeter Xu     qobject_unref(resp);
175c55f070bSPeter Xu     qobject_unref(req);
176c55f070bSPeter Xu }
177c55f070bSPeter Xu 
17869ed8366SMichael Roth /* test commands that return an error due to invalid parameters */
17951009170SPeter Maydell static void test_dispatch_cmd_failure(void)
18069ed8366SMichael Roth {
18169ed8366SMichael Roth     QDict *req = qdict_new();
182a0067da1SMarc-André Lureau     QDict *args = qdict_new();
183d43b1694SMarkus Armbruster     QDict *resp;
18469ed8366SMichael Roth 
18546f5ac20SEric Blake     qdict_put_str(req, "execute", "user_def_cmd2");
18669ed8366SMichael Roth 
187674ed722SMarkus Armbruster     resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false);
18869ed8366SMichael Roth     assert(resp != NULL);
189d43b1694SMarkus Armbruster     assert(qdict_haskey(resp, "error"));
19069ed8366SMichael Roth 
191cb3e7f08SMarc-André Lureau     qobject_unref(resp);
192cb3e7f08SMarc-André Lureau     qobject_unref(req);
193a0067da1SMarc-André Lureau 
194a0067da1SMarc-André Lureau     /* check that with extra arguments it throws an error */
195a0067da1SMarc-André Lureau     req = qdict_new();
19646f5ac20SEric Blake     qdict_put_int(args, "a", 66);
197a0067da1SMarc-André Lureau     qdict_put(req, "arguments", args);
198a0067da1SMarc-André Lureau 
19946f5ac20SEric Blake     qdict_put_str(req, "execute", "user_def_cmd");
200a0067da1SMarc-André Lureau 
201674ed722SMarkus Armbruster     resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false);
202a0067da1SMarc-André Lureau     assert(resp != NULL);
203d43b1694SMarkus Armbruster     assert(qdict_haskey(resp, "error"));
204a0067da1SMarc-André Lureau 
205cb3e7f08SMarc-André Lureau     qobject_unref(resp);
206cb3e7f08SMarc-André Lureau     qobject_unref(req);
20769ed8366SMichael Roth }
20869ed8366SMichael Roth 
209ae6bf766SMarc-André Lureau static void test_dispatch_cmd_success_response(void)
210ae6bf766SMarc-André Lureau {
211ae6bf766SMarc-André Lureau     QDict *req = qdict_new();
212ae6bf766SMarc-André Lureau     QDict *resp;
213ae6bf766SMarc-André Lureau 
214ae6bf766SMarc-André Lureau     qdict_put_str(req, "execute", "cmd-success-response");
215ae6bf766SMarc-André Lureau     resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false);
216ae6bf766SMarc-André Lureau     g_assert_null(resp);
217ae6bf766SMarc-André Lureau     qobject_unref(req);
218ae6bf766SMarc-André Lureau }
219ae6bf766SMarc-André Lureau 
220357765feSMarkus Armbruster static QObject *test_qmp_dispatch(QDict *req)
221357765feSMarkus Armbruster {
222357765feSMarkus Armbruster     QDict *resp;
223357765feSMarkus Armbruster     QObject *ret;
224357765feSMarkus Armbruster 
225d43b1694SMarkus Armbruster     resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false);
226357765feSMarkus Armbruster     assert(resp && !qdict_haskey(resp, "error"));
227357765feSMarkus Armbruster     ret = qdict_get(resp, "return");
228357765feSMarkus Armbruster     assert(ret);
229cb3e7f08SMarc-André Lureau     qobject_ref(ret);
230d43b1694SMarkus Armbruster     qobject_unref(resp);
231357765feSMarkus Armbruster     return ret;
232357765feSMarkus Armbruster }
233357765feSMarkus Armbruster 
23469ed8366SMichael Roth /* test commands that involve both input parameters and return values */
23569ed8366SMichael Roth static void test_dispatch_cmd_io(void)
23669ed8366SMichael Roth {
23769ed8366SMichael Roth     QDict *req = qdict_new();
23869ed8366SMichael Roth     QDict *args = qdict_new();
239c2216a8aSMarkus Armbruster     QDict *args3 = qdict_new();
24069ed8366SMichael Roth     QDict *ud1a = qdict_new();
24169ed8366SMichael Roth     QDict *ud1b = qdict_new();
242357765feSMarkus Armbruster     QDict *ret, *ret_dict, *ret_dict_dict, *ret_dict_dict_userdef;
243357765feSMarkus Armbruster     QDict *ret_dict_dict2, *ret_dict_dict2_userdef;
24401b2ffceSMarc-André Lureau     QNum *ret3;
24501b2ffceSMarc-André Lureau     int64_t val;
24669ed8366SMichael Roth 
24746f5ac20SEric Blake     qdict_put_int(ud1a, "integer", 42);
24846f5ac20SEric Blake     qdict_put_str(ud1a, "string", "hello");
24946f5ac20SEric Blake     qdict_put_int(ud1b, "integer", 422);
25046f5ac20SEric Blake     qdict_put_str(ud1b, "string", "hello2");
251de6e7951SEric Blake     qdict_put(args, "ud1a", ud1a);
252de6e7951SEric Blake     qdict_put(args, "ud1b", ud1b);
253de6e7951SEric Blake     qdict_put(req, "arguments", args);
25446f5ac20SEric Blake     qdict_put_str(req, "execute", "user_def_cmd2");
25569ed8366SMichael Roth 
2567dc847ebSMax Reitz     ret = qobject_to(QDict, test_qmp_dispatch(req));
25769ed8366SMichael Roth 
258b6fcf32dSEric Blake     assert(!strcmp(qdict_get_str(ret, "string0"), "blah1"));
259b6fcf32dSEric Blake     ret_dict = qdict_get_qdict(ret, "dict1");
260b6fcf32dSEric Blake     assert(!strcmp(qdict_get_str(ret_dict, "string1"), "blah2"));
261b6fcf32dSEric Blake     ret_dict_dict = qdict_get_qdict(ret_dict, "dict2");
262357765feSMarkus Armbruster     ret_dict_dict_userdef = qdict_get_qdict(ret_dict_dict, "userdef");
263357765feSMarkus Armbruster     assert(qdict_get_int(ret_dict_dict_userdef, "integer") == 42);
264357765feSMarkus Armbruster     assert(!strcmp(qdict_get_str(ret_dict_dict_userdef, "string"), "hello"));
265357765feSMarkus Armbruster     assert(!strcmp(qdict_get_str(ret_dict_dict, "string"), "blah3"));
266b6fcf32dSEric Blake     ret_dict_dict2 = qdict_get_qdict(ret_dict, "dict3");
267357765feSMarkus Armbruster     ret_dict_dict2_userdef = qdict_get_qdict(ret_dict_dict2, "userdef");
268357765feSMarkus Armbruster     assert(qdict_get_int(ret_dict_dict2_userdef, "integer") == 422);
269357765feSMarkus Armbruster     assert(!strcmp(qdict_get_str(ret_dict_dict2_userdef, "string"), "hello2"));
270357765feSMarkus Armbruster     assert(!strcmp(qdict_get_str(ret_dict_dict2, "string"), "blah4"));
271cb3e7f08SMarc-André Lureau     qobject_unref(ret);
272c2216a8aSMarkus Armbruster 
27346f5ac20SEric Blake     qdict_put_int(args3, "a", 66);
274c2216a8aSMarkus Armbruster     qdict_put(req, "arguments", args3);
27546f5ac20SEric Blake     qdict_put_str(req, "execute", "guest-get-time");
276c2216a8aSMarkus Armbruster 
2777dc847ebSMax Reitz     ret3 = qobject_to(QNum, test_qmp_dispatch(req));
27801b2ffceSMarc-André Lureau     g_assert(qnum_get_try_int(ret3, &val));
27901b2ffceSMarc-André Lureau     g_assert_cmpint(val, ==, 66);
280cb3e7f08SMarc-André Lureau     qobject_unref(ret3);
281c2216a8aSMarkus Armbruster 
282cb3e7f08SMarc-André Lureau     qobject_unref(req);
28369ed8366SMichael Roth }
28469ed8366SMichael Roth 
2855cd5f0d0SMichael Roth /* test generated dealloc functions for generated types */
2865cd5f0d0SMichael Roth static void test_dealloc_types(void)
2875cd5f0d0SMichael Roth {
2885cd5f0d0SMichael Roth     UserDefOne *ud1test, *ud1a, *ud1b;
2895cd5f0d0SMichael Roth     UserDefOneList *ud1list;
2905cd5f0d0SMichael Roth 
2915cd5f0d0SMichael Roth     ud1test = g_malloc0(sizeof(UserDefOne));
292ddf21908SEric Blake     ud1test->integer = 42;
2935cd5f0d0SMichael Roth     ud1test->string = g_strdup("hi there 42");
2945cd5f0d0SMichael Roth 
2955cd5f0d0SMichael Roth     qapi_free_UserDefOne(ud1test);
2965cd5f0d0SMichael Roth 
2975cd5f0d0SMichael Roth     ud1a = g_malloc0(sizeof(UserDefOne));
298ddf21908SEric Blake     ud1a->integer = 43;
2995cd5f0d0SMichael Roth     ud1a->string = g_strdup("hi there 43");
3005cd5f0d0SMichael Roth 
3015cd5f0d0SMichael Roth     ud1b = g_malloc0(sizeof(UserDefOne));
302ddf21908SEric Blake     ud1b->integer = 44;
3035cd5f0d0SMichael Roth     ud1b->string = g_strdup("hi there 44");
3045cd5f0d0SMichael Roth 
3055cd5f0d0SMichael Roth     ud1list = g_malloc0(sizeof(UserDefOneList));
3065cd5f0d0SMichael Roth     ud1list->value = ud1a;
3075cd5f0d0SMichael Roth     ud1list->next = g_malloc0(sizeof(UserDefOneList));
3085cd5f0d0SMichael Roth     ud1list->next->value = ud1b;
3095cd5f0d0SMichael Roth 
3105cd5f0d0SMichael Roth     qapi_free_UserDefOneList(ud1list);
3115cd5f0d0SMichael Roth }
3125cd5f0d0SMichael Roth 
313d98150f0SLaszlo Ersek /* test generated deallocation on an object whose construction was prematurely
314d98150f0SLaszlo Ersek  * terminated due to an error */
315d98150f0SLaszlo Ersek static void test_dealloc_partial(void)
316d98150f0SLaszlo Ersek {
317d98150f0SLaszlo Ersek     static const char text[] = "don't leak me";
318d98150f0SLaszlo Ersek 
319d98150f0SLaszlo Ersek     UserDefTwo *ud2 = NULL;
320d98150f0SLaszlo Ersek     Error *err = NULL;
321d98150f0SLaszlo Ersek 
322d98150f0SLaszlo Ersek     /* create partial object */
323d98150f0SLaszlo Ersek     {
324d98150f0SLaszlo Ersek         QDict *ud2_dict;
325b70ce101SEric Blake         Visitor *v;
326d98150f0SLaszlo Ersek 
327d98150f0SLaszlo Ersek         ud2_dict = qdict_new();
32846f5ac20SEric Blake         qdict_put_str(ud2_dict, "string0", text);
329d98150f0SLaszlo Ersek 
330048abb7bSMarkus Armbruster         v = qobject_input_visitor_new(QOBJECT(ud2_dict));
331b70ce101SEric Blake         visit_type_UserDefTwo(v, NULL, &ud2, &err);
332b70ce101SEric Blake         visit_free(v);
333cb3e7f08SMarc-André Lureau         qobject_unref(ud2_dict);
334d98150f0SLaszlo Ersek     }
335d98150f0SLaszlo Ersek 
33668ab47e4SEric Blake     /* verify that visit_type_XXX() cleans up properly on error */
337a12a5a1aSEric Blake     error_free_or_abort(&err);
33868ab47e4SEric Blake     assert(!ud2);
33968ab47e4SEric Blake 
34068ab47e4SEric Blake     /* Manually create a partial object, leaving ud2->dict1 at NULL */
34168ab47e4SEric Blake     ud2 = g_new0(UserDefTwo, 1);
34268ab47e4SEric Blake     ud2->string0 = g_strdup(text);
343d98150f0SLaszlo Ersek 
344d98150f0SLaszlo Ersek     /* tear down partial object */
345d98150f0SLaszlo Ersek     qapi_free_UserDefTwo(ud2);
346d98150f0SLaszlo Ersek }
347d98150f0SLaszlo Ersek 
348d98150f0SLaszlo Ersek 
34969ed8366SMichael Roth int main(int argc, char **argv)
35069ed8366SMichael Roth {
35169ed8366SMichael Roth     g_test_init(&argc, &argv, NULL);
35269ed8366SMichael Roth 
353214e4a5bSMarc-André Lureau     g_test_add_func("/qmp/dispatch_cmd", test_dispatch_cmd);
354c55f070bSPeter Xu     g_test_add_func("/qmp/dispatch_cmd_oob", test_dispatch_cmd_oob);
355214e4a5bSMarc-André Lureau     g_test_add_func("/qmp/dispatch_cmd_failure", test_dispatch_cmd_failure);
356214e4a5bSMarc-André Lureau     g_test_add_func("/qmp/dispatch_cmd_io", test_dispatch_cmd_io);
357ae6bf766SMarc-André Lureau     g_test_add_func("/qmp/dispatch_cmd_success_response",
358ae6bf766SMarc-André Lureau                     test_dispatch_cmd_success_response);
359214e4a5bSMarc-André Lureau     g_test_add_func("/qmp/dealloc_types", test_dealloc_types);
360214e4a5bSMarc-André Lureau     g_test_add_func("/qmp/dealloc_partial", test_dealloc_partial);
36169ed8366SMichael Roth 
3621527badbSMarkus Armbruster     test_qmp_init_marshal(&qmp_commands);
36369ed8366SMichael Roth     g_test_run();
36469ed8366SMichael Roth 
36569ed8366SMichael Roth     return 0;
36669ed8366SMichael Roth }
367