qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH v3] QemuOpt: add unit tests


From: Leandro Dorileo
Subject: Re: [Qemu-devel] [PATCH v3] QemuOpt: add unit tests
Date: Mon, 28 Apr 2014 18:55:02 +0000
User-agent: Mutt/1.5.23 (2014-03-12)

ping?


On Tue, Mar 25, 2014 at 10:27:19AM -0300, Leandro Dorileo wrote:
> Cover basic aspects and API usage for QemuOpt. The current implementation
> covers the API's planned to be changed by Chunyan Liu in his 
> QEMUOptionParameter
> replacement/cleanup job.
> 
> Other APIs should be covered in future improvements.
> 
> Signed-off-by: Leandro Dorileo <address@hidden>
> Reviewed-by: Eric Blake <address@hidden>
> ---
>  tests/Makefile         |   3 +
>  tests/test-qemu-opts.c | 455 
> +++++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 458 insertions(+)
>  create mode 100644 tests/test-qemu-opts.c
> 
> diff --git a/tests/Makefile b/tests/Makefile
> index 471b4c8..4814283 100644
> --- a/tests/Makefile
> +++ b/tests/Makefile
> @@ -60,6 +60,8 @@ check-unit-y += tests/test-qdev-global-props$(EXESUF)
>  check-unit-y += tests/check-qom-interface$(EXESUF)
>  gcov-files-check-qom-interface-y = qom/object.c
>  check-unit-y += tests/test-vmstate$(EXESUF)
> +check-unit-y += tests/test-qemu-opts$(EXESUF)
> +gcov-files-test-qemu-opts-y = qom/test-qemu-opts.c
>  
>  check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh
>  
> @@ -272,6 +274,7 @@ tests/qom-test$(EXESUF): tests/qom-test.o
>  tests/blockdev-test$(EXESUF): tests/blockdev-test.o $(libqos-pc-obj-y)
>  tests/qdev-monitor-test$(EXESUF): tests/qdev-monitor-test.o 
> $(libqos-pc-obj-y)
>  tests/qemu-iotests/socket_scm_helper$(EXESUF): 
> tests/qemu-iotests/socket_scm_helper.o
> +tests/test-qemu-opts$(EXESUF): tests/test-qemu-opts.o libqemuutil.a 
> libqemustub.a
>  
>  # QTest rules
>  
> diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c
> new file mode 100644
> index 0000000..abd2fb8
> --- /dev/null
> +++ b/tests/test-qemu-opts.c
> @@ -0,0 +1,455 @@
> +/*
> + * QemuOpts unit-tests.
> + *
> + * Copyright (C) 2014 Leandro Dorileo <address@hidden>
> + *
> + * This work is licensed under the terms of the GNU LGPL, version 2.1 or 
> later.
> + * See the COPYING.LIB file in the top-level directory.
> + */
> +
> +#include "qapi/error.h"
> +#include "qapi/qmp/qstring.h"
> +#include "qemu/config-file.h"
> +
> +#include <glib.h>
> +#include <string.h>
> +
> +static QemuOptsList opts_list_01 = {
> +    .name = "opts_list_01",
> +    .head = QTAILQ_HEAD_INITIALIZER(opts_list_01.head),
> +    .desc = {
> +        {
> +            .name = "str1",
> +            .type = QEMU_OPT_STRING,
> +        },{
> +            .name = "str2",
> +            .type = QEMU_OPT_STRING,
> +        },{
> +            .name = "str3",
> +            .type = QEMU_OPT_STRING,
> +        },{
> +            .name = "number1",
> +            .type = QEMU_OPT_NUMBER,
> +        },
> +        { /* end of list */ }
> +    },
> +};
> +
> +static QemuOptsList opts_list_02 = {
> +    .name = "opts_list_02",
> +    .head = QTAILQ_HEAD_INITIALIZER(opts_list_02.head),
> +    .desc = {
> +        {
> +            .name = "str1",
> +            .type = QEMU_OPT_STRING,
> +        },{
> +            .name = "bool1",
> +            .type = QEMU_OPT_BOOL,
> +        },{
> +            .name = "str2",
> +            .type = QEMU_OPT_STRING,
> +        },{
> +            .name = "size1",
> +            .type = QEMU_OPT_SIZE,
> +        },
> +        { /* end of list */ }
> +    },
> +};
> +
> +QemuOptsList opts_list_03 = {
> +    .name = "opts_list_03",
> +    .head = QTAILQ_HEAD_INITIALIZER(opts_list_03.head),
> +    .desc = {
> +        /* no elements => accept any params */
> +        { /* end of list */ }
> +    },
> +};
> +
> +static void register_opts(void)
> +{
> +    qemu_add_opts(&opts_list_01);
> +    qemu_add_opts(&opts_list_02);
> +    qemu_add_opts(&opts_list_03);
> +}
> +
> +static void test_find_unknown_opts(void)
> +{
> +    QemuOptsList *list;
> +
> +    register_opts();
> +
> +    /* should not return anything, we don't have an "unknown" option */
> +    list = qemu_find_opts("unknown");
> +    g_assert(list == NULL);
> +}
> +
> +static void test_qemu_find_opts(void)
> +{
> +    QemuOptsList *list;
> +
> +    register_opts();
> +
> +    /* we have an "opts_list_01" option, should return it */
> +    list = qemu_find_opts("opts_list_01");
> +    g_assert(list != NULL);
> +    g_assert_cmpstr(list->name, ==, "opts_list_01");
> +}
> +
> +static void test_qemu_opts_create(void)
> +{
> +    QemuOptsList *list;
> +    QemuOpts *opts;
> +
> +    register_opts();
> +
> +    list = qemu_find_opts("opts_list_01");
> +    g_assert(list != NULL);
> +    g_assert(QTAILQ_EMPTY(&list->head));
> +    g_assert_cmpstr(list->name, ==, "opts_list_01");
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +
> +    /* create the opts */
> +    opts = qemu_opts_create(list, NULL, 0, &error_abort);
> +    g_assert(opts != NULL);
> +    g_assert(!QTAILQ_EMPTY(&list->head));
> +
> +    /* now we've create the opts, must find it */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts != NULL);
> +
> +    qemu_opts_del(opts);
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +}
> +
> +static void test_qemu_opt_get(void)
> +{
> +    QemuOptsList *list;
> +    QemuOpts *opts;
> +    const char *opt = NULL;
> +
> +    register_opts();
> +
> +    list = qemu_find_opts("opts_list_01");
> +    g_assert(list != NULL);
> +    g_assert(QTAILQ_EMPTY(&list->head));
> +    g_assert_cmpstr(list->name, ==, "opts_list_01");
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +
> +    /* create the opts */
> +    opts = qemu_opts_create(list, NULL, 0, &error_abort);
> +    g_assert(opts != NULL);
> +    g_assert(!QTAILQ_EMPTY(&list->head));
> +
> +    /* haven't set anything to str2 yet */
> +    opt = qemu_opt_get(opts, "str2");
> +    g_assert(opt == NULL);
> +
> +    qemu_opt_set(opts, "str2", "value");
> +
> +    /* now we have set str2, should know about it */
> +    opt = qemu_opt_get(opts, "str2");
> +    g_assert_cmpstr(opt, ==, "value");
> +
> +    qemu_opt_set(opts, "str2", "value2");
> +
> +    /* having reset the value, the returned should be the reset one */
> +    opt = qemu_opt_get(opts, "str2");
> +    g_assert_cmpstr(opt, ==, "value2");
> +
> +    qemu_opts_del(opts);
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +}
> +
> +static void test_qemu_opt_get_bool(void)
> +{
> +    QemuOptsList *list;
> +    QemuOpts *opts;
> +    bool opt;
> +    int ret;
> +
> +    register_opts();
> +
> +    list = qemu_find_opts("opts_list_02");
> +    g_assert(list != NULL);
> +    g_assert(QTAILQ_EMPTY(&list->head));
> +    g_assert_cmpstr(list->name, ==, "opts_list_02");
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +
> +    /* create the opts */
> +    opts = qemu_opts_create(list, NULL, 0, &error_abort);
> +    g_assert(opts != NULL);
> +    g_assert(!QTAILQ_EMPTY(&list->head));
> +
> +    /* haven't set anything to bool1 yet, so defval should be returned */
> +    opt = qemu_opt_get_bool(opts, "bool1", false);
> +    g_assert(opt == false);
> +
> +    ret = qemu_opt_set_bool(opts, "bool1", true);
> +    g_assert(ret == 0);
> +
> +    /* now we have set bool1, should know about it */
> +    opt = qemu_opt_get_bool(opts, "bool1", false);
> +    g_assert(opt == true);
> +
> +    /* having reset the value, opt should be the reset one not defval */
> +    ret = qemu_opt_set_bool(opts, "bool1", false);
> +    g_assert(ret == 0);
> +
> +    opt = qemu_opt_get_bool(opts, "bool1", true);
> +    g_assert(opt == false);
> +
> +    qemu_opts_del(opts);
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +}
> +
> +static void test_qemu_opt_get_number(void)
> +{
> +    QemuOptsList *list;
> +    QemuOpts *opts;
> +    uint64_t opt;
> +    int ret;
> +
> +    register_opts();
> +
> +    list = qemu_find_opts("opts_list_01");
> +    g_assert(list != NULL);
> +    g_assert(QTAILQ_EMPTY(&list->head));
> +    g_assert_cmpstr(list->name, ==, "opts_list_01");
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +
> +    /* create the opts */
> +    opts = qemu_opts_create(list, NULL, 0, &error_abort);
> +    g_assert(opts != NULL);
> +    g_assert(!QTAILQ_EMPTY(&list->head));
> +
> +    /* haven't set anything to number1 yet, so defval should be returned */
> +    opt = qemu_opt_get_number(opts, "number1", 5);
> +    g_assert(opt == 5);
> +
> +    ret = qemu_opt_set_number(opts, "number1", 10);
> +    g_assert(ret == 0);
> +
> +    /* now we have set number1, should know about it */
> +    opt = qemu_opt_get_number(opts, "number1", 5);
> +    g_assert(opt == 10);
> +
> +    /* having reset it, the returned should be the reset one not defval */
> +    ret = qemu_opt_set_number(opts, "number1", 15);
> +    g_assert(ret == 0);
> +
> +    opt = qemu_opt_get_number(opts, "number1", 5);
> +    g_assert(opt == 15);
> +
> +    qemu_opts_del(opts);
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +}
> +
> +static void test_qemu_opt_get_size(void)
> +{
> +    QemuOptsList *list;
> +    QemuOpts *opts;
> +    uint64_t opt;
> +    QDict *dict;
> +
> +    register_opts();
> +
> +    list = qemu_find_opts("opts_list_02");
> +    g_assert(list != NULL);
> +    g_assert(QTAILQ_EMPTY(&list->head));
> +    g_assert_cmpstr(list->name, ==, "opts_list_02");
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +
> +    /* create the opts */
> +    opts = qemu_opts_create(list, NULL, 0, &error_abort);
> +    g_assert(opts != NULL);
> +    g_assert(!QTAILQ_EMPTY(&list->head));
> +
> +    /* haven't set anything to size1 yet, so defval should be returned */
> +    opt = qemu_opt_get_size(opts, "size1", 5);
> +    g_assert(opt == 5);
> +
> +    dict = qdict_new();
> +    g_assert(dict != NULL);
> +
> +    qdict_put(dict, "size1", qstring_from_str("10"));
> +
> +    qemu_opts_absorb_qdict(opts, dict, &error_abort);
> +    g_assert(error_abort == NULL);
> +
> +    /* now we have set size1, should know about it */
> +    opt = qemu_opt_get_size(opts, "size1", 5);
> +    g_assert(opt == 10);
> +
> +    /* reset value */
> +    qdict_put(dict, "size1", qstring_from_str("15"));
> +
> +    qemu_opts_absorb_qdict(opts, dict, &error_abort);
> +    g_assert(error_abort == NULL);
> +
> +    /* test the reset value */
> +    opt = qemu_opt_get_size(opts, "size1", 5);
> +    g_assert(opt == 15);
> +
> +    qdict_del(dict, "size1");
> +    g_free(dict);
> +
> +    qemu_opts_del(opts);
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +}
> +
> +static void test_qemu_opt_unset(void)
> +{
> +    QemuOpts *opts;
> +    const char *value;
> +    int ret;
> +
> +    /* dinamically initialized (parsed) opts */
> +    opts = qemu_opts_parse(&opts_list_03, "key=value", 0);
> +    g_assert(opts != NULL);
> +
> +    /* check default/parsed value */
> +    value = qemu_opt_get(opts, "key");
> +    g_assert_cmpstr(value, ==, "value");
> +
> +    /* reset it to value2 */
> +    qemu_opt_set(opts, "key", "value2");
> +
> +    value = qemu_opt_get(opts, "key");
> +    g_assert_cmpstr(value, ==, "value2");
> +
> +    /* unset, valid only for "accept any" */
> +    ret = qemu_opt_unset(opts, "key");
> +    g_assert(ret == 0);
> +
> +    /* after reset the value should be the parsed/default one */
> +    value = qemu_opt_get(opts, "key");
> +    g_assert_cmpstr(value, ==, "value");
> +
> +    qemu_opts_del(opts);
> +}
> +
> +static void test_qemu_opts_reset(void)
> +{
> +    QemuOptsList *list;
> +    QemuOpts *opts;
> +    uint64_t opt;
> +    int ret;
> +
> +    register_opts();
> +
> +    list = qemu_find_opts("opts_list_01");
> +    g_assert(list != NULL);
> +    g_assert(QTAILQ_EMPTY(&list->head));
> +    g_assert_cmpstr(list->name, ==, "opts_list_01");
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +
> +    /* create the opts */
> +    opts = qemu_opts_create(list, NULL, 0, &error_abort);
> +    g_assert(opts != NULL);
> +    g_assert(!QTAILQ_EMPTY(&list->head));
> +
> +    /* haven't set anything to number1 yet, so defval should be returned */
> +    opt = qemu_opt_get_number(opts, "number1", 5);
> +    g_assert(opt == 5);
> +
> +    ret = qemu_opt_set_number(opts, "number1", 10);
> +    g_assert(ret == 0);
> +
> +    /* now we have set number1, should know about it */
> +    opt = qemu_opt_get_number(opts, "number1", 5);
> +    g_assert(opt == 10);
> +
> +    qemu_opts_reset(list);
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +}
> +
> +static void test_qemu_opts_set(void)
> +{
> +    QemuOptsList *list;
> +    QemuOpts *opts;
> +    int ret;
> +    const char *opt;
> +
> +    register_opts();
> +
> +    list = qemu_find_opts("opts_list_01");
> +    g_assert(list != NULL);
> +    g_assert(QTAILQ_EMPTY(&list->head));
> +    g_assert_cmpstr(list->name, ==, "opts_list_01");
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +
> +    /* implicitly create opts and set str3 value */
> +    ret = qemu_opts_set(list, NULL, "str3", "value");
> +    g_assert(ret == 0);
> +    g_assert(!QTAILQ_EMPTY(&list->head));
> +
> +    /* get the just created opts */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts != NULL);
> +
> +    /* check the str3 value */
> +    opt = qemu_opt_get(opts, "str3");
> +    g_assert_cmpstr(opt, ==, "value");
> +
> +    qemu_opts_del(opts);
> +
> +    /* should not find anything at this point */
> +    opts = qemu_opts_find(list, NULL);
> +    g_assert(opts == NULL);
> +}
> +
> +int main(int argc, char *argv[])
> +{
> +    g_test_init(&argc, &argv, NULL);
> +    g_test_add_func("/qemu-opts/find_unknown_opts", test_find_unknown_opts);
> +    g_test_add_func("/qemu-opts/find_opts", test_qemu_find_opts);
> +    g_test_add_func("/qemu-opts/opts_create", test_qemu_opts_create);
> +    g_test_add_func("/qemu-opts/opt_get", test_qemu_opt_get);
> +    g_test_add_func("/qemu-opts/opt_get_bool", test_qemu_opt_get_bool);
> +    g_test_add_func("/qemu-opts/opt_get_number", test_qemu_opt_get_number);
> +    g_test_add_func("/qemu-opts/opt_get_size", test_qemu_opt_get_size);
> +    g_test_add_func("/qemu-opts/opt_unset", test_qemu_opt_unset);
> +    g_test_add_func("/qemu-opts/opts_reset", test_qemu_opts_reset);
> +    g_test_add_func("/qemu-opts/opts_set", test_qemu_opts_set);
> +    g_test_run();
> +    return 0;
> +}
> -- 
> 1.9.1
> 

-- 
Leandro Dorileo



reply via email to

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