test-qemu-opts: Test qemu_opts_to_qdict_filtered()
Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
parent
575ef8bff6
commit
37974a97d4
@ -10,6 +10,7 @@
|
|||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "qemu/cutils.h"
|
#include "qemu/cutils.h"
|
||||||
#include "qemu/option.h"
|
#include "qemu/option.h"
|
||||||
|
#include "qemu/option_int.h"
|
||||||
#include "qapi/error.h"
|
#include "qapi/error.h"
|
||||||
#include "qapi/qmp/qdict.h"
|
#include "qapi/qmp/qdict.h"
|
||||||
#include "qapi/qmp/qstring.h"
|
#include "qapi/qmp/qstring.h"
|
||||||
@ -868,6 +869,127 @@ static void test_opts_append(void)
|
|||||||
qemu_opts_free(merged);
|
qemu_opts_free(merged);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void test_opts_to_qdict_basic(void)
|
||||||
|
{
|
||||||
|
QemuOpts *opts;
|
||||||
|
QDict *dict;
|
||||||
|
|
||||||
|
opts = qemu_opts_parse(&opts_list_01, "str1=foo,str2=,str3=bar,number1=42",
|
||||||
|
false, &error_abort);
|
||||||
|
g_assert(opts != NULL);
|
||||||
|
|
||||||
|
dict = qemu_opts_to_qdict(opts, NULL);
|
||||||
|
g_assert(dict != NULL);
|
||||||
|
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "str1"), ==, "foo");
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "str2"), ==, "");
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "str3"), ==, "bar");
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "number1"), ==, "42");
|
||||||
|
g_assert_false(qdict_haskey(dict, "number2"));
|
||||||
|
|
||||||
|
QDECREF(dict);
|
||||||
|
qemu_opts_del(opts);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_opts_to_qdict_filtered(void)
|
||||||
|
{
|
||||||
|
QemuOptsList *first, *merged;
|
||||||
|
QemuOpts *opts;
|
||||||
|
QDict *dict;
|
||||||
|
|
||||||
|
first = qemu_opts_append(NULL, &opts_list_02);
|
||||||
|
merged = qemu_opts_append(first, &opts_list_01);
|
||||||
|
|
||||||
|
opts = qemu_opts_parse(merged,
|
||||||
|
"str1=foo,str2=,str3=bar,bool1=off,number1=42",
|
||||||
|
false, &error_abort);
|
||||||
|
g_assert(opts != NULL);
|
||||||
|
|
||||||
|
/* Convert to QDict without deleting from opts */
|
||||||
|
dict = qemu_opts_to_qdict_filtered(opts, NULL, &opts_list_01, false);
|
||||||
|
g_assert(dict != NULL);
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "str1"), ==, "foo");
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "str2"), ==, "");
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "str3"), ==, "bar");
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "number1"), ==, "42");
|
||||||
|
g_assert_false(qdict_haskey(dict, "number2"));
|
||||||
|
g_assert_false(qdict_haskey(dict, "bool1"));
|
||||||
|
QDECREF(dict);
|
||||||
|
|
||||||
|
dict = qemu_opts_to_qdict_filtered(opts, NULL, &opts_list_02, false);
|
||||||
|
g_assert(dict != NULL);
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "str1"), ==, "foo");
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "str2"), ==, "");
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "bool1"), ==, "off");
|
||||||
|
g_assert_false(qdict_haskey(dict, "str3"));
|
||||||
|
g_assert_false(qdict_haskey(dict, "number1"));
|
||||||
|
g_assert_false(qdict_haskey(dict, "number2"));
|
||||||
|
QDECREF(dict);
|
||||||
|
|
||||||
|
/* Now delete converted options from opts */
|
||||||
|
dict = qemu_opts_to_qdict_filtered(opts, NULL, &opts_list_01, true);
|
||||||
|
g_assert(dict != NULL);
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "str1"), ==, "foo");
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "str2"), ==, "");
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "str3"), ==, "bar");
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "number1"), ==, "42");
|
||||||
|
g_assert_false(qdict_haskey(dict, "number2"));
|
||||||
|
g_assert_false(qdict_haskey(dict, "bool1"));
|
||||||
|
QDECREF(dict);
|
||||||
|
|
||||||
|
dict = qemu_opts_to_qdict_filtered(opts, NULL, &opts_list_02, true);
|
||||||
|
g_assert(dict != NULL);
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "bool1"), ==, "off");
|
||||||
|
g_assert_false(qdict_haskey(dict, "str1"));
|
||||||
|
g_assert_false(qdict_haskey(dict, "str2"));
|
||||||
|
g_assert_false(qdict_haskey(dict, "str3"));
|
||||||
|
g_assert_false(qdict_haskey(dict, "number1"));
|
||||||
|
g_assert_false(qdict_haskey(dict, "number2"));
|
||||||
|
QDECREF(dict);
|
||||||
|
|
||||||
|
g_assert_true(QTAILQ_EMPTY(&opts->head));
|
||||||
|
|
||||||
|
qemu_opts_del(opts);
|
||||||
|
qemu_opts_free(merged);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_opts_to_qdict_duplicates(void)
|
||||||
|
{
|
||||||
|
QemuOpts *opts;
|
||||||
|
QemuOpt *opt;
|
||||||
|
QDict *dict;
|
||||||
|
|
||||||
|
opts = qemu_opts_parse(&opts_list_03, "foo=a,foo=b", false, &error_abort);
|
||||||
|
g_assert(opts != NULL);
|
||||||
|
|
||||||
|
/* Verify that opts has two options with the same name */
|
||||||
|
opt = QTAILQ_FIRST(&opts->head);
|
||||||
|
g_assert_cmpstr(opt->name, ==, "foo");
|
||||||
|
g_assert_cmpstr(opt->str , ==, "a");
|
||||||
|
|
||||||
|
opt = QTAILQ_NEXT(opt, next);
|
||||||
|
g_assert_cmpstr(opt->name, ==, "foo");
|
||||||
|
g_assert_cmpstr(opt->str , ==, "b");
|
||||||
|
|
||||||
|
opt = QTAILQ_NEXT(opt, next);
|
||||||
|
g_assert(opt == NULL);
|
||||||
|
|
||||||
|
/* In the conversion to QDict, the last one wins */
|
||||||
|
dict = qemu_opts_to_qdict(opts, NULL);
|
||||||
|
g_assert(dict != NULL);
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "foo"), ==, "b");
|
||||||
|
QDECREF(dict);
|
||||||
|
|
||||||
|
/* The last one still wins if entries are deleted, and both are deleted */
|
||||||
|
dict = qemu_opts_to_qdict_filtered(opts, NULL, NULL, true);
|
||||||
|
g_assert(dict != NULL);
|
||||||
|
g_assert_cmpstr(qdict_get_str(dict, "foo"), ==, "b");
|
||||||
|
QDECREF(dict);
|
||||||
|
|
||||||
|
g_assert_true(QTAILQ_EMPTY(&opts->head));
|
||||||
|
|
||||||
|
qemu_opts_del(opts);
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
@ -889,6 +1011,9 @@ int main(int argc, char *argv[])
|
|||||||
g_test_add_func("/qemu-opts/opts_parse/size", test_opts_parse_size);
|
g_test_add_func("/qemu-opts/opts_parse/size", test_opts_parse_size);
|
||||||
g_test_add_func("/qemu-opts/append_to_null", test_opts_append_to_null);
|
g_test_add_func("/qemu-opts/append_to_null", test_opts_append_to_null);
|
||||||
g_test_add_func("/qemu-opts/append", test_opts_append);
|
g_test_add_func("/qemu-opts/append", test_opts_append);
|
||||||
|
g_test_add_func("/qemu-opts/to_qdict/basic", test_opts_to_qdict_basic);
|
||||||
|
g_test_add_func("/qemu-opts/to_qdict/filtered", test_opts_to_qdict_filtered);
|
||||||
|
g_test_add_func("/qemu-opts/to_qdict/duplicates", test_opts_to_qdict_duplicates);
|
||||||
g_test_run();
|
g_test_run();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user