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

2020-03-16 Thread Markus Armbruster
Marc-André Lureau  writes:

> Hi
>
> On Sun, Mar 15, 2020 at 3:48 PM Markus Armbruster  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 
>> ---
>>  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)
[...]

Thanks!

Fixup to be squashed in here, with revert to be squashed into PATCH 07:

diff --git a/tests/test-qmp-cmds.c b/tests/test-qmp-cmds.c
index fb18475c7e..b31064b064 100644
--- a/tests/test-qmp-cmds.c
+++ b/tests/test-qmp-cmds.c
@@ -279,8 +279,6 @@ static void test_dispatch_cmd_io(void)
 g_assert(qnum_get_try_int(ret3, ));
 g_assert_cmpint(val, ==, 66);
 qobject_unref(ret3);
-
-qobject_unref(req);
 }
 
 /* test generated dealloc functions for generated types */




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

2020-03-16 Thread Eric Blake

On 3/15/20 9:46 AM, Markus Armbruster 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 
---
  tests/test-qmp-cmds.c | 72 +--
  1 file changed, 35 insertions(+), 37 deletions(-)




+
+static void do_qmp_dispatch_error(QDict *req, bool allow_oob, ErrorClass cls)
+{
+QDict *resp;
+
+resp = qmp_dispatch(_commands, QOBJECT(req), allow_oob);
+g_assert(resp && qdict_haskey(resp, "error"));
+
+qobject_unref(resp);
+}


No checking of cls?  Or is that what you hint at as coming later?

At any rate, the refactoring is sane.
Reviewed-by: Eric Blake 

--
Eric Blake, Principal Software Engineer
Red Hat, Inc.   +1-919-301-3226
Virtualization:  qemu.org | libvirt.org




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

2020-03-16 Thread Marc-André Lureau
Hi

On Sun, Mar 15, 2020 at 3:48 PM Markus Armbruster  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 
> ---
>  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(_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(_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();
> 

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

2020-03-15 Thread Markus Armbruster
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 
---
 tests/test-qmp-cmds.c | 72 +--
 1 file changed, 35 insertions(+), 37 deletions(-)

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(_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(_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(_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(_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(_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(_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(_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, ));
 g_assert_cmpint(val, ==, 66);
 qobject_unref(ret3);
-
-qobject_unref(req);
 }
 
 /* test generated dealloc functions for generated types */
-- 
2.21.1