Hi On Sun, Mar 15, 2020 at 3:48 PM Markus Armbruster <arm...@redhat.com> wrote: > > Checking the value of qmp_dispatch() is repetitive. Factor out > helpers do_qmp_dispatch() and do_qmp_dispatch_error(). Without this, > the next commit would make things even more repetitive. > > Signed-off-by: Markus Armbruster <arm...@redhat.com> > --- > tests/test-qmp-cmds.c | 72 +++++++++++++++++++++---------------------- > 1 file changed, 35 insertions(+), 37 deletions(-)
ASAN is unhappy: ================================================================= ==1870336==ERROR: LeakSanitizer: detected memory leaks Indirect leak of 4120 byte(s) in 1 object(s) allocated from: #0 0x7fcdc9b8be56 in __interceptor_calloc (/lib64/libasan.so.5+0x10de56) #1 0x7fcdc998e3b0 in g_malloc0 (/lib64/libglib-2.0.so.0+0x573b0) #2 0x560213f56dbb in test_dispatch_cmd_io /home/elmarco/src/qemu/tests/test-qmp-cmds.c:238 #3 0x7fcdc99b0a8d (/lib64/libglib-2.0.so.0+0x79a8d) Indirect leak of 4120 byte(s) in 1 object(s) allocated from: #0 0x7fcdc9b8be56 in __interceptor_calloc (/lib64/libasan.so.5+0x10de56) #1 0x7fcdc998e3b0 in g_malloc0 (/lib64/libglib-2.0.so.0+0x573b0) #2 0x560213f56dd3 in test_dispatch_cmd_io /home/elmarco/src/qemu/tests/test-qmp-cmds.c:240 #3 0x7fcdc99b0a8d (/lib64/libglib-2.0.so.0+0x79a8d) Indirect leak of 55 byte(s) in 2 object(s) allocated from: #0 0x7fcdc9b8bc58 in __interceptor_malloc (/lib64/libasan.so.5+0x10dc58) #1 0x7fcdc998e358 in g_malloc (/lib64/libglib-2.0.so.0+0x57358) #2 0x560213fbf065 in qstring_from_str /home/elmarco/src/qemu/qobject/qstring.c:66 #3 0x560213fc151a in qdict_put_str /home/elmarco/src/qemu/qobject/qdict.c:143 #4 0x560213f5747f in test_dispatch_cmd_io /home/elmarco/src/qemu/tests/test-qmp-cmds.c:276 #5 0x7fcdc99b0a8d (/lib64/libglib-2.0.so.0+0x79a8d) Indirect leak of 32 byte(s) in 1 object(s) allocated from: #0 0x7fcdc9b8be56 in __interceptor_calloc (/lib64/libasan.so.5+0x10de56) #1 0x7fcdc998e3b0 in g_malloc0 (/lib64/libglib-2.0.so.0+0x573b0) #2 0x560213fc0ee4 in qdict_put_obj /home/elmarco/src/qemu/qobject/qdict.c:125 #3 0x560213f56fca in test_dispatch_cmd_io /home/elmarco/src/qemu/tests/test-qmp-cmds.c:254 #4 0x7fcdc99b0a8d (/lib64/libglib-2.0.so.0+0x79a8d) Indirect leak of 32 byte(s) in 1 object(s) allocated from: #0 0x7fcdc9b8be56 in __interceptor_calloc (/lib64/libasan.so.5+0x10de56) #1 0x7fcdc998e3b0 in g_malloc0 (/lib64/libglib-2.0.so.0+0x573b0) #2 0x560213fc0ee4 in qdict_put_obj /home/elmarco/src/qemu/qobject/qdict.c:125 #3 0x560213fc147e in qdict_put_int /home/elmarco/src/qemu/qobject/qdict.c:133 #4 0x560213f573ea in test_dispatch_cmd_io /home/elmarco/src/qemu/tests/test-qmp-cmds.c:274 #5 0x7fcdc99b0a8d (/lib64/libglib-2.0.so.0+0x79a8d) Indirect leak of 32 byte(s) in 1 object(s) allocated from: #0 0x7fcdc9b8bc58 in __interceptor_malloc (/lib64/libasan.so.5+0x10dc58) #1 0x7fcdc998e358 in g_malloc (/lib64/libglib-2.0.so.0+0x57358) #2 0x560213fc1428 in qdict_put_int /home/elmarco/src/qemu/qobject/qdict.c:133 #3 0x560213f573ea in test_dispatch_cmd_io /home/elmarco/src/qemu/tests/test-qmp-cmds.c:274 #4 0x7fcdc99b0a8d (/lib64/libglib-2.0.so.0+0x79a8d) Indirect leak of 32 byte(s) in 1 object(s) allocated from: #0 0x7fcdc9b8be56 in __interceptor_calloc (/lib64/libasan.so.5+0x10de56) #1 0x7fcdc998e3b0 in g_malloc0 (/lib64/libglib-2.0.so.0+0x573b0) #2 0x560213fc0ee4 in qdict_put_obj /home/elmarco/src/qemu/qobject/qdict.c:125 #3 0x560213fc1570 in qdict_put_str /home/elmarco/src/qemu/qobject/qdict.c:143 #4 0x560213f56fe7 in test_dispatch_cmd_io /home/elmarco/src/qemu/tests/test-qmp-cmds.c:255 #5 0x7fcdc99b0a8d (/lib64/libglib-2.0.so.0+0x79a8d) Indirect leak of 20 byte(s) in 3 object(s) allocated from: #0 0x7fcdc9b8bc58 in __interceptor_malloc (/lib64/libasan.so.5+0x10dc58) #1 0x7fcdc998e358 in g_malloc (/lib64/libglib-2.0.so.0+0x57358) > > diff --git a/tests/test-qmp-cmds.c b/tests/test-qmp-cmds.c > index 79507d9e54..b31064b064 100644 > --- a/tests/test-qmp-cmds.c > +++ b/tests/test-qmp-cmds.c > @@ -145,34 +145,55 @@ __org_qemu_x_Union1 > *qmp___org_qemu_x_command(__org_qemu_x_EnumList *a, > } > > > +static QObject *do_qmp_dispatch(QDict *req, bool allow_oob) > +{ > + QDict *resp; > + QObject *ret; > + > + resp = qmp_dispatch(&qmp_commands, QOBJECT(req), allow_oob); > + g_assert(resp && !qdict_haskey(resp, "error")); > + ret = qdict_get(resp, "return"); > + g_assert(ret); > + > + qobject_ref(ret); > + qobject_unref(resp); > + return ret; > +} > + > +static void do_qmp_dispatch_error(QDict *req, bool allow_oob, ErrorClass cls) > +{ > + QDict *resp; > + > + resp = qmp_dispatch(&qmp_commands, QOBJECT(req), allow_oob); > + g_assert(resp && qdict_haskey(resp, "error")); > + > + qobject_unref(resp); > +} > + > /* test commands with no input and no return value */ > static void test_dispatch_cmd(void) > { > QDict *req = qdict_new(); > - QDict *resp; > + QObject *ret; > > qdict_put_str(req, "execute", "user_def_cmd"); > > - resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false); > - assert(resp != NULL); > - assert(!qdict_haskey(resp, "error")); > + ret = do_qmp_dispatch(req, false); > > - qobject_unref(resp); > + qobject_unref(ret); > qobject_unref(req); > } > > static void test_dispatch_cmd_oob(void) > { > QDict *req = qdict_new(); > - QDict *resp; > + QObject *ret; > > qdict_put_str(req, "exec-oob", "test-flags-command"); > > - resp = qmp_dispatch(&qmp_commands, QOBJECT(req), true); > - assert(resp != NULL); > - assert(!qdict_haskey(resp, "error")); > + ret = do_qmp_dispatch(req, true); > > - qobject_unref(resp); > + qobject_unref(ret); > qobject_unref(req); > } > > @@ -181,15 +202,11 @@ static void test_dispatch_cmd_failure(void) > { > QDict *req = qdict_new(); > QDict *args = qdict_new(); > - QDict *resp; > > qdict_put_str(req, "execute", "user_def_cmd2"); > > - resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false); > - assert(resp != NULL); > - assert(qdict_haskey(resp, "error")); > + do_qmp_dispatch_error(req, false, ERROR_CLASS_GENERIC_ERROR); > > - qobject_unref(resp); > qobject_unref(req); > > /* check that with extra arguments it throws an error */ > @@ -199,11 +216,8 @@ static void test_dispatch_cmd_failure(void) > > qdict_put_str(req, "execute", "user_def_cmd"); > > - resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false); > - assert(resp != NULL); > - assert(qdict_haskey(resp, "error")); > + do_qmp_dispatch_error(req, false, ERROR_CLASS_GENERIC_ERROR); > > - qobject_unref(resp); > qobject_unref(req); > } > > @@ -218,20 +232,6 @@ static void test_dispatch_cmd_success_response(void) > qobject_unref(req); > } > > -static QObject *test_qmp_dispatch(QDict *req) > -{ > - QDict *resp; > - QObject *ret; > - > - resp = qmp_dispatch(&qmp_commands, QOBJECT(req), false); > - assert(resp && !qdict_haskey(resp, "error")); > - ret = qdict_get(resp, "return"); > - assert(ret); > - qobject_ref(ret); > - qobject_unref(resp); > - return ret; > -} > - > /* test commands that involve both input parameters and return values */ > static void test_dispatch_cmd_io(void) > { > @@ -254,7 +254,7 @@ static void test_dispatch_cmd_io(void) > qdict_put(req, "arguments", args); > qdict_put_str(req, "execute", "user_def_cmd2"); > > - ret = qobject_to(QDict, test_qmp_dispatch(req)); > + ret = qobject_to(QDict, do_qmp_dispatch(req, false)); > > assert(!strcmp(qdict_get_str(ret, "string0"), "blah1")); > ret_dict = qdict_get_qdict(ret, "dict1"); > @@ -275,12 +275,10 @@ static void test_dispatch_cmd_io(void) > qdict_put(req, "arguments", args3); > qdict_put_str(req, "execute", "guest-get-time"); > > - ret3 = qobject_to(QNum, test_qmp_dispatch(req)); > + ret3 = qobject_to(QNum, do_qmp_dispatch(req, false)); > g_assert(qnum_get_try_int(ret3, &val)); > g_assert_cmpint(val, ==, 66); > qobject_unref(ret3); > - > - qobject_unref(req); > } > > /* test generated dealloc functions for generated types */ > -- > 2.21.1 > > -- Marc-André Lureau