Loading tests/test-qemu-opts.c +125 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ #include "qemu/osdep.h" #include "qemu/cutils.h" #include "qemu/option.h" #include "qemu/option_int.h" #include "qapi/error.h" #include "qapi/qmp/qdict.h" #include "qapi/qmp/qstring.h" Loading Loading @@ -868,6 +869,127 @@ static void test_opts_append(void) 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[]) { Loading @@ -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/append_to_null", test_opts_append_to_null); 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(); return 0; } Loading
tests/test-qemu-opts.c +125 −0 Original line number Diff line number Diff line Loading @@ -10,6 +10,7 @@ #include "qemu/osdep.h" #include "qemu/cutils.h" #include "qemu/option.h" #include "qemu/option_int.h" #include "qapi/error.h" #include "qapi/qmp/qdict.h" #include "qapi/qmp/qstring.h" Loading Loading @@ -868,6 +869,127 @@ static void test_opts_append(void) 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[]) { Loading @@ -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/append_to_null", test_opts_append_to_null); 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(); return 0; }