[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v4 06/10] tests: add qmp/object-add-without-prop
From: |
Markus Armbruster |
Subject: |
Re: [Qemu-devel] [PATCH v4 06/10] tests: add qmp/object-add-without-props test |
Date: |
Fri, 31 Aug 2018 08:47:22 +0200 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) |
Marc-André Lureau <address@hidden> writes:
> Hi
> On Thu, Aug 30, 2018 at 3:01 PM Markus Armbruster <address@hidden> wrote:
>>
>> Marc-André Lureau <address@hidden> writes:
>>
>> > test_object_add_without_props() tests a bug in qmp_object_add() we
>> > fixed in commit e64c75a975. Sadly, we don't have systematic
>> > object-add tests. This lone test can go into qmp-cmd-test for want of
>> > a better home.
>> >
>> > Signed-off-by: Marc-André Lureau <address@hidden>
>> > ---
>> > tests/qmp-cmd-test.c | 31 +++++++++++++++++++++++++++++++
>> > 1 file changed, 31 insertions(+)
>> >
>> > diff --git a/tests/qmp-cmd-test.c b/tests/qmp-cmd-test.c
>> > index c5b70df974..3ba8f68476 100644
>> > --- a/tests/qmp-cmd-test.c
>> > +++ b/tests/qmp-cmd-test.c
>> > @@ -19,6 +19,15 @@
>> >
>> > const char common_args[] = "-nodefaults -machine none";
>> >
>> > +static const char *get_error_class(QDict *resp)
>> > +{
>> > + QDict *error = qdict_get_qdict(resp, "error");
>> > + const char *desc = qdict_get_try_str(error, "desc");
>> > +
>> > + g_assert(desc);
>> > + return error ? qdict_get_try_str(error, "class") : NULL;
>> > +}
>> > +
>> > /* Query smoke tests */
>> >
>> > static int query_error_class(const char *cmd)
>>
>> Copied from qmp-test.c. It should be factored out instead. Where to
>> put it? libqtest.c isn't quite right, as the function could
>> theoretically be useful in unit tests as well, but I guess it would do
>> for now.
>>
>> Asserting presence of "desc" makes little sense outside qmp-test.c
>> protocol tests, but it doesn't hurt, either.
>>
>> Grep shows more possible users in tests/drive_del-test.c and
>> tests/test-qga.c.
>
> ok
>
>>
>> > @@ -197,6 +206,24 @@ static void add_query_tests(QmpSchema *schema)
>> > }
>> > }
>> >
>> > +static void test_object_add_without_props(void)
>> > +{
>> > + QTestState *qts;
>> > + QDict *ret;
>>
>> qmp-test.c and qmp-cmd-test.c commonly use @resp for the response.
>
> ok
>
>>
>> > +
>> > + qts = qtest_init(common_args);
>> > +
>> > + ret = qtest_qmp(qts,
>> > + "{'execute': 'object-add', 'arguments':"
>> > + " {'qom-type': 'memory-backend-ram', 'id': 'ram1' }
>> > }");
>> > + g_assert_nonnull(ret);
>>
>> What's wrong with g_assert(!ret)?
>
> nothing wrong, but g_assert_nonnull is slightly more readable, both in
> code and in error produced.
I beg to differ. assert(!ret) is idiomatic C.
I file g_assert_nonnull() under "redundant crap GLib dumps into my
limited identifier memory just because it can", along with similar
beauties g_assert_false(), guint, gconstpointer, ...
>> > +
>> > + g_assert_cmpstr(get_error_class(ret), ==, "GenericError");
>> > +
>> > + qobject_unref(ret);
>>
>> Permit me to digress.
>>
>> When you expect success, you check @resp like this:
>>
>> ret = qdict_get_qdict(resp, "return");
>> ... laborously check @ret against expectations ...
>>
>> If you feel pedantically thorough, you can throw in
>>
>> g_assert(!qdict_haskey(resp, "error");
>>
>> When you expect failure, you check like this:
>>
>> error = qdict_get_qdict(resp, "error");
>> class = qdict_get_try_str(error, "class");
>> g_assert_cmpstr(class, ==, "GenericError");
>>
>> and perhaps
>>
>> g_assert(!qdict_haskey(resp, "return");
>>
>> get_error_class() saves a little typing in the failure case. It's still
>> an awfully verbose overall, and the checking is full of holes more often
>> than not. There's got to be a better way.
>>
>
> what about?
> /**
> * qmp_assert_error_class:
> * @rsp: QMP response to check for error
> * @class: an error class
> *
> * Assert the response has the given error class and discard @rsp.
> */
> void qmp_assert_error_class(QDict *rsp, const char *class)
> {
> QDict *error = qdict_get_qdict(rsp, "error");
>
> g_assert_cmpstr(qdict_get_try_str(error, "class"), ==, class);
> g_assert_nonnull(qdict_get_try_str(error, "desc"));
> g_assert_null(qdict_get(error, "return"));
>
> qobject_unref(rsp);
> }
Drawback: the assertion messages no longer point to the test that broke.
Do we care?
>> > + qtest_quit(qts);
>> > +}
>> > +
>> > int main(int argc, char *argv[])
>> > {
>> > QmpSchema schema;
>> > @@ -206,6 +233,10 @@ int main(int argc, char *argv[])
>> >
>> > qmp_schema_init(&schema);
>> > add_query_tests(&schema);
>> > +
>> > + qtest_add_func("qmp/object-add-without-props",
>> > + test_object_add_without_props);
>> > +
>> > ret = g_test_run();
>> >
>> > qmp_schema_cleanup(&schema);
>>
>> May I have a TODO comment asking for coverage of generic object-add
>> failure modes?
>
> You mean checking for other kind of failures? ok
Yes. Your commit message admits "we don't have systematic object-add
tests". The TODO comment copies that to the code. It only asks for
negative tests, because these are the only generic ones (I think), and
object-specific tests should go elsewhere.
- [Qemu-devel] [PATCH v4 00/10] monitor: various code simplification and fixes, Marc-André Lureau, 2018/08/29
- [Qemu-devel] [PATCH v4 02/10] qmp: constify qmp_is_oob(), Marc-André Lureau, 2018/08/29
- [Qemu-devel] [PATCH v4 01/10] monitor: consitify qmp_send_response() QDict argument, Marc-André Lureau, 2018/08/29
- [Qemu-devel] [PATCH v4 03/10] Revert "qmp: isolate responses into io thread", Marc-André Lureau, 2018/08/29
- [Qemu-devel] [PATCH v4 04/10] monitor: no need to save need_resume, Marc-André Lureau, 2018/08/29
- [Qemu-devel] [PATCH v4 05/10] json-lexer: make it safe to call destroy multiple times, Marc-André Lureau, 2018/08/29
- [Qemu-devel] [PATCH v4 06/10] tests: add qmp/object-add-without-props test, Marc-André Lureau, 2018/08/29
- [Qemu-devel] [PATCH v4 08/10] tests: add a qmp success-response test, Marc-André Lureau, 2018/08/29
- [Qemu-devel] [PATCH v4 07/10] tests: add qmp/qom-set-without-value test, Marc-André Lureau, 2018/08/29
[Qemu-devel] [PATCH v4 09/10] qga: process_event() simplification, Marc-André Lureau, 2018/08/29
[Qemu-devel] [PATCH v4 10/10] qmp: common 'id' handling & make QGA conform to QMP spec, Marc-André Lureau, 2018/08/29