[libvirt] [PATCH 2/6] tests: qemu: Add support for testing aguments on monitor verbatim

John Ferlan jferlan at redhat.com
Wed Oct 5 13:37:50 UTC 2016



On 09/27/2016 12:39 PM, Peter Krempa wrote:
> Add code that takes a string and matches it against the data passed as
> arguments from qemu. This is a simpler version of
> qemuMonitorTestAddItemParams.
> ---
>  tests/qemumonitortestutils.c | 112 +++++++++++++++++++++++++++++++++++++++++++
>  tests/qemumonitortestutils.h |   6 +++
>  2 files changed, 118 insertions(+)
> 
> diff --git a/tests/qemumonitortestutils.c b/tests/qemumonitortestutils.c
> index c86a27a..50bf174 100644
> --- a/tests/qemumonitortestutils.c
> +++ b/tests/qemumonitortestutils.c
> @@ -439,6 +439,7 @@ struct qemuMonitorTestHandlerData {
>      char *response;
>      size_t nargs;
>      qemuMonitorTestCommandArgsPtr args;
> +    char *expectArgs;
>  };
> 
>  static void
> @@ -458,6 +459,7 @@ qemuMonitorTestHandlerDataFree(void *opaque)
>      VIR_FREE(data->command_name);
>      VIR_FREE(data->response);
>      VIR_FREE(data->args);
> +    VIR_FREE(data->expectArgs);
>      VIR_FREE(data);
>  }
> 
> @@ -668,6 +670,7 @@ qemuMonitorTestProcessCommandWithArgs(qemuMonitorTestPtr test,
>  }
> 
> 
> +

Technically extra line, but I'll assume it's making possible for the 2
lines between functions...

>  /* this allows to add a responder that is able to check
>   * a (shallow) structure of arguments for a command */
>  int
> @@ -721,6 +724,115 @@ qemuMonitorTestAddItemParams(qemuMonitorTestPtr test,
>  }
> 
> 
> +static int
> +qemuMonitorTestProcessCommandWithArgStr(qemuMonitorTestPtr test,
> +                                        qemuMonitorTestItemPtr item,
> +                                        const char *cmdstr)
> +{
> +    struct qemuMonitorTestHandlerData *data = item->opaque;
> +    virJSONValuePtr val = NULL;
> +    virJSONValuePtr args;
> +    char *argstr = NULL;
> +    const char *cmdname;
> +    int ret = -1;
> +
> +    if (!(val = virJSONValueFromString(cmdstr)))
> +        return -1;
> +
> +    if (!(cmdname = virJSONValueObjectGetString(val, "execute"))) {
> +        ret = qemuMonitorReportError(test, "Missing command name in %s", cmdstr);
> +        goto cleanup;
> +    }
> +
> +    if (STRNEQ(data->command_name, cmdname)) {
> +        ret = qemuMonitorTestAddUnexpectedErrorResponse(test);
> +        goto cleanup;
> +    }
> +
> +    if (!(args = virJSONValueObjectGet(val, "arguments"))) {
> +        ret = qemuMonitorReportError(test,
> +                                     "Missing arguments section for command '%s'",
> +                                     data->command_name);
> +        goto cleanup;
> +    }
> +
> +    /* convert the arguments to string */
> +    if (!(argstr = virJSONValueToString(args, false)))
> +        goto cleanup;
> +
> +    /* verify that the argument value is expected */
> +    if (STRNEQ(argstr, data->expectArgs)) {
> +        ret = qemuMonitorReportError(test,
> +                                     "%s: expected arguments: '%s', got: '%s'",
> +                                     data->command_name,
> +                                     data->expectArgs, argstr);
> +        goto cleanup;
> +    }
> +
> +
> +    VIR_FREE(argstr);

This one's duplicitous since we fall through to cleanup

> +
> +    /* arguments checked out, return the response */
> +    ret = qemuMonitorTestAddResponse(test, data->response);
> +
> + cleanup:
> +    VIR_FREE(argstr);
> +    virJSONValueFree(val);
> +    return ret;
> +}
> +
> +
> +/**
> + * qemuMonitorTestAddItemExpect:
> + *
> + * @test: test monitor object
> + * @cmdname: command name
> + * @cmdargs: expected arguments of the command
> + * @apostrophe: convert apostrophes (') in @cmdargs to quotes (")
> + * @response: simulated response of the command
> + *
> + * Simulates a qemu monitor command. Checks that the 'arguments' of the qmp
> + * command are expected. If @apostrophe is true apostrophes are converted to
> + * quotes for simplification of writing the strings into code.
> + */
> +int
> +qemuMonitorTestAddItemExpect(qemuMonitorTestPtr test,
> +                             const char *cmdname,
> +                             const char *cmdargs,
> +                             bool apostrophe,
> +                             const char *response)
> +{
> +    struct qemuMonitorTestHandlerData *data;
> +
> +    if (VIR_ALLOC(data) < 0)
> +        goto error;
> +
> +    if (VIR_STRDUP(data->command_name, cmdname) < 0 ||
> +        VIR_STRDUP(data->response, response) < 0 ||
> +        VIR_STRDUP(data->expectArgs, cmdargs) < 0)
> +        goto error;
> +
> +    if (apostrophe) {
> +        char *tmp = data->expectArgs;
> +
> +        while (*tmp != '\0') {
> +            if (*tmp == '\'')
> +                *tmp = '"';
> +
> +            tmp++;
> +        }

Would there ever be a time when apostrophe would be false?

ACK with at least the duplicitous free resolved. Your call on the above
loop.

John

> +    }
> +
> +    return qemuMonitorTestAddHandler(test,
> +                                     qemuMonitorTestProcessCommandWithArgStr,
> +                                     data, qemuMonitorTestHandlerDataFree);
> +
> + error:
> +    qemuMonitorTestHandlerDataFree(data);
> +    return -1;
> +}
> +
> +
>  static void
>  qemuMonitorTestEOFNotify(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
>                           virDomainObjPtr vm ATTRIBUTE_UNUSED,
> diff --git a/tests/qemumonitortestutils.h b/tests/qemumonitortestutils.h
> index 8e2f371..3890cd4 100644
> --- a/tests/qemumonitortestutils.h
> +++ b/tests/qemumonitortestutils.h
> @@ -60,6 +60,12 @@ int qemuMonitorTestAddItemParams(qemuMonitorTestPtr test,
>                                   ...)
>      ATTRIBUTE_SENTINEL;
> 
> +int qemuMonitorTestAddItemExpect(qemuMonitorTestPtr test,
> +                                 const char *cmdname,
> +                                 const char *cmdargs,
> +                                 bool apostrophe,
> +                                 const char *response);
> +
>  # define qemuMonitorTestNewSimple(json, xmlopt) \
>      qemuMonitorTestNew(json, xmlopt, NULL, NULL, NULL)
> 




More information about the libvir-list mailing list