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