Markus Armbruster <arm...@redhat.com> 于2020年7月16日周四 下午1:59写道: > > 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?
No, qmp_assert_error_class will call qobject_unref(rsp) will so will not leak. In fact, I think this is a inconsistent for 'qtest_qmp'. I think we can apply this patch first and then change the 'qmp_assert_error_class' or/and others to free resp. And just let the caller of 'qtest_qmp' frees unref the rsp. What's your idea? Thanks, Li Qiang > > /* 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); > } >