qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 05/34] tests/test-qmp-cmds: Factor out qmp_dispatch() test


From: Marc-André Lureau
Subject: Re: [PATCH v3 05/34] tests/test-qmp-cmds: Factor out qmp_dispatch() test helpers
Date: Mon, 16 Mar 2020 16:06:41 +0100

Hi

On Sun, Mar 15, 2020 at 3:48 PM Markus Armbruster <address@hidden> 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 <address@hidden>
> ---
>  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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]