From: Kevin Wolf <kwolf@redhat.com>
To: qemu-block@nongnu.org
Cc: kwolf@redhat.com, mreitz@redhat.com, pkrempa@redhat.com,
eblake@redhat.com, jcody@redhat.com, jdurgin@redhat.com,
mitake.hitoshi@lab.ntt.co.jp, namei.unix@gmail.com,
qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH v4 11/37] test-qemu-opts: Test qemu_opts_to_qdict_filtered()
Date: Wed, 7 Mar 2018 19:59:20 +0100 [thread overview]
Message-ID: <20180307185946.29366-12-kwolf@redhat.com> (raw)
In-Reply-To: <20180307185946.29366-1-kwolf@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
---
tests/test-qemu-opts.c | 125 +++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 125 insertions(+)
diff --git a/tests/test-qemu-opts.c b/tests/test-qemu-opts.c
index 6c3183390b..2c422abcd4 100644
--- a/tests/test-qemu-opts.c
+++ b/tests/test-qemu-opts.c
@@ -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"
@@ -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[])
{
@@ -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;
}
--
2.13.6
next prev parent reply other threads:[~2018-03-07 19:00 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-03-07 18:59 [Qemu-devel] [PATCH v4 00/37] x-blockdev-create for protocols and qcow2 Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 01/37] block/qapi: Introduce BlockdevCreateOptions Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 02/37] block/qapi: Add qcow2 create options to schema Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 03/37] qcow2: Rename qcow2_co_create2() to qcow2_co_create() Kevin Wolf
2018-03-07 19:13 ` Max Reitz
2018-03-07 19:15 ` Eric Blake
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 04/37] qcow2: Let qcow2_create() handle protocol layer Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 05/37] qcow2: Pass BlockdevCreateOptions to qcow2_co_create() Kevin Wolf
2018-03-07 19:41 ` Eric Blake
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 06/37] qcow2: Use BlockdevRef in qcow2_co_create() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 07/37] qcow2: Use QCryptoBlockCreateOptions " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 08/37] qcow2: Handle full/falloc preallocation " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 09/37] util: Add qemu_opts_to_qdict_filtered() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 10/37] test-qemu-opts: Test qemu_opts_append() Kevin Wolf
2018-03-07 18:59 ` Kevin Wolf [this message]
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 12/37] qdict: Introduce qdict_rename_keys() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 13/37] qcow2: Use visitor for options in qcow2_create() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 14/37] block: Make bdrv_is_whitelisted() public Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 15/37] block: x-blockdev-create QMP command Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 16/37] file-posix: Support .bdrv_co_create Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 17/37] file-win32: " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 18/37] gluster: " Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 19/37] rbd: Fix use after free in qemu_rbd_set_keypairs() error path Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 20/37] rbd: Factor out qemu_rbd_connect() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 21/37] rbd: Remove non-schema options from runtime_opts Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 22/37] rbd: Pass BlockdevOptionsRbd to qemu_rbd_connect() Kevin Wolf
2018-03-07 19:28 ` Max Reitz
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 23/37] rbd: Support .bdrv_co_create Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 24/37] rbd: Assign s->snap/image_name in qemu_rbd_open() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 25/37] rbd: Use qemu_rbd_connect() in qemu_rbd_do_create() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 26/37] nfs: Use QAPI options in nfs_client_open() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 27/37] nfs: Support .bdrv_co_create Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 28/37] sheepdog: QAPIfy "redundancy" create option Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 29/37] sheepdog: Support .bdrv_co_create Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 30/37] ssh: Use QAPI BlockdevOptionsSsh object Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 31/37] ssh: QAPIfy host-key-check option Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 32/37] ssh: Pass BlockdevOptionsSsh to connect_to_ssh() Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 33/37] ssh: Support .bdrv_co_create Kevin Wolf
2018-03-07 19:40 ` Max Reitz
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 34/37] file-posix: Fix no-op bdrv_truncate() with falloc preallocation Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 35/37] block: Fail bdrv_truncate() with negative size Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 36/37] qemu-iotests: Test qcow2 over file image creation with QMP Kevin Wolf
2018-03-07 18:59 ` [Qemu-devel] [PATCH v4 37/37] qemu-iotests: Test ssh image creation over QMP Kevin Wolf
2018-03-07 19:38 ` [Qemu-devel] [PATCH v4 00/37] x-blockdev-create for protocols and qcow2 no-reply
2018-03-08 10:21 ` Daniel P. Berrangé
2018-03-08 11:25 ` Kevin Wolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180307185946.29366-12-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=eblake@redhat.com \
--cc=jcody@redhat.com \
--cc=jdurgin@redhat.com \
--cc=mitake.hitoshi@lab.ntt.co.jp \
--cc=mreitz@redhat.com \
--cc=namei.unix@gmail.com \
--cc=pkrempa@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).