root / test-qmp-output-visitor.c @ 1b902f7d
History | View | Annotate | Download (14.2 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 | f294f82a | Luiz Capitulino | typedef struct TestStructList |
278 | f294f82a | Luiz Capitulino | { |
279 | f294f82a | Luiz Capitulino | TestStruct *value; |
280 | f294f82a | Luiz Capitulino | struct TestStructList *next;
|
281 | f294f82a | Luiz Capitulino | } TestStructList; |
282 | f294f82a | Luiz Capitulino | |
283 | f294f82a | Luiz Capitulino | static void visit_type_TestStructList(Visitor *v, TestStructList **obj, |
284 | f294f82a | Luiz Capitulino | const char *name, Error **errp) |
285 | f294f82a | Luiz Capitulino | { |
286 | f294f82a | Luiz Capitulino | GenericList *i, **head = (GenericList **)obj; |
287 | f294f82a | Luiz Capitulino | |
288 | f294f82a | Luiz Capitulino | visit_start_list(v, name, errp); |
289 | f294f82a | Luiz Capitulino | |
290 | f294f82a | Luiz Capitulino | for (*head = i = visit_next_list(v, head, errp); i; i = visit_next_list(v, &i, errp)) {
|
291 | f294f82a | Luiz Capitulino | TestStructList *native_i = (TestStructList *)i; |
292 | f294f82a | Luiz Capitulino | visit_type_TestStruct(v, &native_i->value, NULL, errp);
|
293 | f294f82a | Luiz Capitulino | } |
294 | f294f82a | Luiz Capitulino | |
295 | f294f82a | Luiz Capitulino | visit_end_list(v, errp); |
296 | f294f82a | Luiz Capitulino | } |
297 | f294f82a | Luiz Capitulino | |
298 | f294f82a | Luiz Capitulino | static void test_visitor_out_list(TestOutputVisitorData *data, |
299 | f294f82a | Luiz Capitulino | const void *unused) |
300 | f294f82a | Luiz Capitulino | { |
301 | f294f82a | Luiz Capitulino | char *value_str = (char *) "list value"; |
302 | f294f82a | Luiz Capitulino | TestStructList *p, *head = NULL;
|
303 | f294f82a | Luiz Capitulino | const int max_items = 10; |
304 | f294f82a | Luiz Capitulino | bool value_bool = true; |
305 | f294f82a | Luiz Capitulino | int value_int = 10; |
306 | f294f82a | Luiz Capitulino | Error *errp = NULL;
|
307 | f294f82a | Luiz Capitulino | QListEntry *entry; |
308 | f294f82a | Luiz Capitulino | QObject *obj; |
309 | f294f82a | Luiz Capitulino | QList *qlist; |
310 | f294f82a | Luiz Capitulino | int i;
|
311 | f294f82a | Luiz Capitulino | |
312 | f294f82a | Luiz Capitulino | for (i = 0; i < max_items; i++) { |
313 | f294f82a | Luiz Capitulino | p = g_malloc0(sizeof(*p));
|
314 | f294f82a | Luiz Capitulino | p->value = g_malloc0(sizeof(*p->value));
|
315 | f294f82a | Luiz Capitulino | p->value->integer = value_int; |
316 | f294f82a | Luiz Capitulino | p->value->boolean = value_bool; |
317 | f294f82a | Luiz Capitulino | p->value->string = value_str; |
318 | f294f82a | Luiz Capitulino | |
319 | f294f82a | Luiz Capitulino | p->next = head; |
320 | f294f82a | Luiz Capitulino | head = p; |
321 | f294f82a | Luiz Capitulino | } |
322 | f294f82a | Luiz Capitulino | |
323 | f294f82a | Luiz Capitulino | visit_type_TestStructList(data->ov, &head, NULL, &errp);
|
324 | f294f82a | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
325 | f294f82a | Luiz Capitulino | |
326 | f294f82a | Luiz Capitulino | obj = qmp_output_get_qobject(data->qov); |
327 | f294f82a | Luiz Capitulino | g_assert(obj != NULL);
|
328 | f294f82a | Luiz Capitulino | g_assert(qobject_type(obj) == QTYPE_QLIST); |
329 | f294f82a | Luiz Capitulino | |
330 | f294f82a | Luiz Capitulino | qlist = qobject_to_qlist(obj); |
331 | f294f82a | Luiz Capitulino | g_assert(!qlist_empty(qlist)); |
332 | f294f82a | Luiz Capitulino | |
333 | f294f82a | Luiz Capitulino | i = 0;
|
334 | f294f82a | Luiz Capitulino | QLIST_FOREACH_ENTRY(qlist, entry) { |
335 | f294f82a | Luiz Capitulino | QDict *qdict; |
336 | f294f82a | Luiz Capitulino | |
337 | f294f82a | Luiz Capitulino | g_assert(qobject_type(entry->value) == QTYPE_QDICT); |
338 | f294f82a | Luiz Capitulino | qdict = qobject_to_qdict(entry->value); |
339 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_size(qdict), ==, 3);
|
340 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, value_int);
|
341 | f294f82a | Luiz Capitulino | g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, value_bool);
|
342 | f294f82a | Luiz Capitulino | g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, value_str);
|
343 | f294f82a | Luiz Capitulino | i++; |
344 | f294f82a | Luiz Capitulino | } |
345 | f294f82a | Luiz Capitulino | g_assert_cmpint(i, ==, max_items); |
346 | f294f82a | Luiz Capitulino | |
347 | f294f82a | Luiz Capitulino | QDECREF(qlist); |
348 | f294f82a | Luiz Capitulino | |
349 | f294f82a | Luiz Capitulino | for (p = head; p;) {
|
350 | f294f82a | Luiz Capitulino | TestStructList *tmp = p->next; |
351 | f294f82a | Luiz Capitulino | g_free(p->value); |
352 | f294f82a | Luiz Capitulino | g_free(p); |
353 | f294f82a | Luiz Capitulino | p = tmp; |
354 | f294f82a | Luiz Capitulino | } |
355 | f294f82a | Luiz Capitulino | } |
356 | f294f82a | Luiz Capitulino | |
357 | f294f82a | Luiz Capitulino | static void test_visitor_out_list_qapi_free(TestOutputVisitorData *data, |
358 | f294f82a | Luiz Capitulino | const void *unused) |
359 | f294f82a | Luiz Capitulino | { |
360 | f294f82a | Luiz Capitulino | UserDefNestedList *p, *head = NULL;
|
361 | f294f82a | Luiz Capitulino | const char string[] = "foo bar"; |
362 | f294f82a | Luiz Capitulino | int i, max_count = 1024; |
363 | f294f82a | Luiz Capitulino | |
364 | f294f82a | Luiz Capitulino | for (i = 0; i < max_count; i++) { |
365 | f294f82a | Luiz Capitulino | p = g_malloc0(sizeof(*p));
|
366 | f294f82a | Luiz Capitulino | p->value = g_malloc0(sizeof(*p->value));
|
367 | f294f82a | Luiz Capitulino | |
368 | f294f82a | Luiz Capitulino | p->value->string0 = g_strdup(string); |
369 | f294f82a | Luiz Capitulino | p->value->dict1.string1 = g_strdup(string); |
370 | f294f82a | Luiz Capitulino | p->value->dict1.dict2.userdef1 = g_malloc0(sizeof(UserDefOne));
|
371 | f294f82a | Luiz Capitulino | p->value->dict1.dict2.userdef1->string = g_strdup(string); |
372 | f294f82a | Luiz Capitulino | p->value->dict1.dict2.userdef1->integer = 42;
|
373 | f294f82a | Luiz Capitulino | p->value->dict1.dict2.string2 = g_strdup(string); |
374 | f294f82a | Luiz Capitulino | p->value->dict1.has_dict3 = false;
|
375 | f294f82a | Luiz Capitulino | |
376 | f294f82a | Luiz Capitulino | p->next = head; |
377 | f294f82a | Luiz Capitulino | head = p; |
378 | f294f82a | Luiz Capitulino | } |
379 | f294f82a | Luiz Capitulino | |
380 | f294f82a | Luiz Capitulino | qapi_free_UserDefNestedList(head); |
381 | f294f82a | Luiz Capitulino | } |
382 | f294f82a | Luiz Capitulino | |
383 | dc8fb6df | Paolo Bonzini | static void test_visitor_out_union(TestOutputVisitorData *data, |
384 | dc8fb6df | Paolo Bonzini | const void *unused) |
385 | dc8fb6df | Paolo Bonzini | { |
386 | dc8fb6df | Paolo Bonzini | QObject *arg, *qvalue; |
387 | dc8fb6df | Paolo Bonzini | QDict *qdict, *value; |
388 | dc8fb6df | Paolo Bonzini | |
389 | dc8fb6df | Paolo Bonzini | Error *err = NULL;
|
390 | dc8fb6df | Paolo Bonzini | |
391 | dc8fb6df | Paolo Bonzini | UserDefUnion *tmp = g_malloc0(sizeof(UserDefUnion));
|
392 | dc8fb6df | Paolo Bonzini | tmp->kind = USER_DEF_UNION_KIND_A; |
393 | dc8fb6df | Paolo Bonzini | tmp->a = g_malloc0(sizeof(UserDefA));
|
394 | dc8fb6df | Paolo Bonzini | tmp->a->boolean = true;
|
395 | dc8fb6df | Paolo Bonzini | |
396 | dc8fb6df | Paolo Bonzini | visit_type_UserDefUnion(data->ov, &tmp, NULL, &err);
|
397 | dc8fb6df | Paolo Bonzini | g_assert(err == NULL);
|
398 | dc8fb6df | Paolo Bonzini | arg = qmp_output_get_qobject(data->qov); |
399 | dc8fb6df | Paolo Bonzini | |
400 | dc8fb6df | Paolo Bonzini | g_assert(qobject_type(arg) == QTYPE_QDICT); |
401 | dc8fb6df | Paolo Bonzini | qdict = qobject_to_qdict(arg); |
402 | dc8fb6df | Paolo Bonzini | |
403 | dc8fb6df | Paolo Bonzini | g_assert_cmpstr(qdict_get_str(qdict, "type"), ==, "a"); |
404 | dc8fb6df | Paolo Bonzini | |
405 | dc8fb6df | Paolo Bonzini | qvalue = qdict_get(qdict, "data");
|
406 | dc8fb6df | Paolo Bonzini | g_assert(data != NULL);
|
407 | dc8fb6df | Paolo Bonzini | g_assert(qobject_type(qvalue) == QTYPE_QDICT); |
408 | dc8fb6df | Paolo Bonzini | value = qobject_to_qdict(qvalue); |
409 | dc8fb6df | Paolo Bonzini | g_assert_cmpint(qdict_get_bool(value, "boolean"), ==, true); |
410 | dc8fb6df | Paolo Bonzini | |
411 | dc8fb6df | Paolo Bonzini | qapi_free_UserDefUnion(tmp); |
412 | dc8fb6df | Paolo Bonzini | QDECREF(qdict); |
413 | dc8fb6df | Paolo Bonzini | } |
414 | dc8fb6df | Paolo Bonzini | |
415 | f294f82a | Luiz Capitulino | static void output_visitor_test_add(const char *testpath, |
416 | f294f82a | Luiz Capitulino | TestOutputVisitorData *data, |
417 | f294f82a | Luiz Capitulino | void (*test_func)(TestOutputVisitorData *data, const void *user_data)) |
418 | f294f82a | Luiz Capitulino | { |
419 | f294f82a | Luiz Capitulino | g_test_add(testpath, TestOutputVisitorData, data, visitor_output_setup, |
420 | f294f82a | Luiz Capitulino | test_func, visitor_output_teardown); |
421 | f294f82a | Luiz Capitulino | } |
422 | f294f82a | Luiz Capitulino | |
423 | f294f82a | Luiz Capitulino | int main(int argc, char **argv) |
424 | f294f82a | Luiz Capitulino | { |
425 | f294f82a | Luiz Capitulino | TestOutputVisitorData out_visitor_data; |
426 | f294f82a | Luiz Capitulino | |
427 | f294f82a | Luiz Capitulino | g_test_init(&argc, &argv, NULL);
|
428 | f294f82a | Luiz Capitulino | |
429 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/int",
|
430 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_int); |
431 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/bool",
|
432 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_bool); |
433 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/number",
|
434 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_number); |
435 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/string",
|
436 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_string); |
437 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/no-string",
|
438 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_no_string); |
439 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/enum",
|
440 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_enum); |
441 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/enum-errors",
|
442 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_enum_errors); |
443 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/struct",
|
444 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_struct); |
445 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/struct-nested",
|
446 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_struct_nested); |
447 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/list",
|
448 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_list); |
449 | f294f82a | Luiz Capitulino | output_visitor_test_add("/visitor/output/list-qapi-free",
|
450 | f294f82a | Luiz Capitulino | &out_visitor_data, test_visitor_out_list_qapi_free); |
451 | dc8fb6df | Paolo Bonzini | output_visitor_test_add("/visitor/output/union",
|
452 | dc8fb6df | Paolo Bonzini | &out_visitor_data, test_visitor_out_union); |
453 | f294f82a | Luiz Capitulino | |
454 | f294f82a | Luiz Capitulino | g_test_run(); |
455 | f294f82a | Luiz Capitulino | |
456 | f294f82a | Luiz Capitulino | return 0; |
457 | f294f82a | Luiz Capitulino | } |