Li Qiang <liq...@163.com> writes: > Properly free each test response to avoid memory leak and separate > qtest_qmp() calls with spare lines, in a consistent manner. > > Fixes: 5b88849e7b9("tests/qmp-cmd-test: Add > qmp/object-add-failure-modes"
The patch also fixes leaks introduced in 442b09b83d and 9fc719b869, actually. At least it should, but the patch appears to be incomplete. > > Reviewed-by: Eric Auger <eric.au...@redhat.com> > Signed-off-by: Li Qiang <liq...@163.com> > --- > Change sincve v1: add detailed commit message > > tests/qtest/qmp-cmd-test.c | 13 +++++++++++++ > 1 file changed, 13 insertions(+) > > diff --git a/tests/qtest/qmp-cmd-test.c b/tests/qtest/qmp-cmd-test.c > index c68f99f659..f7b1aa7fdc 100644 > --- a/tests/qtest/qmp-cmd-test.c > +++ b/tests/qtest/qmp-cmd-test.c > @@ -230,6 +230,8 @@ static void test_object_add_failure_modes(void) static void test_object_add_failure_modes(void) { QTestState *qts; QDict *resp; /* attempt to create an object without props */ qts = qtest_init(common_args); resp = qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" " {'qom-type': 'memory-backend-ram', 'id': 'ram1' } }"); g_assert_nonnull(resp); qmp_assert_error_class(resp, "GenericError"); Doesn't @resp leak here, too? /* attempt to create an object without qom-type */ resp = qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" " {'id': 'ram1' } }"); g_assert_nonnull(resp); qmp_assert_error_class(resp, "GenericError"); Likewise. /* attempt to delete an object that does not exist */ resp = qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" " {'id': 'ram1' } }"); g_assert_nonnull(resp); qmp_assert_error_class(resp, "GenericError"); Likewise. /* attempt to create 2 objects with duplicate id */ resp = qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" " {'qom-type': 'memory-backend-ram', 'id': 'ram1'," > " 'props': {'size': 1048576 } } }"); > g_assert_nonnull(resp); > g_assert(qdict_haskey(resp, "return")); > + qobject_unref(resp); > + > resp = qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" > " {'qom-type': 'memory-backend-ram', 'id': 'ram1'," > " 'props': {'size': 1048576 } } }"); g_assert_nonnull(resp); qmp_assert_error_class(resp, "GenericError"); Likewise. /* delete ram1 object */ resp = qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" > @@ -241,6 +243,7 @@ static void test_object_add_failure_modes(void) > " {'id': 'ram1' } }"); > g_assert_nonnull(resp); > g_assert(qdict_haskey(resp, "return")); > + qobject_unref(resp); > > /* attempt to create an object with a property of a wrong type */ > resp = qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" " {'qom-type': 'memory-backend-ram', 'id': 'ram1'," " 'props': {'size': '1048576' } } }"); > @@ -249,17 +252,20 @@ static void test_object_add_failure_modes(void) > g_assert_nonnull(resp); > /* now do it right */ > qmp_assert_error_class(resp, "GenericError"); Likewise. > + > resp = qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" > " {'qom-type': 'memory-backend-ram', 'id': 'ram1'," > " 'props': {'size': 1048576 } } }"); > g_assert_nonnull(resp); > g_assert(qdict_haskey(resp, "return")); > + qobject_unref(resp); > > /* delete ram1 object */ > resp = qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" > " {'id': 'ram1' } }"); > g_assert_nonnull(resp); > g_assert(qdict_haskey(resp, "return")); > + qobject_unref(resp); > > /* attempt to create an object without the id */ > resp = qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" " {'qom-type': 'memory-backend-ram'," > @@ -267,18 +273,21 @@ static void test_object_add_failure_modes(void) > " 'props': {'size': 1048576 } } }"); > g_assert_nonnull(resp); > qmp_assert_error_class(resp, "GenericError"); Likewise. > + > /* now do it right */ > resp = qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" > " {'qom-type': 'memory-backend-ram', 'id': 'ram1'," > " 'props': {'size': 1048576 } } }"); > g_assert_nonnull(resp); > g_assert(qdict_haskey(resp, "return")); > + qobject_unref(resp); > > /* delete ram1 object */ > resp = qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" > " {'id': 'ram1' } }"); > g_assert_nonnull(resp); > g_assert(qdict_haskey(resp, "return")); > + qobject_unref(resp); > > /* attempt to set a non existing property */ > resp = qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" " {'qom-type': 'memory-backend-ram', 'id': 'ram1'," > @@ -286,23 +295,27 @@ static void test_object_add_failure_modes(void) > " 'props': {'sized': 1048576 } } }"); > g_assert_nonnull(resp); > qmp_assert_error_class(resp, "GenericError"); Likewise. > + > /* now do it right */ > resp = qtest_qmp(qts, "{'execute': 'object-add', 'arguments':" > " {'qom-type': 'memory-backend-ram', 'id': 'ram1'," > " 'props': {'size': 1048576 } } }"); > g_assert_nonnull(resp); > g_assert(qdict_haskey(resp, "return")); > + qobject_unref(resp); > > /* delete ram1 object without id */ > resp = qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" > " {'ida': 'ram1' } }"); > g_assert_nonnull(resp); > + qobject_unref(resp); > > /* delete ram1 object */ > resp = qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" > " {'id': 'ram1' } }"); > g_assert_nonnull(resp); > g_assert(qdict_haskey(resp, "return")); > + qobject_unref(resp); > > /* delete ram1 object that does not exist anymore*/ > resp = qtest_qmp(qts, "{'execute': 'object-del', 'arguments':" " {'id': 'ram1' } }"); g_assert_nonnull(resp); qmp_assert_error_class(resp, "GenericError"); Likewise. qtest_quit(qts); }