aboutsummaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/.gitignore1
-rw-r--r--tests/Makefile.include4
-rw-r--r--tests/check-qjson.c8
-rw-r--r--tests/check-qnull.c17
-rw-r--r--tests/test-clone-visitor.c206
-rw-r--r--tests/test-opts-visitor.c9
-rw-r--r--tests/test-qmp-commands.c8
-rw-r--r--tests/test-qmp-input-strict.c13
-rw-r--r--tests/test-qmp-input-visitor.c15
-rw-r--r--tests/test-qmp-output-visitor.c92
-rw-r--r--tests/test-string-input-visitor.c22
-rw-r--r--tests/test-string-output-visitor.c99
-rw-r--r--tests/test-visitor-serialization.c41
13 files changed, 342 insertions, 193 deletions
diff --git a/tests/.gitignore b/tests/.gitignore
index 840ea396ab..dbb52639f6 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -13,6 +13,7 @@ test-aio
test-base64
test-bitops
test-blockjob-txn
+test-clone-visitor
test-coroutine
test-crypto-afsplit
test-crypto-block
diff --git a/tests/Makefile.include b/tests/Makefile.include
index f8e3c6b35a..2010b11b6c 100644
--- a/tests/Makefile.include
+++ b/tests/Makefile.include
@@ -22,6 +22,8 @@ check-unit-y += tests/check-qjson$(EXESUF)
gcov-files-check-qjson-y = qobject/qjson.c
check-unit-y += tests/test-qmp-output-visitor$(EXESUF)
gcov-files-test-qmp-output-visitor-y = qapi/qmp-output-visitor.c
+check-unit-y += tests/test-clone-visitor$(EXESUF)
+gcov-files-test-clone-visitor-y = qapi/qapi-clone-visitor.c
check-unit-y += tests/test-qmp-input-visitor$(EXESUF)
gcov-files-test-qmp-input-visitor-y = qapi/qmp-input-visitor.c
check-unit-y += tests/test-qmp-input-strict$(EXESUF)
@@ -402,6 +404,7 @@ test-obj-y = tests/check-qint.o tests/check-qstring.o tests/check-qdict.o \
tests/check-qjson.o \
tests/test-coroutine.o tests/test-string-output-visitor.o \
tests/test-string-input-visitor.o tests/test-qmp-output-visitor.o \
+ tests/test-clone-visitor.o \
tests/test-qmp-input-visitor.o tests/test-qmp-input-strict.o \
tests/test-qmp-commands.o tests/test-visitor-serialization.o \
tests/test-x86-cpuid.o tests/test-mul64.o tests/test-int128.o \
@@ -499,6 +502,7 @@ tests/test-string-output-visitor$(EXESUF): tests/test-string-output-visitor.o $(
tests/test-string-input-visitor$(EXESUF): tests/test-string-input-visitor.o $(test-qapi-obj-y)
tests/test-qmp-event$(EXESUF): tests/test-qmp-event.o $(test-qapi-obj-y)
tests/test-qmp-output-visitor$(EXESUF): tests/test-qmp-output-visitor.o $(test-qapi-obj-y)
+tests/test-clone-visitor$(EXESUF): tests/test-clone-visitor.o $(test-qapi-obj-y)
tests/test-qmp-input-visitor$(EXESUF): tests/test-qmp-input-visitor.o $(test-qapi-obj-y)
tests/test-qmp-input-strict$(EXESUF): tests/test-qmp-input-strict.o $(test-qapi-obj-y)
tests/test-qmp-commands$(EXESUF): tests/test-qmp-commands.o tests/test-qmp-marshal.o $(test-qapi-obj-y)
diff --git a/tests/check-qjson.c b/tests/check-qjson.c
index 0e158f6eac..85955744eb 100644
--- a/tests/check-qjson.c
+++ b/tests/check-qjson.c
@@ -12,14 +12,8 @@
*/
#include "qemu/osdep.h"
-#include "qapi/qmp/qstring.h"
-#include "qapi/qmp/qint.h"
-#include "qapi/qmp/qdict.h"
-#include "qapi/qmp/qlist.h"
-#include "qapi/qmp/qfloat.h"
-#include "qapi/qmp/qbool.h"
+#include "qapi/qmp/types.h"
#include "qapi/qmp/qjson.h"
-
#include "qemu-common.h"
static void escaped_string(void)
diff --git a/tests/check-qnull.c b/tests/check-qnull.c
index 05d562d494..dc906b116e 100644
--- a/tests/check-qnull.c
+++ b/tests/check-qnull.c
@@ -37,8 +37,7 @@ static void qnull_ref_test(void)
static void qnull_visit_test(void)
{
QObject *obj;
- QmpOutputVisitor *qov;
- QmpInputVisitor *qiv;
+ Visitor *v;
/*
* Most tests of interactions between QObject and visitors are in
@@ -48,17 +47,17 @@ static void qnull_visit_test(void)
g_assert(qnull_.refcnt == 1);
obj = qnull();
- qiv = qmp_input_visitor_new(obj, true);
+ v = qmp_input_visitor_new(obj, true);
qobject_decref(obj);
- visit_type_null(qmp_input_get_visitor(qiv), NULL, &error_abort);
- qmp_input_visitor_cleanup(qiv);
+ visit_type_null(v, NULL, &error_abort);
+ visit_free(v);
- qov = qmp_output_visitor_new();
- visit_type_null(qmp_output_get_visitor(qov), NULL, &error_abort);
- obj = qmp_output_get_qobject(qov);
+ v = qmp_output_visitor_new(&obj);
+ visit_type_null(v, NULL, &error_abort);
+ visit_complete(v, &obj);
g_assert(obj == &qnull_);
qobject_decref(obj);
- qmp_output_visitor_cleanup(qov);
+ visit_free(v);
g_assert(qnull_.refcnt == 1);
}
diff --git a/tests/test-clone-visitor.c b/tests/test-clone-visitor.c
new file mode 100644
index 0000000000..df0c045512
--- /dev/null
+++ b/tests/test-clone-visitor.c
@@ -0,0 +1,206 @@
+/*
+ * QAPI Clone Visitor unit-tests.
+ *
+ * Copyright (C) 2016 Red Hat Inc.
+ *
+ * This work is licensed under the terms of the GNU GPL, version 2 or later.
+ * See the COPYING file in the top-level directory.
+ */
+
+#include "qemu/osdep.h"
+#include <glib.h>
+
+#include "qemu-common.h"
+#include "qapi/clone-visitor.h"
+#include "test-qapi-types.h"
+#include "test-qapi-visit.h"
+#include "qapi/qmp/types.h"
+
+static void test_clone_struct(void)
+{
+ UserDefOne *src, *dst;
+
+ src = g_new0(UserDefOne, 1);
+ src->integer = 42;
+ src->string = g_strdup("Hello");
+ src->has_enum1 = false;
+ src->enum1 = ENUM_ONE_VALUE2;
+
+ dst = QAPI_CLONE(UserDefOne, src);
+ g_assert(dst);
+ g_assert_cmpint(dst->integer, ==, 42);
+ g_assert(dst->string != src->string);
+ g_assert_cmpstr(dst->string, ==, "Hello");
+ g_assert_cmpint(dst->has_enum1, ==, false);
+ /* Our implementation does this, but it is not required:
+ g_assert_cmpint(dst->enum1, ==, ENUM_ONE_VALUE2);
+ */
+
+ qapi_free_UserDefOne(src);
+ qapi_free_UserDefOne(dst);
+}
+
+static void test_clone_alternate(void)
+{
+ AltStrBool *b_src, *s_src, *b_dst, *s_dst;
+
+ b_src = g_new0(AltStrBool, 1);
+ b_src->type = QTYPE_QBOOL;
+ b_src->u.b = true;
+ s_src = g_new0(AltStrBool, 1);
+ s_src->type = QTYPE_QSTRING;
+ s_src->u.s = g_strdup("World");
+
+ b_dst = QAPI_CLONE(AltStrBool, b_src);
+ g_assert(b_dst);
+ g_assert_cmpint(b_dst->type, ==, b_src->type);
+ g_assert_cmpint(b_dst->u.b, ==, b_src->u.b);
+ s_dst = QAPI_CLONE(AltStrBool, s_src);
+ g_assert(s_dst);
+ g_assert_cmpint(s_dst->type, ==, s_src->type);
+ g_assert_cmpstr(s_dst->u.s, ==, s_src->u.s);
+ g_assert(s_dst->u.s != s_src->u.s);
+
+ qapi_free_AltStrBool(b_src);
+ qapi_free_AltStrBool(s_src);
+ qapi_free_AltStrBool(b_dst);
+ qapi_free_AltStrBool(s_dst);
+}
+
+static void test_clone_native_list(void)
+{
+ uint8List *src, *dst;
+ uint8List *tmp = NULL;
+ int i;
+
+ /* Build list in reverse */
+ for (i = 10; i; i--) {
+ src = g_new0(uint8List, 1);
+ src->next = tmp;
+ src->value = i;
+ tmp = src;
+ }
+
+ dst = QAPI_CLONE(uint8List, src);
+ for (tmp = dst, i = 1; i <= 10; i++) {
+ g_assert(tmp);
+ g_assert_cmpint(tmp->value, ==, i);
+ tmp = tmp->next;
+ }
+ g_assert(!tmp);
+
+ qapi_free_uint8List(src);
+ qapi_free_uint8List(dst);
+}
+
+static void test_clone_empty(void)
+{
+ Empty2 *src, *dst;
+
+ src = g_new0(Empty2, 1);
+ dst = QAPI_CLONE(Empty2, src);
+ g_assert(dst);
+ qapi_free_Empty2(src);
+ qapi_free_Empty2(dst);
+}
+
+static void test_clone_complex1(void)
+{
+ UserDefNativeListUnion *src, *dst;
+
+ src = g_new0(UserDefNativeListUnion, 1);
+ src->type = USER_DEF_NATIVE_LIST_UNION_KIND_STRING;
+
+ dst = QAPI_CLONE(UserDefNativeListUnion, src);
+ g_assert(dst);
+ g_assert_cmpint(dst->type, ==, src->type);
+ g_assert(!dst->u.string.data);
+
+ qapi_free_UserDefNativeListUnion(src);
+ qapi_free_UserDefNativeListUnion(dst);
+}
+
+static void test_clone_complex2(void)
+{
+ WrapAlternate *src, *dst;
+
+ src = g_new0(WrapAlternate, 1);
+ src->alt = g_new(UserDefAlternate, 1);
+ src->alt->type = QTYPE_QDICT;
+ src->alt->u.udfu.integer = 42;
+ /* Clone intentionally converts NULL into "" for strings */
+ src->alt->u.udfu.string = NULL;
+ src->alt->u.udfu.enum1 = ENUM_ONE_VALUE3;
+ src->alt->u.udfu.u.value3.intb = 99;
+ src->alt->u.udfu.u.value3.has_a_b = true;
+ src->alt->u.udfu.u.value3.a_b = true;
+
+ dst = QAPI_CLONE(WrapAlternate, src);
+ g_assert(dst);
+ g_assert(dst->alt);
+ g_assert_cmpint(dst->alt->type, ==, QTYPE_QDICT);
+ g_assert_cmpint(dst->alt->u.udfu.integer, ==, 42);
+ g_assert_cmpstr(dst->alt->u.udfu.string, ==, "");
+ g_assert_cmpint(dst->alt->u.udfu.enum1, ==, ENUM_ONE_VALUE3);
+ g_assert_cmpint(dst->alt->u.udfu.u.value3.intb, ==, 99);
+ g_assert_cmpint(dst->alt->u.udfu.u.value3.has_a_b, ==, true);
+ g_assert_cmpint(dst->alt->u.udfu.u.value3.a_b, ==, true);
+
+ qapi_free_WrapAlternate(src);
+ qapi_free_WrapAlternate(dst);
+}
+
+static void test_clone_complex3(void)
+{
+ __org_qemu_x_Struct2 *src, *dst;
+ __org_qemu_x_Union1List *tmp;
+
+ src = g_new0(__org_qemu_x_Struct2, 1);
+ tmp = src->array = g_new0(__org_qemu_x_Union1List, 1);
+ tmp->value = g_new0(__org_qemu_x_Union1, 1);
+ tmp->value->type = ORG_QEMU_X_UNION1_KIND___ORG_QEMU_X_BRANCH;
+ tmp->value->u.__org_qemu_x_branch.data = g_strdup("one");
+ tmp = tmp->next = g_new0(__org_qemu_x_Union1List, 1);
+ tmp->value = g_new0(__org_qemu_x_Union1, 1);
+ tmp->value->type = ORG_QEMU_X_UNION1_KIND___ORG_QEMU_X_BRANCH;
+ tmp->value->u.__org_qemu_x_branch.data = g_strdup("two");
+ tmp = tmp->next = g_new0(__org_qemu_x_Union1List, 1);
+ tmp->value = g_new0(__org_qemu_x_Union1, 1);
+ tmp->value->type = ORG_QEMU_X_UNION1_KIND___ORG_QEMU_X_BRANCH;
+ tmp->value->u.__org_qemu_x_branch.data = g_strdup("three");
+
+ dst = QAPI_CLONE(__org_qemu_x_Struct2, src);
+ g_assert(dst);
+ tmp = dst->array;
+ g_assert(tmp);
+ g_assert(tmp->value);
+ g_assert_cmpstr(tmp->value->u.__org_qemu_x_branch.data, ==, "one");
+ tmp = tmp->next;
+ g_assert(tmp);
+ g_assert(tmp->value);
+ g_assert_cmpstr(tmp->value->u.__org_qemu_x_branch.data, ==, "two");
+ tmp = tmp->next;
+ g_assert(tmp);
+ g_assert(tmp->value);
+ g_assert_cmpstr(tmp->value->u.__org_qemu_x_branch.data, ==, "three");
+ tmp = tmp->next;
+ g_assert(!tmp);
+
+ qapi_free___org_qemu_x_Struct2(src);
+ qapi_free___org_qemu_x_Struct2(dst);
+}
+
+int main(int argc, char **argv)
+{
+ g_test_init(&argc, &argv, NULL);
+
+ g_test_add_func("/visitor/clone/struct", test_clone_struct);
+ g_test_add_func("/visitor/clone/alternate", test_clone_alternate);
+ g_test_add_func("/visitor/clone/native_list", test_clone_native_list);
+ g_test_add_func("/visitor/clone/empty", test_clone_empty);
+ g_test_add_func("/visitor/clone/complex1", test_clone_complex1);
+ g_test_add_func("/visitor/clone/complex2", test_clone_complex2);
+ g_test_add_func("/visitor/clone/complex3", test_clone_complex3);
+
+ return g_test_run();
+}
diff --git a/tests/test-opts-visitor.c b/tests/test-opts-visitor.c
index d75b114c15..0a9e75f1bb 100644
--- a/tests/test-opts-visitor.c
+++ b/tests/test-opts-visitor.c
@@ -37,16 +37,15 @@ setup_fixture(OptsVisitorFixture *f, gconstpointer test_data)
{
const char *opts_string = test_data;
QemuOpts *opts;
- OptsVisitor *ov;
+ Visitor *v;
opts = qemu_opts_parse(qemu_find_opts("userdef"), opts_string, false,
NULL);
g_assert(opts != NULL);
- ov = opts_visitor_new(opts);
- visit_type_UserDefOptions(opts_get_visitor(ov), NULL, &f->userdef,
- &f->err);
- opts_visitor_cleanup(ov);
+ v = opts_visitor_new(opts);
+ visit_type_UserDefOptions(v, NULL, &f->userdef, &f->err);
+ visit_free(v);
qemu_opts_del(opts);
}
diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c
index e8f619d331..8ffeb045cd 100644
--- a/tests/test-qmp-commands.c
+++ b/tests/test-qmp-commands.c
@@ -216,14 +216,14 @@ static void test_dealloc_partial(void)
/* create partial object */
{
QDict *ud2_dict;
- QmpInputVisitor *qiv;
+ Visitor *v;
ud2_dict = qdict_new();
qdict_put_obj(ud2_dict, "string0", QOBJECT(qstring_from_str(text)));
- qiv = qmp_input_visitor_new(QOBJECT(ud2_dict), true);
- visit_type_UserDefTwo(qmp_input_get_visitor(qiv), NULL, &ud2, &err);
- qmp_input_visitor_cleanup(qiv);
+ v = qmp_input_visitor_new(QOBJECT(ud2_dict), true);
+ visit_type_UserDefTwo(v, NULL, &ud2, &err);
+ visit_free(v);
QDECREF(ud2_dict);
}
diff --git a/tests/test-qmp-input-strict.c b/tests/test-qmp-input-strict.c
index d5f57c583a..814550ac71 100644
--- a/tests/test-qmp-input-strict.c
+++ b/tests/test-qmp-input-strict.c
@@ -19,13 +19,14 @@
#include "test-qapi-types.h"
#include "test-qapi-visit.h"
#include "qapi/qmp/types.h"
+#include "qapi/qmp/qjson.h"
#include "test-qmp-introspect.h"
#include "qmp-introspect.h"
#include "qapi-visit.h"
typedef struct TestInputVisitorData {
QObject *obj;
- QmpInputVisitor *qiv;
+ Visitor *qiv;
} TestInputVisitorData;
static void validate_teardown(TestInputVisitorData *data,
@@ -35,7 +36,7 @@ static void validate_teardown(TestInputVisitorData *data,
data->obj = NULL;
if (data->qiv) {
- qmp_input_visitor_cleanup(data->qiv);
+ visit_free(data->qiv);
data->qiv = NULL;
}
}
@@ -47,8 +48,6 @@ static Visitor *validate_test_init_internal(TestInputVisitorData *data,
const char *json_string,
va_list *ap)
{
- Visitor *v;
-
validate_teardown(data, NULL);
data->obj = qobject_from_jsonv(json_string, ap);
@@ -56,11 +55,7 @@ static Visitor *validate_test_init_internal(TestInputVisitorData *data,
data->qiv = qmp_input_visitor_new(data->obj, true);
g_assert(data->qiv);
-
- v = qmp_input_get_visitor(data->qiv);
- g_assert(v);
-
- return v;
+ return data->qiv;
}
static GCC_FMT_ATTR(2, 3)
diff --git a/tests/test-qmp-input-visitor.c b/tests/test-qmp-input-visitor.c
index 1a4585c553..f583dce3ed 100644
--- a/tests/test-qmp-input-visitor.c
+++ b/tests/test-qmp-input-visitor.c
@@ -18,10 +18,11 @@
#include "test-qapi-types.h"
#include "test-qapi-visit.h"
#include "qapi/qmp/types.h"
+#include "qapi/qmp/qjson.h"
typedef struct TestInputVisitorData {
QObject *obj;
- QmpInputVisitor *qiv;
+ Visitor *qiv;
} TestInputVisitorData;
static void visitor_input_teardown(TestInputVisitorData *data,
@@ -31,7 +32,7 @@ static void visitor_input_teardown(TestInputVisitorData *data,
data->obj = NULL;
if (data->qiv) {
- qmp_input_visitor_cleanup(data->qiv);
+ visit_free(data->qiv);
data->qiv = NULL;
}
}
@@ -43,8 +44,6 @@ static Visitor *visitor_input_test_init_internal(TestInputVisitorData *data,
const char *json_string,
va_list *ap)
{
- Visitor *v;
-
visitor_input_teardown(data, NULL);
data->obj = qobject_from_jsonv(json_string, ap);
@@ -52,11 +51,7 @@ static Visitor *visitor_input_test_init_internal(TestInputVisitorData *data,
data->qiv = qmp_input_visitor_new(data->obj, false);
g_assert(data->qiv);
-
- v = qmp_input_get_visitor(data->qiv);
- g_assert(v);
-
- return v;
+ return data->qiv;
}
static GCC_FMT_ATTR(2, 3)
@@ -303,7 +298,7 @@ static void test_visitor_in_null(TestInputVisitorData *data,
visit_type_null(v, "b", &err);
error_free_or_abort(&err);
visit_check_struct(v, &error_abort);
- visit_end_struct(v);
+ visit_end_struct(v, NULL);
}
static void test_visitor_in_union_flat(TestInputVisitorData *data,
diff --git a/tests/test-qmp-output-visitor.c b/tests/test-qmp-output-visitor.c
index f8a7a271a9..513d71f0d1 100644
--- a/tests/test-qmp-output-visitor.c
+++ b/tests/test-qmp-output-visitor.c
@@ -18,28 +18,34 @@
#include "test-qapi-types.h"
#include "test-qapi-visit.h"
#include "qapi/qmp/types.h"
+#include "qapi/qmp/qjson.h"
typedef struct TestOutputVisitorData {
- QmpOutputVisitor *qov;
Visitor *ov;
+ QObject *obj;
} TestOutputVisitorData;
static void visitor_output_setup(TestOutputVisitorData *data,
const void *unused)
{
- data->qov = qmp_output_visitor_new();
- g_assert(data->qov != NULL);
-
- data->ov = qmp_output_get_visitor(data->qov);
- g_assert(data->ov != NULL);
+ data->ov = qmp_output_visitor_new(&data->obj);
+ g_assert(data->ov);
}
static void visitor_output_teardown(TestOutputVisitorData *data,
const void *unused)
{
- qmp_output_visitor_cleanup(data->qov);
- data->qov = NULL;
+ visit_free(data->ov);
data->ov = NULL;
+ qobject_decref(data->obj);
+ data->obj = NULL;
+}
+
+static QObject *visitor_get(TestOutputVisitorData *data)
+{
+ visit_complete(data->ov, &data->obj);
+ g_assert(data->obj);
+ return data->obj;
}
static void visitor_reset(TestOutputVisitorData *data)
@@ -56,12 +62,9 @@ static void test_visitor_out_int(TestOutputVisitorData *data,
visit_type_int(data->ov, NULL, &value, &error_abort);
- obj = qmp_output_get_qobject(data->qov);
- g_assert(obj != NULL);
+ obj = visitor_get(data);
g_assert(qobject_type(obj) == QTYPE_QINT);
g_assert_cmpint(qint_get_int(qobject_to_qint(obj)), ==, value);
-
- qobject_decref(obj);
}
static void test_visitor_out_bool(TestOutputVisitorData *data,
@@ -72,12 +75,9 @@ static void test_visitor_out_bool(TestOutputVisitorData *data,
visit_type_bool(data->ov, NULL, &value, &error_abort);
- obj = qmp_output_get_qobject(data->qov);
- g_assert(obj != NULL);
+ obj = visitor_get(data);
g_assert(qobject_type(obj) == QTYPE_QBOOL);
g_assert(qbool_get_bool(qobject_to_qbool(obj)) == value);
-
- qobject_decref(obj);
}
static void test_visitor_out_number(TestOutputVisitorData *data,
@@ -88,12 +88,9 @@ static void test_visitor_out_number(TestOutputVisitorData *data,
visit_type_number(data->ov, NULL, &value, &error_abort);
- obj = qmp_output_get_qobject(data->qov);
- g_assert(obj != NULL);
+ obj = visitor_get(data);
g_assert(qobject_type(obj) == QTYPE_QFLOAT);
g_assert(qfloat_get_double(qobject_to_qfloat(obj)) == value);
-
- qobject_decref(obj);
}
static void test_visitor_out_string(TestOutputVisitorData *data,
@@ -104,12 +101,9 @@ static void test_visitor_out_string(TestOutputVisitorData *data,
visit_type_str(data->ov, NULL, &string, &error_abort);
- obj = qmp_output_get_qobject(data->qov);
- g_assert(obj != NULL);
+ obj = visitor_get(data);
g_assert(qobject_type(obj) == QTYPE_QSTRING);
g_assert_cmpstr(qstring_get_str(qobject_to_qstring(obj)), ==, string);
-
- qobject_decref(obj);
}
static void test_visitor_out_no_string(TestOutputVisitorData *data,
@@ -121,12 +115,9 @@ static void test_visitor_out_no_string(TestOutputVisitorData *data,
/* A null string should return "" */
visit_type_str(data->ov, NULL, &string, &error_abort);
- obj = qmp_output_get_qobject(data->qov);
- g_assert(obj != NULL);
+ obj = visitor_get(data);
g_assert(qobject_type(obj) == QTYPE_QSTRING);
g_assert_cmpstr(qstring_get_str(qobject_to_qstring(obj)), ==, "");
-
- qobject_decref(obj);
}
static void test_visitor_out_enum(TestOutputVisitorData *data,
@@ -138,12 +129,10 @@ static void test_visitor_out_enum(TestOutputVisitorData *data,
for (i = 0; i < ENUM_ONE__MAX; i++) {
visit_type_EnumOne(data->ov, "unused", &i, &error_abort);
- obj = qmp_output_get_qobject(data->qov);
- g_assert(obj != NULL);
+ obj = visitor_get(data);
g_assert(qobject_type(obj) == QTYPE_QSTRING);
g_assert_cmpstr(qstring_get_str(qobject_to_qstring(obj)), ==,
EnumOne_lookup[i]);
- qobject_decref(obj);
visitor_reset(data);
}
}
@@ -176,8 +165,7 @@ static void test_visitor_out_struct(TestOutputVisitorData *data,
visit_type_TestStruct(data->ov, NULL, &p, &error_abort);
- obj = qmp_output_get_qobject(data->qov);
- g_assert(obj != NULL);
+ obj = visitor_get(data);
g_assert(qobject_type(obj) == QTYPE_QDICT);
qdict = qobject_to_qdict(obj);
@@ -185,8 +173,6 @@ static void test_visitor_out_struct(TestOutputVisitorData *data,
g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 42);
g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, false);
g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "foo");
-
- QDECREF(qdict);
}
static void test_visitor_out_struct_nested(TestOutputVisitorData *data,
@@ -221,8 +207,7 @@ static void test_visitor_out_struct_nested(TestOutputVisitorData *data,
visit_type_UserDefTwo(data->ov, "unused", &ud2, &error_abort);
- obj = qmp_output_get_qobject(data->qov);
- g_assert(obj != NULL);
+ obj = visitor_get(data);
g_assert(qobject_type(obj) == QTYPE_QDICT);
qdict = qobject_to_qdict(obj);
@@ -249,7 +234,6 @@ static void test_visitor_out_struct_nested(TestOutputVisitorData *data,
g_assert_cmpint(qdict_get_int(userdef, "integer"), ==, value);
g_assert_cmpstr(qdict_get_str(userdef, "string"), ==, string);
- QDECREF(qdict);
qapi_free_UserDefTwo(ud2);
}
@@ -301,8 +285,7 @@ static void test_visitor_out_list(TestOutputVisitorData *data,
visit_type_TestStructList(data->ov, NULL, &head, &error_abort);
- obj = qmp_output_get_qobject(data->qov);
- g_assert(obj != NULL);
+ obj = visitor_get(data);
g_assert(qobject_type(obj) == QTYPE_QLIST);
qlist = qobject_to_qlist(obj);
@@ -323,7 +306,6 @@ static void test_visitor_out_list(TestOutputVisitorData *data,
}
g_assert_cmpint(i, ==, max_items);
- QDECREF(qlist);
qapi_free_TestStructList(head);
}
@@ -367,11 +349,9 @@ static void test_visitor_out_any(TestOutputVisitorData *data,
qobj = QOBJECT(qint_from_int(-42));
visit_type_any(data->ov, NULL, &qobj, &error_abort);
- obj = qmp_output_get_qobject(data->qov);
- g_assert(obj != NULL);
+ obj = visitor_get(data);
g_assert(qobject_type(obj) == QTYPE_QINT);
g_assert_cmpint(qint_get_int(qobject_to_qint(obj)), ==, -42);
- qobject_decref(obj);
qobject_decref(qobj);
visitor_reset(data);
@@ -382,8 +362,7 @@ static void test_visitor_out_any(TestOutputVisitorData *data,
qobj = QOBJECT(qdict);
visit_type_any(data->ov, NULL, &qobj, &error_abort);
qobject_decref(qobj);
- obj = qmp_output_get_qobject(data->qov);
- g_assert(obj != NULL);
+ obj = visitor_get(data);
qdict = qobject_to_qdict(obj);
g_assert(qdict);
qobj = qdict_get(qdict, "integer");
@@ -401,7 +380,6 @@ static void test_visitor_out_any(TestOutputVisitorData *data,
qstring = qobject_to_qstring(qobj);
g_assert(qstring);
g_assert_cmpstr(qstring_get_str(qstring), ==, "foo");
- qobject_decref(obj);
}
static void test_visitor_out_union_flat(TestOutputVisitorData *data,
@@ -417,7 +395,7 @@ static void test_visitor_out_union_flat(TestOutputVisitorData *data,
tmp->u.value1.boolean = true;
visit_type_UserDefFlatUnion(data->ov, NULL, &tmp, &error_abort);
- arg = qmp_output_get_qobject(data->qov);
+ arg = visitor_get(data);
g_assert(qobject_type(arg) == QTYPE_QDICT);
qdict = qobject_to_qdict(arg);
@@ -428,7 +406,6 @@ static void test_visitor_out_union_flat(TestOutputVisitorData *data,
g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, true);
qapi_free_UserDefFlatUnion(tmp);
- QDECREF(qdict);
}
static void test_visitor_out_alternate(TestOutputVisitorData *data,
@@ -443,13 +420,12 @@ static void test_visitor_out_alternate(TestOutputVisitorData *data,
tmp->u.i = 42;
visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
- arg = qmp_output_get_qobject(data->qov);
+ arg = visitor_get(data);
g_assert(qobject_type(arg) == QTYPE_QINT);
g_assert_cmpint(qint_get_int(qobject_to_qint(arg)), ==, 42);
qapi_free_UserDefAlternate(tmp);
- qobject_decref(arg);
visitor_reset(data);
tmp = g_new0(UserDefAlternate, 1);
@@ -457,13 +433,12 @@ static void test_visitor_out_alternate(TestOutputVisitorData *data,
tmp->u.s = g_strdup("hello");
visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
- arg = qmp_output_get_qobject(data->qov);
+ arg = visitor_get(data);
g_assert(qobject_type(arg) == QTYPE_QSTRING);
g_assert_cmpstr(qstring_get_str(qobject_to_qstring(arg)), ==, "hello");
qapi_free_UserDefAlternate(tmp);
- qobject_decref(arg);
visitor_reset(data);
tmp = g_new0(UserDefAlternate, 1);
@@ -474,7 +449,7 @@ static void test_visitor_out_alternate(TestOutputVisitorData *data,
tmp->u.udfu.u.value1.boolean = true;
visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
- arg = qmp_output_get_qobject(data->qov);
+ arg = visitor_get(data);
g_assert_cmpint(qobject_type(arg), ==, QTYPE_QDICT);
qdict = qobject_to_qdict(arg);
@@ -485,7 +460,6 @@ static void test_visitor_out_alternate(TestOutputVisitorData *data,
g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, true);
qapi_free_UserDefAlternate(tmp);
- qobject_decref(arg);
}
static void test_visitor_out_null(TestOutputVisitorData *data,
@@ -498,15 +472,14 @@ static void test_visitor_out_null(TestOutputVisitorData *data,
visit_start_struct(data->ov, NULL, NULL, 0, &error_abort);
visit_type_null(data->ov, "a", &error_abort);
visit_check_struct(data->ov, &error_abort);
- visit_end_struct(data->ov);
- arg = qmp_output_get_qobject(data->qov);
+ visit_end_struct(data->ov, NULL);
+ arg = visitor_get(data);
g_assert(qobject_type(arg) == QTYPE_QDICT);
qdict = qobject_to_qdict(arg);
g_assert_cmpint(qdict_size(qdict), ==, 1);
nil = qdict_get(qdict, "a");
g_assert(nil);
g_assert(qobject_type(nil) == QTYPE_QNULL);
- qobject_decref(arg);
}
static void init_native_list(UserDefNativeListUnion *cvalue)
@@ -737,10 +710,9 @@ static void test_native_list(TestOutputVisitorData *data,
visit_type_UserDefNativeListUnion(data->ov, NULL, &cvalue, &error_abort);
- obj = qmp_output_get_qobject(data->qov);
+ obj = visitor_get(data);
check_native_list(obj, cvalue->type);
qapi_free_UserDefNativeListUnion(cvalue);
- qobject_decref(obj);
}
static void test_visitor_out_native_list_int(TestOutputVisitorData *data,
diff --git a/tests/test-string-input-visitor.c b/tests/test-string-input-visitor.c
index 7fe7a9c270..d837ebedad 100644
--- a/tests/test-string-input-visitor.c
+++ b/tests/test-string-input-visitor.c
@@ -20,15 +20,15 @@
#include "qapi/qmp/types.h"
typedef struct TestInputVisitorData {
- StringInputVisitor *siv;
+ Visitor *v;
} TestInputVisitorData;
static void visitor_input_teardown(TestInputVisitorData *data,
const void *unused)
{
- if (data->siv) {
- string_input_visitor_cleanup(data->siv);
- data->siv = NULL;
+ if (data->v) {
+ visit_free(data->v);
+ data->v = NULL;
}
}
@@ -39,15 +39,9 @@ static
Visitor *visitor_input_test_init(TestInputVisitorData *data,
const char *string)
{
- Visitor *v;
-
- data->siv = string_input_visitor_new(string);
- g_assert(data->siv != NULL);
-
- v = string_input_get_visitor(data->siv);
- g_assert(v != NULL);
-
- return v;
+ data->v = string_input_visitor_new(string);
+ g_assert(data->v);
+ return data->v;
}
static void test_visitor_in_int(TestInputVisitorData *data,
@@ -199,8 +193,6 @@ static void test_visitor_in_enum(TestInputVisitorData *data,
visitor_input_teardown(data, NULL);
}
-
- data->siv = NULL;
}
/* Try to crash the visitors */
diff --git a/tests/test-string-output-visitor.c b/tests/test-string-output-visitor.c
index edff5235fe..444844a15a 100644
--- a/tests/test-string-output-visitor.c
+++ b/tests/test-string-output-visitor.c
@@ -20,39 +20,53 @@
#include "qapi/qmp/types.h"
typedef struct TestOutputVisitorData {
- StringOutputVisitor *sov;
Visitor *ov;
+ char *str;
bool human;
} TestOutputVisitorData;
+static void visitor_output_setup_internal(TestOutputVisitorData *data,
+ bool human)
+{
+ data->human = human;
+ data->ov = string_output_visitor_new(human, &data->str);
+ g_assert(data->ov);
+}
+
static void visitor_output_setup(TestOutputVisitorData *data,
const void *unused)
{
- data->human = false;
- data->sov = string_output_visitor_new(data->human);
- g_assert(data->sov != NULL);
-
- data->ov = string_output_get_visitor(data->sov);
- g_assert(data->ov != NULL);
+ return visitor_output_setup_internal(data, false);
}
static void visitor_output_setup_human(TestOutputVisitorData *data,
const void *unused)
{
- data->human = true;
- data->sov = string_output_visitor_new(data->human);
- g_assert(data->sov != NULL);
-
- data->ov = string_output_get_visitor(data->sov);
- g_assert(data->ov != NULL);
+ return visitor_output_setup_internal(data, true);
}
static void visitor_output_teardown(TestOutputVisitorData *data,
const void *unused)
{
- string_output_visitor_cleanup(data->sov);
- data->sov = NULL;
+ visit_free(data->ov);
data->ov = NULL;
+ g_free(data->str);
+ data->str = NULL;
+}
+
+static char *visitor_get(TestOutputVisitorData *data)
+{
+ visit_complete(data->ov, &data->str);
+ g_assert(data->str);
+ return data->str;
+}
+
+static void visitor_reset(TestOutputVisitorData *data)
+{
+ bool human = data->human;
+
+ visitor_output_teardown(data, NULL);
+ visitor_output_setup_internal(data, human);
}
static void test_visitor_out_int(TestOutputVisitorData *data,
@@ -65,14 +79,12 @@ static void test_visitor_out_int(TestOutputVisitorData *data,
visit_type_int(data->ov, NULL, &value, &err);
g_assert(!err);
- str = string_output_get_string(data->sov);
- g_assert(str != NULL);
+ str = visitor_get(data);
if (data->human) {
g_assert_cmpstr(str, ==, "42 (0x2a)");
} else {
g_assert_cmpstr(str, ==, "42");
}
- g_free(str);
}
static void test_visitor_out_intList(TestOutputVisitorData *data,
@@ -94,8 +106,7 @@ static void test_visitor_out_intList(TestOutputVisitorData *data,
visit_type_intList(data->ov, NULL, &list, &err);
g_assert(err == NULL);
- str = string_output_get_string(data->sov);
- g_assert(str != NULL);
+ str = visitor_get(data);
if (data->human) {
g_assert_cmpstr(str, ==,
"0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807 "
@@ -105,13 +116,7 @@ static void test_visitor_out_intList(TestOutputVisitorData *data,
g_assert_cmpstr(str, ==,
"0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807");
}
- g_free(str);
- while (list) {
- intList *tmp2;
- tmp2 = list->next;
- g_free(list);
- list = tmp2;
- }
+ qapi_free_intList(list);
}
static void test_visitor_out_bool(TestOutputVisitorData *data,
@@ -124,10 +129,8 @@ static void test_visitor_out_bool(TestOutputVisitorData *data,
visit_type_bool(data->ov, NULL, &value, &err);
g_assert(!err);
- str = string_output_get_string(data->sov);
- g_assert(str != NULL);
+ str = visitor_get(data);
g_assert_cmpstr(str, ==, "true");
- g_free(str);
}
static void test_visitor_out_number(TestOutputVisitorData *data,
@@ -140,10 +143,8 @@ static void test_visitor_out_number(TestOutputVisitorData *data,
visit_type_number(data->ov, NULL, &value, &err);
g_assert(!err);
- str = string_output_get_string(data->sov);
- g_assert(str != NULL);
+ str = visitor_get(data);
g_assert_cmpstr(str, ==, "3.140000");
- g_free(str);
}
static void test_visitor_out_string(TestOutputVisitorData *data,
@@ -157,61 +158,50 @@ static void test_visitor_out_string(TestOutputVisitorData *data,
visit_type_str(data->ov, NULL, &string, &err);
g_assert(!err);
- str = string_output_get_string(data->sov);
- g_assert(str != NULL);
+ str = visitor_get(data);
if (data->human) {
g_assert_cmpstr(str, ==, string_human);
} else {
g_assert_cmpstr(str, ==, string);
}
- g_free(str);
}
static void test_visitor_out_no_string(TestOutputVisitorData *data,
const void *unused)
{
char *string = NULL;
- Error *err = NULL;
char *str;
/* A null string should return "" */
- visit_type_str(data->ov, NULL, &string, &err);
- g_assert(!err);
+ visit_type_str(data->ov, NULL, &string, &error_abort);
- str = string_output_get_string(data->sov);
- g_assert(str != NULL);
+ str = visitor_get(data);
if (data->human) {
g_assert_cmpstr(str, ==, "<null>");
} else {
g_assert_cmpstr(str, ==, "");
}
- g_free(str);
}
static void test_visitor_out_enum(TestOutputVisitorData *data,
const void *unused)
{
- Error *err = NULL;
char *str;
EnumOne i;
for (i = 0; i < ENUM_ONE__MAX; i++) {
- char *str_human;
-
- visit_type_EnumOne(data->ov, "unused", &i, &err);
- g_assert(!err);
+ visit_type_EnumOne(data->ov, "unused", &i, &error_abort);
- str_human = g_strdup_printf("\"%s\"", EnumOne_lookup[i]);
-
- str = string_output_get_string(data->sov);
- g_assert(str != NULL);
+ str = visitor_get(data);
if (data->human) {
+ char *str_human = g_strdup_printf("\"%s\"", EnumOne_lookup[i]);
+
g_assert_cmpstr(str, ==, str_human);
+ g_free(str_human);
} else {
g_assert_cmpstr(str, ==, EnumOne_lookup[i]);
}
- g_free(str_human);
- g_free(str);
+ visitor_reset(data);
}
}
@@ -224,8 +214,7 @@ static void test_visitor_out_enum_errors(TestOutputVisitorData *data,
for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) {
err = NULL;
visit_type_EnumOne(data->ov, "unused", &bad_values[i], &err);
- g_assert(err);
- error_free(err);
+ error_free_or_abort(&err);
}
}
diff --git a/tests/test-visitor-serialization.c b/tests/test-visitor-serialization.c
index 777469f114..dba4670762 100644
--- a/tests/test-visitor-serialization.c
+++ b/tests/test-visitor-serialization.c
@@ -19,6 +19,7 @@
#include "test-qapi-visit.h"
#include "qapi/error.h"
#include "qapi/qmp/types.h"
+#include "qapi/qmp/qjson.h"
#include "qapi/qmp-input-visitor.h"
#include "qapi/qmp-output-visitor.h"
#include "qapi/string-input-visitor.h"
@@ -88,11 +89,11 @@ typedef void (*VisitorFunc)(Visitor *v, void **native, Error **errp);
static void dealloc_helper(void *native_in, VisitorFunc visit, Error **errp)
{
- QapiDeallocVisitor *qdv = qapi_dealloc_visitor_new();
+ Visitor *v = qapi_dealloc_visitor_new();
- visit(qapi_dealloc_get_visitor(qdv), &native_in, errp);
+ visit(v, &native_in, errp);
- qapi_dealloc_visitor_cleanup(qdv);
+ visit_free(v);
}
static void visit_primitive_type(Visitor *v, void **native, Error **errp)
@@ -1011,8 +1012,9 @@ static PrimitiveType pt_values[] = {
/* visitor-specific op implementations */
typedef struct QmpSerializeData {
- QmpOutputVisitor *qov;
- QmpInputVisitor *qiv;
+ Visitor *qov;
+ QObject *obj;
+ Visitor *qiv;
} QmpSerializeData;
static void qmp_serialize(void *native_in, void **datap,
@@ -1020,8 +1022,8 @@ static void qmp_serialize(void *native_in, void **datap,
{
QmpSerializeData *d = g_malloc0(sizeof(*d));
- d->qov = qmp_output_visitor_new();
- visit(qmp_output_get_visitor(d->qov), &native_in, errp);
+ d->qov = qmp_output_visitor_new(&d->obj);
+ visit(d->qov, &native_in, errp);
*datap = d;
}
@@ -1032,7 +1034,8 @@ static void qmp_deserialize(void **native_out, void *datap,
QString *output_json;
QObject *obj_orig, *obj;
- obj_orig = qmp_output_get_qobject(d->qov);
+ visit_complete(d->qov, &d->obj);
+ obj_orig = d->obj;
output_json = qobject_to_json(obj_orig);
obj = qobject_from_json(qstring_get_str(output_json));
@@ -1040,22 +1043,22 @@ static void qmp_deserialize(void **native_out, void *datap,
d->qiv = qmp_input_visitor_new(obj, true);
qobject_decref(obj_orig);
qobject_decref(obj);
- visit(qmp_input_get_visitor(d->qiv), native_out, errp);
+ visit(d->qiv, native_out, errp);
}
static void qmp_cleanup(void *datap)
{
QmpSerializeData *d = datap;
- qmp_output_visitor_cleanup(d->qov);
- qmp_input_visitor_cleanup(d->qiv);
+ visit_free(d->qov);
+ visit_free(d->qiv);
g_free(d);
}
typedef struct StringSerializeData {
char *string;
- StringOutputVisitor *sov;
- StringInputVisitor *siv;
+ Visitor *sov;
+ Visitor *siv;
} StringSerializeData;
static void string_serialize(void *native_in, void **datap,
@@ -1063,8 +1066,8 @@ static void string_serialize(void *native_in, void **datap,
{
StringSerializeData *d = g_malloc0(sizeof(*d));
- d->sov = string_output_visitor_new(false);
- visit(string_output_get_visitor(d->sov), &native_in, errp);
+ d->sov = string_output_visitor_new(false, &d->string);
+ visit(d->sov, &native_in, errp);
*datap = d;
}
@@ -1073,17 +1076,17 @@ static void string_deserialize(void **native_out, void *datap,
{
StringSerializeData *d = datap;
- d->string = string_output_get_string(d->sov);
+ visit_complete(d->sov, &d->string);
d->siv = string_input_visitor_new(d->string);
- visit(string_input_get_visitor(d->siv), native_out, errp);
+ visit(d->siv, native_out, errp);
}
static void string_cleanup(void *datap)
{
StringSerializeData *d = datap;
- string_output_visitor_cleanup(d->sov);
- string_input_visitor_cleanup(d->siv);
+ visit_free(d->sov);
+ visit_free(d->siv);
g_free(d->string);
g_free(d);
}