root / tests / test-qmp-output-visitor.c @ 4115852b
History | View | Annotate | Download (14.8 kB)
1 | f294f82a | Luiz Capitulino | /*
|
---|---|---|---|
2 | f294f82a | Luiz Capitulino | * QMP Output Visitor unit-tests.
|
3 | f294f82a | Luiz Capitulino | *
|
4 | f294f82a | Luiz Capitulino | * Copyright (C) 2011 Red Hat Inc.
|
5 | f294f82a | Luiz Capitulino | *
|
6 | f294f82a | Luiz Capitulino | * Authors:
|
7 | f294f82a | Luiz Capitulino | * Luiz Capitulino <lcapitulino@redhat.com>
|
8 | f294f82a | Luiz Capitulino | *
|
9 | f294f82a | Luiz Capitulino | * This work is licensed under the terms of the GNU GPL, version 2 or later.
|
10 | f294f82a | Luiz Capitulino | * See the COPYING file in the top-level directory.
|
11 | f294f82a | Luiz Capitulino | */
|
12 | f294f82a | Luiz Capitulino | |
13 | f294f82a | Luiz Capitulino | #include <glib.h> |
14 | f294f82a | Luiz Capitulino | |
15 | f294f82a | Luiz Capitulino | #include "qapi/qmp-output-visitor.h" |
16 | f294f82a | Luiz Capitulino | #include "test-qapi-types.h" |
17 | f294f82a | Luiz Capitulino | #include "test-qapi-visit.h" |
18 | f294f82a | Luiz Capitulino | #include "qemu-objects.h" |
19 | f294f82a | Luiz Capitulino | |
20 | f294f82a | Luiz Capitulino | typedef struct TestOutputVisitorData { |
21 | f294f82a | Luiz Capitulino | QmpOutputVisitor *qov; |
22 | f294f82a | Luiz Capitulino | Visitor *ov; |
23 | f294f82a | Luiz Capitulino | } TestOutputVisitorData; |
24 | f294f82a | Luiz Capitulino | |
25 | f294f82a | Luiz Capitulino | static void visitor_output_setup(TestOutputVisitorData *data, |
26 | f294f82a | Luiz Capitulino | const void *unused) |
27 | f294f82a | Luiz Capitulino | { |
28 | f294f82a | Luiz Capitulino | data->qov = qmp_output_visitor_new(); |
29 | f294f82a | Luiz Capitulino | g_assert(data->qov != NULL);
|
30 | f294f82a | Luiz Capitulino | |
31 | f294f82a | Luiz Capitulino | data->ov = qmp_output_get_visitor(data->qov); |
32 | f294f82a | Luiz Capitulino | g_assert(data->ov != NULL);
|
33 | f294f82a | Luiz Capitulino | } |
34 | f294f82a | Luiz Capitulino | |
35 | f294f82a | Luiz Capitulino | static void visitor_output_teardown(TestOutputVisitorData *data, |
36 | f294f82a | Luiz Capitulino | const void *unused) |
37 | f294f82a | Luiz Capitulino | { |
38 | f294f82a | Luiz Capitulino | qmp_output_visitor_cleanup(data->qov); |
39 | f294f82a | Luiz Capitulino | data->qov = NULL;
|
40 | f294f82a | Luiz Capitulino | data->ov = NULL;
|
41 | f294f82a | Luiz Capitulino | } |
42 | f294f82a | Luiz Capitulino | |
43 | f294f82a | Luiz Capitulino | static void test_visitor_out_int(TestOutputVisitorData *data, |
44 | f294f82a | Luiz Capitulino | const void *unused) |
45 | f294f82a | Luiz Capitulino | { |
46 | f294f82a | Luiz Capitulino | int64_t value = -42;
|
47 | f294f82a | Luiz Capitulino | Error *errp = NULL;
|
48 | f294f82a | Luiz Capitulino | QObject *obj; |
49 | f294f82a | Luiz Capitulino | |
50 | f294f82a | Luiz Capitulino | visit_type_int(data->ov, &value, NULL, &errp);
|
51 | f294f82a | Luiz Capitulino | g_assert(error_is_set(&errp) == 0);
|
52 | f294f82a | Luiz Capitulino | |
53 | f294f82a | Luiz Capitulino | obj = qmp_output_get_qobject(data->qov); |
54 | f294f82a | Luiz Capitulino | g_assert(obj != NULL);
|
55 | f294f82a | Luiz Capitulino | g_assert(qobject_type(obj) == QTYPE_QINT); |
56 | f294f82a | Luiz Capitulino | g_assert_cmpint(qint_get_int(qobject_to_qint(obj)), ==, value); |
57 | f294f82a | Luiz Capitulino | |
58 | f294f82a | Luiz Capitulino | qobject_decref(obj); |
59 | f294f82a | Luiz Capitulino | } |
60 | f294f82a | Luiz Capitulino | |
61 | f294f82a | Luiz Capitulino | static void test_visitor_out_bool(TestOutputVisitorData *data, |
62 | f294f82a | Luiz Capitulino | const void *unused) |
63 | f294f82a | Luiz Capitulino | { |
64 | f294f82a | Luiz Capitulino | Error *errp = NULL;
|
65 | f294f82a | Luiz Capitulino | bool value = true; |
66 | f294f82a | Luiz Capitulino | QObject *obj; |
67 | f294f82a | Luiz Capitulino | |
68 | f294f82a | Luiz Capitulino | visit_type_bool(data->ov, &value, NULL, &errp);
|
69 | f294f82a | Luiz Capitulino | g_assert(error_is_set(&errp) == 0);
|
70 | f294f82a | Luiz Capitulino | |
71 | f294f82a | Luiz Capitulino | obj = qmp_output_get_qobject(data->qov); |
72 | f294f82a | Luiz Capitulino | g_assert(obj != NULL);
|
73 | f294f82a | Luiz Capitulino | g_assert(qobject_type(obj) == QTYPE_QBOOL); |
74 | f294f82a | Luiz Capitulino | g_assert(qbool_get_int(qobject_to_qbool(obj)) == value); |
75 | f294f82a | Luiz Capitulino | |
76 | f294f82a | Luiz Capitulino | qobject_decref(obj); |
77 | f294f82a | Luiz Capitulino | } |
78 | f294f82a | Luiz Capitulino | |
79 | f294f82a | Luiz Capitulino | static void test_visitor_out_number(TestOutputVisitorData *data, |
80 | f294f82a | Luiz Capitulino | const void *unused) |
81 | f294f82a | Luiz Capitulino | { |
82 | f294f82a | Luiz Capitulino | double value = 3.14; |
83 | f294f82a | Luiz Capitulino | Error *errp = NULL;
|
84 | f294f82a | Luiz Capitulino | QObject *obj; |
85 | f294f82a | Luiz Capitulino | |
86 | f294f82a | Luiz Capitulino | visit_type_number(data->ov, &value, NULL, &errp);
|
87 | f294f82a | Luiz Capitulino | g_assert(error_is_set(&errp) == 0);
|
88 | f294f82a | Luiz Capitulino | |
89 | f294f82a | Luiz Capitulino | obj = qmp_output_get_qobject(data->qov); |
90 | f294f82a | Luiz Capitulino | g_assert(obj != NULL);
|
91 | f294f82a | Luiz Capitulino | g_assert(qobject_type(obj) == QTYPE_QFLOAT); |
92 | f294f82a | Luiz Capitulino | g_assert(qfloat_get_double(qobject_to_qfloat(obj)) == value); |
93 | f294f82a | Luiz Capitulino | |
94 | f294f82a | Luiz Capitulino | qobject_decref(obj); |
95 | f294f82a | Luiz Capitulino | } |
96 | f294f82a | Luiz Capitulino | |
97 | f294f82a | Luiz Capitulino | static void test_visitor_out_string(TestOutputVisitorData *data, |
98 | f294f82a | Luiz Capitulino | const void *unused) |
99 | f294f82a | Luiz Capitulino | { |
100 | f294f82a | Luiz Capitulino | char *string = (char *) "Q E M U"; |
101 | f294f82a | Luiz Capitulino | Error *errp = NULL;
|
102 | f294f82a | Luiz Capitulino | QObject *obj; |
103 | f294f82a | Luiz Capitulino | |
104 | f294f82a | Luiz Capitulino | visit_type_str(data->ov, &string, NULL, &errp);
|
105 | f294f82a | Luiz Capitulino | g_assert(error_is_set(&errp) == 0);
|
106 | f294f82a | Luiz Capitulino | |
107 | f294f82a | Luiz Capitulino | obj = qmp_output_get_qobject(data->qov); |
108 | f294f82a | Luiz Capitulino | g_assert(obj != NULL);
|
109 | f294f82a | Luiz Capitulino | g_assert(qobject_type(obj) == QTYPE_QSTRING); |
110 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qstring_get_str(qobject_to_qstring(obj)), ==, string); |
111 | f294f82a | Luiz Capitulino | |
112 | f294f82a | Luiz Capitulino | qobject_decref(obj); |
113 | f294f82a | Luiz Capitulino | } |
114 | f294f82a | Luiz Capitulino | |
115 | f294f82a | Luiz Capitulino | static void test_visitor_out_no_string(TestOutputVisitorData *data, |
116 | f294f82a | Luiz Capitulino | const void *unused) |
117 | f294f82a | Luiz Capitulino | { |
118 | f294f82a | Luiz Capitulino | char *string = NULL; |
119 | f294f82a | Luiz Capitulino | Error *errp = NULL;
|
120 | f294f82a | Luiz Capitulino | QObject *obj; |
121 | f294f82a | Luiz Capitulino | |
122 | f294f82a | Luiz Capitulino | /* A null string should return "" */
|
123 | f294f82a | Luiz Capitulino | visit_type_str(data->ov, &string, NULL, &errp);
|
124 | f294f82a | Luiz Capitulino | g_assert(error_is_set(&errp) == 0);
|
125 | f294f82a | Luiz Capitulino | |
126 | f294f82a | Luiz Capitulino | obj = qmp_output_get_qobject(data->qov); |
127 | f294f82a | Luiz Capitulino | g_assert(obj != NULL);
|
128 | f294f82a | Luiz Capitulino | g_assert(qobject_type(obj) == QTYPE_QSTRING); |
129 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qstring_get_str(qobject_to_qstring(obj)), ==, "");
|
130 | f294f82a | Luiz Capitulino | |
131 | f294f82a | Luiz Capitulino | qobject_decref(obj); |
132 | f294f82a | Luiz Capitulino | } |
133 | f294f82a | Luiz Capitulino | |
134 | f294f82a | Luiz Capitulino | static void test_visitor_out_enum(TestOutputVisitorData *data, |
135 | f294f82a | Luiz Capitulino | const void *unused) |
136 | f294f82a | Luiz Capitulino | { |
137 | f294f82a | Luiz Capitulino | Error *errp = NULL;
|
138 | f294f82a | Luiz Capitulino | QObject *obj; |
139 | f294f82a | Luiz Capitulino | EnumOne i; |
140 | f294f82a | Luiz Capitulino | |
141 | f294f82a | Luiz Capitulino | for (i = 0; i < ENUM_ONE_MAX; i++) { |
142 | f294f82a | Luiz Capitulino | visit_type_EnumOne(data->ov, &i, "unused", &errp);
|
143 | f294f82a | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
144 | f294f82a | Luiz Capitulino | |
145 | f294f82a | Luiz Capitulino | obj = qmp_output_get_qobject(data->qov); |
146 | f294f82a | Luiz Capitulino | g_assert(obj != NULL);
|
147 | f294f82a | Luiz Capitulino | g_assert(qobject_type(obj) == QTYPE_QSTRING); |
148 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qstring_get_str(qobject_to_qstring(obj)), ==, |
149 | f294f82a | Luiz Capitulino | EnumOne_lookup[i]); |
150 | f294f82a | Luiz Capitulino | qobject_decref(obj); |
151 | f294f82a | Luiz Capitulino | } |
152 | f294f82a | Luiz Capitulino | } |
153 | f294f82a | Luiz Capitulino | |
154 | f294f82a | Luiz Capitulino | static void test_visitor_out_enum_errors(TestOutputVisitorData *data, |
155 | f294f82a | Luiz Capitulino | const void *unused) |
156 | f294f82a | Luiz Capitulino | { |
157 | f294f82a | Luiz Capitulino | EnumOne i, bad_values[] = { ENUM_ONE_MAX, -1 };
|
158 | f294f82a | Luiz Capitulino | Error *errp; |
159 | f294f82a | Luiz Capitulino | |
160 | f294f82a | Luiz Capitulino | for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) { |
161 | f294f82a | Luiz Capitulino | errp = NULL;
|
162 | f294f82a | Luiz Capitulino | visit_type_EnumOne(data->ov, &bad_values[i], "unused", &errp);
|
163 | f294f82a | Luiz Capitulino | g_assert(error_is_set(&errp) == true);
|
164 | f294f82a | Luiz Capitulino | error_free(errp); |
165 | f294f82a | Luiz Capitulino | } |
166 | f294f82a | Luiz Capitulino | } |
167 | f294f82a | Luiz Capitulino | |
168 | f294f82a | Luiz Capitulino | typedef struct TestStruct |
169 | f294f82a | Luiz Capitulino | { |
170 | f294f82a | Luiz Capitulino | int64_t integer; |
171 | f294f82a | Luiz Capitulino | bool boolean;
|
172 | f294f82a | Luiz Capitulino | char *string;
|
173 | f294f82a | Luiz Capitulino | } TestStruct; |
174 | f294f82a | Luiz Capitulino | |
175 | f294f82a | Luiz Capitulino | static void visit_type_TestStruct(Visitor *v, TestStruct **obj, |
176 | f294f82a | Luiz Capitulino | const char *name, Error **errp) |
177 | f294f82a | Luiz Capitulino | { |
178 | f294f82a | Luiz Capitulino | visit_start_struct(v, (void **)obj, "TestStruct", name, sizeof(TestStruct), |
179 | f294f82a | Luiz Capitulino | errp); |
180 | f294f82a | Luiz Capitulino | |
181 | f294f82a | Luiz Capitulino | visit_type_int(v, &(*obj)->integer, "integer", errp);
|
182 | f294f82a | Luiz Capitulino | visit_type_bool(v, &(*obj)->boolean, "boolean", errp);
|
183 | f294f82a | Luiz Capitulino | visit_type_str(v, &(*obj)->string, "string", errp);
|
184 | f294f82a | Luiz Capitulino | |
185 | f294f82a | Luiz Capitulino | visit_end_struct(v, errp); |
186 | f294f82a | Luiz Capitulino | } |
187 | f294f82a | Luiz Capitulino | |
188 | f294f82a | Luiz Capitulino | static void test_visitor_out_struct(TestOutputVisitorData *data, |
189 | f294f82a | Luiz Capitulino | const void *unused) |
190 | f294f82a | Luiz Capitulino | { |
191 | f294f82a | Luiz Capitulino | TestStruct test_struct = { .integer = 42,
|
192 | f294f82a | Luiz Capitulino | .boolean = false,
|
193 | f294f82a | Luiz Capitulino | .string = (char *) "foo"}; |
194 | f294f82a | Luiz Capitulino | TestStruct *p = &test_struct; |
195 | f294f82a | Luiz Capitulino | Error *errp = NULL;
|
196 | f294f82a | Luiz Capitulino | QObject *obj; |
197 | f294f82a | Luiz Capitulino | QDict *qdict; |
198 | f294f82a | Luiz Capitulino | |
199 | f294f82a | Luiz Capitulino | visit_type_TestStruct(data->ov, &p, NULL, &errp);
|
200 | f294f82a | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
201 | f294f82a | Luiz Capitulino | |
202 | f294f82a | Luiz Capitulino | obj = qmp_output_get_qobject(data->qov); |
203 | f294f82a | Luiz Capitulino | g_assert(obj != NULL);
|
204 | f294f82a | Luiz Capitulino | g_assert(qobject_type(obj) == QTYPE_QDICT); |
205 | f294f82a | Luiz Capitulino | |
206 | f294f82a | Luiz Capitulino | qdict = qobject_to_qdict(obj); |
207 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_size(qdict), ==, 3);
|
208 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 42); |
209 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, 0); |
210 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "foo"); |
211 | f294f82a | Luiz Capitulino | |
212 | f294f82a | Luiz Capitulino | QDECREF(qdict); |
213 | f294f82a | Luiz Capitulino | } |
214 | f294f82a | Luiz Capitulino | |
215 | f294f82a | Luiz Capitulino | static void test_visitor_out_struct_nested(TestOutputVisitorData *data, |
216 | f294f82a | Luiz Capitulino | const void *unused) |
217 | f294f82a | Luiz Capitulino | { |
218 | f294f82a | Luiz Capitulino | int64_t value = 42;
|
219 | f294f82a | Luiz Capitulino | Error *errp = NULL;
|
220 | f294f82a | Luiz Capitulino | UserDefNested *ud2; |
221 | f294f82a | Luiz Capitulino | QObject *obj; |
222 | f294f82a | Luiz Capitulino | QDict *qdict, *dict1, *dict2, *dict3, *userdef; |
223 | f294f82a | Luiz Capitulino | const char *string = "user def string"; |
224 | beae9d79 | Stefan Weil | const char *strings[] = { "forty two", "forty three", "forty four", |
225 | beae9d79 | Stefan Weil | "forty five" };
|
226 | f294f82a | Luiz Capitulino | |
227 | f294f82a | Luiz Capitulino | ud2 = g_malloc0(sizeof(*ud2));
|
228 | f294f82a | Luiz Capitulino | ud2->string0 = g_strdup(strings[0]);
|
229 | f294f82a | Luiz Capitulino | |
230 | f294f82a | Luiz Capitulino | ud2->dict1.string1 = g_strdup(strings[1]);
|
231 | f294f82a | Luiz Capitulino | ud2->dict1.dict2.userdef1 = g_malloc0(sizeof(UserDefOne));
|
232 | f294f82a | Luiz Capitulino | ud2->dict1.dict2.userdef1->string = g_strdup(string); |
233 | f294f82a | Luiz Capitulino | ud2->dict1.dict2.userdef1->integer = value; |
234 | f294f82a | Luiz Capitulino | ud2->dict1.dict2.string2 = g_strdup(strings[2]);
|
235 | f294f82a | Luiz Capitulino | |
236 | f294f82a | Luiz Capitulino | ud2->dict1.has_dict3 = true;
|
237 | f294f82a | Luiz Capitulino | ud2->dict1.dict3.userdef2 = g_malloc0(sizeof(UserDefOne));
|
238 | f294f82a | Luiz Capitulino | ud2->dict1.dict3.userdef2->string = g_strdup(string); |
239 | f294f82a | Luiz Capitulino | ud2->dict1.dict3.userdef2->integer = value; |
240 | f294f82a | Luiz Capitulino | ud2->dict1.dict3.string3 = g_strdup(strings[3]);
|
241 | f294f82a | Luiz Capitulino | |
242 | f294f82a | Luiz Capitulino | visit_type_UserDefNested(data->ov, &ud2, "unused", &errp);
|
243 | f294f82a | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
244 | f294f82a | Luiz Capitulino | |
245 | f294f82a | Luiz Capitulino | obj = qmp_output_get_qobject(data->qov); |
246 | f294f82a | Luiz Capitulino | g_assert(obj != NULL);
|
247 | f294f82a | Luiz Capitulino | g_assert(qobject_type(obj) == QTYPE_QDICT); |
248 | f294f82a | Luiz Capitulino | |
249 | f294f82a | Luiz Capitulino | qdict = qobject_to_qdict(obj); |
250 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_size(qdict), ==, 2);
|
251 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qdict_get_str(qdict, "string0"), ==, strings[0]); |
252 | f294f82a | Luiz Capitulino | |
253 | f294f82a | Luiz Capitulino | dict1 = qdict_get_qdict(qdict, "dict1");
|
254 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_size(dict1), ==, 3);
|
255 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qdict_get_str(dict1, "string1"), ==, strings[1]); |
256 | f294f82a | Luiz Capitulino | |
257 | f294f82a | Luiz Capitulino | dict2 = qdict_get_qdict(dict1, "dict2");
|
258 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_size(dict2), ==, 2);
|
259 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qdict_get_str(dict2, "string2"), ==, strings[2]); |
260 | f294f82a | Luiz Capitulino | userdef = qdict_get_qdict(dict2, "userdef1");
|
261 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_size(userdef), ==, 2);
|
262 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_get_int(userdef, "integer"), ==, value);
|
263 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qdict_get_str(userdef, "string"), ==, string);
|
264 | f294f82a | Luiz Capitulino | |
265 | f294f82a | Luiz Capitulino | dict3 = qdict_get_qdict(dict1, "dict3");
|
266 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_size(dict3), ==, 2);
|
267 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qdict_get_str(dict3, "string3"), ==, strings[3]); |
268 | f294f82a | Luiz Capitulino | userdef = qdict_get_qdict(dict3, "userdef2");
|
269 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_size(userdef), ==, 2);
|
270 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_get_int(userdef, "integer"), ==, value);
|
271 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qdict_get_str(userdef, "string"), ==, string);
|
272 | f294f82a | Luiz Capitulino | |
273 | f294f82a | Luiz Capitulino | QDECREF(qdict); |
274 | f294f82a | Luiz Capitulino | qapi_free_UserDefNested(ud2); |
275 | f294f82a | Luiz Capitulino | } |
276 | f294f82a | Luiz Capitulino | |
277 | 9e9eace8 | Paolo Bonzini | static void test_visitor_out_struct_errors(TestOutputVisitorData *data, |
278 | 9e9eace8 | Paolo Bonzini | const void *unused) |
279 | 9e9eace8 | Paolo Bonzini | { |
280 | 9e9eace8 | Paolo Bonzini | EnumOne bad_values[] = { ENUM_ONE_MAX, -1 };
|
281 | 9e9eace8 | Paolo Bonzini | UserDefOne u = { 0 }, *pu = &u;
|
282 | 9e9eace8 | Paolo Bonzini | Error *errp; |
283 | 9e9eace8 | Paolo Bonzini | int i;
|
284 | 9e9eace8 | Paolo Bonzini | |
285 | 9e9eace8 | Paolo Bonzini | for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) { |
286 | 9e9eace8 | Paolo Bonzini | errp = NULL;
|
287 | 9e9eace8 | Paolo Bonzini | u.has_enum1 = true;
|
288 | 9e9eace8 | Paolo Bonzini | u.enum1 = bad_values[i]; |
289 | 9e9eace8 | Paolo Bonzini | visit_type_UserDefOne(data->ov, &pu, "unused", &errp);
|
290 | 9e9eace8 | Paolo Bonzini | g_assert(error_is_set(&errp) == true);
|
291 | 9e9eace8 | Paolo Bonzini | error_free(errp); |
292 | 9e9eace8 | Paolo Bonzini | } |
293 | 9e9eace8 | Paolo Bonzini | } |
294 | 9e9eace8 | Paolo Bonzini | |
295 | f294f82a | Luiz Capitulino | typedef struct TestStructList |
296 | f294f82a | Luiz Capitulino | { |
297 | f294f82a | Luiz Capitulino | TestStruct *value; |
298 | f294f82a | Luiz Capitulino | struct TestStructList *next;
|
299 | f294f82a | Luiz Capitulino | } TestStructList; |
300 | f294f82a | Luiz Capitulino | |
301 | f294f82a | Luiz Capitulino | static void visit_type_TestStructList(Visitor *v, TestStructList **obj, |
302 | f294f82a | Luiz Capitulino | const char *name, Error **errp) |
303 | f294f82a | Luiz Capitulino | { |
304 | f294f82a | Luiz Capitulino | GenericList *i, **head = (GenericList **)obj; |
305 | f294f82a | Luiz Capitulino | |
306 | f294f82a | Luiz Capitulino | visit_start_list(v, name, errp); |
307 | f294f82a | Luiz Capitulino | |
308 | f294f82a | Luiz Capitulino | for (*head = i = visit_next_list(v, head, errp); i; i = visit_next_list(v, &i, errp)) {
|
309 | f294f82a | Luiz Capitulino | TestStructList *native_i = (TestStructList *)i; |
310 | f294f82a | Luiz Capitulino | visit_type_TestStruct(v, &native_i->value, NULL, errp);
|
311 | f294f82a | Luiz Capitulino | } |
312 | f294f82a | Luiz Capitulino | |
313 | f294f82a | Luiz Capitulino | visit_end_list(v, errp); |
314 | f294f82a | Luiz Capitulino | } |
315 | f294f82a | Luiz Capitulino | |
316 | f294f82a | Luiz Capitulino | static void test_visitor_out_list(TestOutputVisitorData *data, |
317 | f294f82a | Luiz Capitulino | const void *unused) |
318 | f294f82a | Luiz Capitulino | { |
319 | f294f82a | Luiz Capitulino | char *value_str = (char *) "list value"; |
320 | f294f82a | Luiz Capitulino | TestStructList *p, *head = NULL;
|
321 | f294f82a | Luiz Capitulino | const int max_items = 10; |
322 | f294f82a | Luiz Capitulino | bool value_bool = true; |
323 | f294f82a | Luiz Capitulino | int value_int = 10; |
324 | f294f82a | Luiz Capitulino | Error *errp = NULL;
|
325 | f294f82a | Luiz Capitulino | QListEntry *entry; |
326 | f294f82a | Luiz Capitulino | QObject *obj; |
327 | f294f82a | Luiz Capitulino | QList *qlist; |
328 | f294f82a | Luiz Capitulino | int i;
|
329 | f294f82a | Luiz Capitulino | |
330 | f294f82a | Luiz Capitulino | for (i = 0; i < max_items; i++) { |
331 | f294f82a | Luiz Capitulino | p = g_malloc0(sizeof(*p));
|
332 | f294f82a | Luiz Capitulino | p->value = g_malloc0(sizeof(*p->value));
|
333 | f294f82a | Luiz Capitulino | p->value->integer = value_int; |
334 | f294f82a | Luiz Capitulino | p->value->boolean = value_bool; |
335 | f294f82a | Luiz Capitulino | p->value->string = value_str; |
336 | f294f82a | Luiz Capitulino | |
337 | f294f82a | Luiz Capitulino | p->next = head; |
338 | f294f82a | Luiz Capitulino | head = p; |
339 | f294f82a | Luiz Capitulino | } |
340 | f294f82a | Luiz Capitulino | |
341 | f294f82a | Luiz Capitulino | visit_type_TestStructList(data->ov, &head, NULL, &errp);
|
342 | f294f82a | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
343 | f294f82a | Luiz Capitulino | |
344 | f294f82a | Luiz Capitulino | obj = qmp_output_get_qobject(data->qov); |
345 | f294f82a | Luiz Capitulino | g_assert(obj != NULL);
|
346 | f294f82a | Luiz Capitulino | g_assert(qobject_type(obj) == QTYPE_QLIST); |
347 | f294f82a | Luiz Capitulino | |
348 | f294f82a | Luiz Capitulino | qlist = qobject_to_qlist(obj); |
349 | f294f82a | Luiz Capitulino | g_assert(!qlist_empty(qlist)); |
350 | f294f82a | Luiz Capitulino | |
351 | f294f82a | Luiz Capitulino | i = 0;
|
352 | f294f82a | Luiz Capitulino | QLIST_FOREACH_ENTRY(qlist, entry) { |
353 | f294f82a | Luiz Capitulino | QDict *qdict; |
354 | f294f82a | Luiz Capitulino | |
355 | f294f82a | Luiz Capitulino | g_assert(qobject_type(entry->value) == QTYPE_QDICT); |
356 | f294f82a | Luiz Capitulino | qdict = qobject_to_qdict(entry->value); |
357 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_size(qdict), ==, 3);
|
358 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, value_int);
|
359 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, value_bool);
|
360 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, value_str);
|
361 | f294f82a | Luiz Capitulino | i++; |
362 | f294f82a | Luiz Capitulino | } |
363 | f294f82a | Luiz Capitulino | g_assert_cmpint(i, ==, max_items); |
364 | f294f82a | Luiz Capitulino | |
365 | f294f82a | Luiz Capitulino | QDECREF(qlist); |
366 | f294f82a | Luiz Capitulino | |
367 | f294f82a | Luiz Capitulino | for (p = head; p;) {
|
368 | f294f82a | Luiz Capitulino | TestStructList *tmp = p->next; |
369 | f294f82a | Luiz Capitulino | g_free(p->value); |
370 | f294f82a | Luiz Capitulino | g_free(p); |
371 | f294f82a | Luiz Capitulino | p = tmp; |
372 | f294f82a | Luiz Capitulino | } |
373 | f294f82a | Luiz Capitulino | } |
374 | f294f82a | Luiz Capitulino | |
375 | f294f82a | Luiz Capitulino | static void test_visitor_out_list_qapi_free(TestOutputVisitorData *data, |
376 | f294f82a | Luiz Capitulino | const void *unused) |
377 | f294f82a | Luiz Capitulino | { |
378 | f294f82a | Luiz Capitulino | UserDefNestedList *p, *head = NULL;
|
379 | f294f82a | Luiz Capitulino | const char string[] = "foo bar"; |
380 | f294f82a | Luiz Capitulino | int i, max_count = 1024; |
381 | f294f82a | Luiz Capitulino | |
382 | f294f82a | Luiz Capitulino | for (i = 0; i < max_count; i++) { |
383 | f294f82a | Luiz Capitulino | p = g_malloc0(sizeof(*p));
|
384 | f294f82a | Luiz Capitulino | p->value = g_malloc0(sizeof(*p->value));
|
385 | f294f82a | Luiz Capitulino | |
386 | f294f82a | Luiz Capitulino | p->value->string0 = g_strdup(string); |
387 | f294f82a | Luiz Capitulino | p->value->dict1.string1 = g_strdup(string); |
388 | f294f82a | Luiz Capitulino | p->value->dict1.dict2.userdef1 = g_malloc0(sizeof(UserDefOne));
|
389 | f294f82a | Luiz Capitulino | p->value->dict1.dict2.userdef1->string = g_strdup(string); |
390 | f294f82a | Luiz Capitulino | p->value->dict1.dict2.userdef1->integer = 42;
|
391 | f294f82a | Luiz Capitulino | p->value->dict1.dict2.string2 = g_strdup(string); |
392 | f294f82a | Luiz Capitulino | p->value->dict1.has_dict3 = false;
|
393 | f294f82a | Luiz Capitulino | |
394 | f294f82a | Luiz Capitulino | p->next = head; |
395 | f294f82a | Luiz Capitulino | head = p; |
396 | f294f82a | Luiz Capitulino | } |
397 | f294f82a | Luiz Capitulino | |
398 | f294f82a | Luiz Capitulino | qapi_free_UserDefNestedList(head); |
399 | f294f82a | Luiz Capitulino | } |
400 | f294f82a | Luiz Capitulino | |
401 | dc8fb6df | Paolo Bonzini | static void test_visitor_out_union(TestOutputVisitorData *data, |
402 | dc8fb6df | Paolo Bonzini | const void *unused) |
403 | dc8fb6df | Paolo Bonzini | { |
404 | dc8fb6df | Paolo Bonzini | QObject *arg, *qvalue; |
405 | dc8fb6df | Paolo Bonzini | QDict *qdict, *value; |
406 | dc8fb6df | Paolo Bonzini | |
407 | dc8fb6df | Paolo Bonzini | Error *err = NULL;
|
408 | dc8fb6df | Paolo Bonzini | |
409 | dc8fb6df | Paolo Bonzini | UserDefUnion *tmp = g_malloc0(sizeof(UserDefUnion));
|
410 | dc8fb6df | Paolo Bonzini | tmp->kind = USER_DEF_UNION_KIND_A; |
411 | dc8fb6df | Paolo Bonzini | tmp->a = g_malloc0(sizeof(UserDefA));
|
412 | dc8fb6df | Paolo Bonzini | tmp->a->boolean = true;
|
413 | dc8fb6df | Paolo Bonzini | |
414 | dc8fb6df | Paolo Bonzini | visit_type_UserDefUnion(data->ov, &tmp, NULL, &err);
|
415 | dc8fb6df | Paolo Bonzini | g_assert(err == NULL);
|
416 | dc8fb6df | Paolo Bonzini | arg = qmp_output_get_qobject(data->qov); |
417 | dc8fb6df | Paolo Bonzini | |
418 | dc8fb6df | Paolo Bonzini | g_assert(qobject_type(arg) == QTYPE_QDICT); |
419 | dc8fb6df | Paolo Bonzini | qdict = qobject_to_qdict(arg); |
420 | dc8fb6df | Paolo Bonzini | |
421 | dc8fb6df | Paolo Bonzini | g_assert_cmpstr(qdict_get_str(qdict, "type"), ==, "a"); |
422 | dc8fb6df | Paolo Bonzini | |
423 | dc8fb6df | Paolo Bonzini | qvalue = qdict_get(qdict, "data");
|
424 | dc8fb6df | Paolo Bonzini | g_assert(data != NULL);
|
425 | dc8fb6df | Paolo Bonzini | g_assert(qobject_type(qvalue) == QTYPE_QDICT); |
426 | dc8fb6df | Paolo Bonzini | value = qobject_to_qdict(qvalue); |
427 | dc8fb6df | Paolo Bonzini | g_assert_cmpint(qdict_get_bool(value, "boolean"), ==, true); |
428 | dc8fb6df | Paolo Bonzini | |
429 | dc8fb6df | Paolo Bonzini | qapi_free_UserDefUnion(tmp); |
430 | dc8fb6df | Paolo Bonzini | QDECREF(qdict); |
431 | dc8fb6df | Paolo Bonzini | } |
432 | dc8fb6df | Paolo Bonzini | |
433 | f294f82a | Luiz Capitulino | static void output_visitor_test_add(const char *testpath, |
434 | f294f82a | Luiz Capitulino | TestOutputVisitorData *data, |
435 | f294f82a | Luiz Capitulino | void (*test_func)(TestOutputVisitorData *data, const void *user_data)) |
436 | f294f82a | Luiz Capitulino | { |
437 | f294f82a | Luiz Capitulino | g_test_add(testpath, TestOutputVisitorData, data, visitor_output_setup, |
438 | f294f82a | Luiz Capitulino | test_func, visitor_output_teardown); |
439 | f294f82a | Luiz Capitulino | } |
440 | f294f82a | Luiz Capitulino | |
441 | f294f82a | Luiz Capitulino | int main(int argc, char **argv) |
442 | f294f82a | Luiz Capitulino | { |
443 | f294f82a | Luiz Capitulino | TestOutputVisitorData out_visitor_data; |
444 | f294f82a | Luiz Capitulino | |
445 | f294f82a | Luiz Capitulino | g_test_init(&argc, &argv, NULL);
|
446 | f294f82a | Luiz Capitulino | |
447 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/int",
|
448 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_int); |
449 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/bool",
|
450 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_bool); |
451 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/number",
|
452 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_number); |
453 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/string",
|
454 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_string); |
455 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/no-string",
|
456 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_no_string); |
457 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/enum",
|
458 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_enum); |
459 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/enum-errors",
|
460 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_enum_errors); |
461 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/struct",
|
462 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_struct); |
463 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/struct-nested",
|
464 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_struct_nested); |
465 | 9e9eace8 | Paolo Bonzini | output_visitor_test_add("/visitor/output/struct-errors",
|
466 | 9e9eace8 | Paolo Bonzini | &out_visitor_data, test_visitor_out_struct_errors); |
467 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/list",
|
468 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_list); |
469 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/list-qapi-free",
|
470 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_list_qapi_free); |
471 | dc8fb6df | Paolo Bonzini | output_visitor_test_add("/visitor/output/union",
|
472 | dc8fb6df | Paolo Bonzini | &out_visitor_data, test_visitor_out_union); |
473 | f294f82a | Luiz Capitulino | |
474 | f294f82a | Luiz Capitulino | g_test_run(); |
475 | f294f82a | Luiz Capitulino | |
476 | f294f82a | Luiz Capitulino | return 0; |
477 | f294f82a | Luiz Capitulino | } |