qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] tests/qmp-test: Add generic, basic test of quer


From: Markus Armbruster
Subject: Re: [Qemu-devel] [PATCH] tests/qmp-test: Add generic, basic test of query commands
Date: Fri, 11 Aug 2017 11:08:19 +0200
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/25.2 (gnu/linux)

Eric Blake <address@hidden> writes:

> On 08/10/2017 01:30 PM, Markus Armbruster wrote:
>> A command is a query if it has no side effect and yields a result.
>> Such commands are typically named query-FOO, but there are exceptions.
>> 
>> The basic idea is to find candidates with query-qmp-schema, filter out
>> the ones that aren't queries with an explicit blacklist, and test the
>> remaining ones against a QEMU with no special arguments.
>> 
>> The current blacklist is just add-fd.
>
> I guess this is because it has no mandatory parameters.  Hmm - I wonder
> if introspection should flag WHICH commands require an fd over SCM
> rights (I guess just add-fd)

Actually, add-fd and getfd.

Their documentation neglects to explain how the two fit together.

Apropos documentation, here's a semi-random quote:

    # @fd: file descriptor of an already opened tap
    #
    # @fds: multiple file descriptors of already opened multiqueue capable
    # tap

This is close to useless unless you already know how everything works.

>                              - as that is a USEFUL piece of information
> to know (I can't call command XYZ unlss I also pass an fd) - and then
> you could use that real bit of the introspection rather than your
> blacklist as the mechanism for filtering this command (since anything
> that requires an fd is obviously not a query).

I doubt it's worth the trouble for just two commands.  But let's explore
how it could be done.

Naive attempt: the file descriptor is an implicit parameter, implicit
parameters don't show up in introspection, explicit ones do, so make it
one, say with a new built-in type.

The qemu_chr_fe_get_msgfd(&mon->chr) call moves from qmp_add_fd() to QMP
core.  Introspection shows the file descriptor parameter like any other
parameter.

Flaw: this kind of parameter must be passed differently than all the
others, namely with SCM_RIGHTS, not in JSON text.  Could this confuse
existing users of introspection?  Even if not: is it a good idea?

An obvious alternative is of course adding another optional member to
the command object, say a flag "takes file descriptors via SCM_RIGHTS".
Do we need to express the number of file descriptors it takes?  The
underlying infrastructure supports several (TCP_MAX_FDS in
char-socket.c), but the existing commands take just one.

>> query-qmp-schema reports a few commands that aren't actually
>> available.  See qmp_unregister_commands_hack() for details.  Work
>> around this flaw by accepting CommandNotFound errors, but add a TODO
>> to drop this when the flaw is fixed.
>> 
>> The test can't do queries with arguments, because it knows nothing
>> about the arguments.  No coverage for query-cpu-model-baseline,
>> query-cpu-model-comparison and query-cpu-model-expansion, because
>
> s/because//

Will fix.

>> query-rocker, query-rocker-ports, query-rocker-of-dpa-flows and
>> query-rocker-of-dpa-groups.
>> 
>> We get basic test coverage for the following commands:
>
> Cool!
>
>> 
>>     qom-list-types
>>     query-acpi-ospm-status
>>     query-balloon               (expected to fail)
>
>>     query-vm-generation-id      (expected to fail)
>
>> Most tested commands are expected to succeed.  The test does not check
>> the return value then.  A few commands are expected to fail because
>> they need special arguments to succeed, and this test is too dumb to
>> supply them.
>
> Sounds like it would just be a matter of adding additional command line
> parameters to the qemu being invoked for testing those commands?

In theory, setting up the state required for a query to succeed could be
too complex for this stupid test.

In practice, query-balloon should need just "-device virtio-balloon",
and query-vm-generation-id should need just "-device vmgenid" and ACPI
(I think).  Not all machines can do these devices.  Let's what I can do
in v2.

>> +static int query_error_class(const char *cmd)
>> +{
>> +    static struct {
>> +        const char *cmd;
>> +        int err_class;
>> +    } fails[] = {
>> +        { "query-balloon", ERROR_CLASS_DEVICE_NOT_ACTIVE },
>> +        { "query-vm-generation-id", ERROR_CLASS_GENERIC_ERROR },
>
> But even THIS level of testing of those commands is pretty good!
>
>
>> +static void test_query(const void *data)
>> +{
>> +    const char *cmd = data;
>> +    int expected_error_class = query_error_class(cmd);
>> +    QDict *resp, *error;
>> +    const char *error_class;
>> +
>> +    qtest_start("-nodefaults");
>> +
>> +    resp = qmp("{ 'execute': %s }", cmd);
>
> Oh fun - your patch and my libqtest cleanup series will collide :)

Mine should be trivial to rebase.

>> +static void qmp_schema_init(QmpSchema *schema)
>> +{
>> +    QDict *resp;
>> +    Visitor *qiv;
>> +    SchemaInfoList *tail;
>> +
>> +    qtest_start("-nodefaults");
>> +    resp = qmp("{ 'execute': 'query-qmp-schema' }");
>> +
>> +    qiv = qobject_input_visitor_new(qdict_get(resp, "return"));
>> +    visit_type_SchemaInfoList(qiv, NULL, &schema->list, &error_abort);
>
> It's always fun to see this in action!  Our efforts to add automated
> introspection code generation have been WELL worth the cost in time.

It took a while to put it to productive use.  It's good to be there now.

> Overall, I like the patch.
>
> Reviewed-by: Eric Blake <address@hidden>

Thanks!



reply via email to

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