]> Git Repo - qemu.git/blame - tests/test-qobject-output-visitor.c
Include qapi/qmp/qlist.h exactly where needed
[qemu.git] / tests / test-qobject-output-visitor.c
CommitLineData
f294f82a 1/*
b3db211f 2 * QObject Output Visitor unit-tests.
f294f82a 3 *
68d07839 4 * Copyright (C) 2011-2016 Red Hat Inc.
f294f82a
LC
5 *
6 * Authors:
7 * Luiz Capitulino <[email protected]>
8 *
9 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 * See the COPYING file in the top-level directory.
11 */
12
681c28a3 13#include "qemu/osdep.h"
f294f82a 14
79ee7df8 15#include "qemu-common.h"
da34e65c 16#include "qapi/error.h"
b3db211f 17#include "qapi/qobject-output-visitor.h"
f294f82a 18#include "test-qapi-visit.h"
6b673957 19#include "qapi/qmp/qbool.h"
47e6b297 20#include "qapi/qmp/qlist.h"
15280c36
MA
21#include "qapi/qmp/qnull.h"
22#include "qapi/qmp/qnum.h"
c7eb39cb 23#include "qapi/qmp/qjson.h"
f294f82a
LC
24
25typedef struct TestOutputVisitorData {
f294f82a 26 Visitor *ov;
23d1705f 27 QObject *obj;
f294f82a
LC
28} TestOutputVisitorData;
29
30static void visitor_output_setup(TestOutputVisitorData *data,
31 const void *unused)
32{
7d5e199a 33 data->ov = qobject_output_visitor_new(&data->obj);
3b098d56 34 g_assert(data->ov);
f294f82a
LC
35}
36
37static void visitor_output_teardown(TestOutputVisitorData *data,
38 const void *unused)
39{
1830f22a 40 visit_free(data->ov);
f294f82a 41 data->ov = NULL;
23d1705f
EB
42 qobject_decref(data->obj);
43 data->obj = NULL;
44}
45
46static QObject *visitor_get(TestOutputVisitorData *data)
47{
3b098d56 48 visit_complete(data->ov, &data->obj);
23d1705f
EB
49 g_assert(data->obj);
50 return data->obj;
f294f82a
LC
51}
52
f2ff429b
EB
53static void visitor_reset(TestOutputVisitorData *data)
54{
55 visitor_output_teardown(data, NULL);
56 visitor_output_setup(data, NULL);
57}
58
f294f82a
LC
59static void test_visitor_out_int(TestOutputVisitorData *data,
60 const void *unused)
61{
62 int64_t value = -42;
01b2ffce
MAL
63 int64_t val;
64 QNum *qnum;
f294f82a 65
51e72bc1 66 visit_type_int(data->ov, NULL, &value, &error_abort);
f294f82a 67
01b2ffce
MAL
68 qnum = qobject_to_qnum(visitor_get(data));
69 g_assert(qnum);
70 g_assert(qnum_get_try_int(qnum, &val));
71 g_assert_cmpint(val, ==, value);
f294f82a
LC
72}
73
74static void test_visitor_out_bool(TestOutputVisitorData *data,
75 const void *unused)
76{
f294f82a 77 bool value = true;
dfad9ec4 78 QBool *qbool;
f294f82a 79
51e72bc1 80 visit_type_bool(data->ov, NULL, &value, &error_abort);
f294f82a 81
dfad9ec4
MA
82 qbool = qobject_to_qbool(visitor_get(data));
83 g_assert(qbool);
84 g_assert(qbool_get_bool(qbool) == value);
f294f82a
LC
85}
86
87static void test_visitor_out_number(TestOutputVisitorData *data,
88 const void *unused)
89{
90 double value = 3.14;
01b2ffce 91 QNum *qnum;
f294f82a 92
51e72bc1 93 visit_type_number(data->ov, NULL, &value, &error_abort);
f294f82a 94
01b2ffce
MAL
95 qnum = qobject_to_qnum(visitor_get(data));
96 g_assert(qnum);
97 g_assert(qnum_get_double(qnum) == value);
f294f82a
LC
98}
99
100static void test_visitor_out_string(TestOutputVisitorData *data,
101 const void *unused)
102{
103 char *string = (char *) "Q E M U";
363e13f8 104 QString *qstr;
f294f82a 105
51e72bc1 106 visit_type_str(data->ov, NULL, &string, &error_abort);
f294f82a 107
363e13f8
MA
108 qstr = qobject_to_qstring(visitor_get(data));
109 g_assert(qstr);
110 g_assert_cmpstr(qstring_get_str(qstr), ==, string);
f294f82a
LC
111}
112
113static void test_visitor_out_no_string(TestOutputVisitorData *data,
114 const void *unused)
115{
116 char *string = NULL;
363e13f8 117 QString *qstr;
f294f82a
LC
118
119 /* A null string should return "" */
51e72bc1 120 visit_type_str(data->ov, NULL, &string, &error_abort);
f294f82a 121
363e13f8
MA
122 qstr = qobject_to_qstring(visitor_get(data));
123 g_assert(qstr);
124 g_assert_cmpstr(qstring_get_str(qstr), ==, "");
f294f82a
LC
125}
126
127static void test_visitor_out_enum(TestOutputVisitorData *data,
128 const void *unused)
129{
f294f82a 130 EnumOne i;
363e13f8 131 QString *qstr;
f294f82a 132
7fb1cf16 133 for (i = 0; i < ENUM_ONE__MAX; i++) {
51e72bc1 134 visit_type_EnumOne(data->ov, "unused", &i, &error_abort);
f294f82a 135
363e13f8
MA
136 qstr = qobject_to_qstring(visitor_get(data));
137 g_assert(qstr);
977c736f 138 g_assert_cmpstr(qstring_get_str(qstr), ==, EnumOne_str(i));
f2ff429b 139 visitor_reset(data);
f294f82a
LC
140 }
141}
142
143static void test_visitor_out_enum_errors(TestOutputVisitorData *data,
144 const void *unused)
145{
7fb1cf16 146 EnumOne i, bad_values[] = { ENUM_ONE__MAX, -1 };
e940f543 147 Error *err;
f294f82a
LC
148
149 for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) {
e940f543 150 err = NULL;
51e72bc1 151 visit_type_EnumOne(data->ov, "unused", &bad_values[i], &err);
157db293 152 error_free_or_abort(&err);
f2ff429b 153 visitor_reset(data);
f294f82a
LC
154 }
155}
156
f294f82a
LC
157
158static void test_visitor_out_struct(TestOutputVisitorData *data,
159 const void *unused)
160{
161 TestStruct test_struct = { .integer = 42,
162 .boolean = false,
163 .string = (char *) "foo"};
164 TestStruct *p = &test_struct;
f294f82a
LC
165 QDict *qdict;
166
51e72bc1 167 visit_type_TestStruct(data->ov, NULL, &p, &error_abort);
f294f82a 168
ca6b6e1e
MA
169 qdict = qobject_to_qdict(visitor_get(data));
170 g_assert(qdict);
f294f82a
LC
171 g_assert_cmpint(qdict_size(qdict), ==, 3);
172 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 42);
34acbc95 173 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, false);
f294f82a 174 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "foo");
f294f82a
LC
175}
176
177static void test_visitor_out_struct_nested(TestOutputVisitorData *data,
178 const void *unused)
179{
180 int64_t value = 42;
b6fcf32d 181 UserDefTwo *ud2;
f294f82a
LC
182 QDict *qdict, *dict1, *dict2, *dict3, *userdef;
183 const char *string = "user def string";
beae9d79
SW
184 const char *strings[] = { "forty two", "forty three", "forty four",
185 "forty five" };
f294f82a
LC
186
187 ud2 = g_malloc0(sizeof(*ud2));
188 ud2->string0 = g_strdup(strings[0]);
189
6446a592
EB
190 ud2->dict1 = g_malloc0(sizeof(*ud2->dict1));
191 ud2->dict1->string1 = g_strdup(strings[1]);
192
193 ud2->dict1->dict2 = g_malloc0(sizeof(*ud2->dict1->dict2));
194 ud2->dict1->dict2->userdef = g_new0(UserDefOne, 1);
195 ud2->dict1->dict2->userdef->string = g_strdup(string);
ddf21908 196 ud2->dict1->dict2->userdef->integer = value;
6446a592
EB
197 ud2->dict1->dict2->string = g_strdup(strings[2]);
198
199 ud2->dict1->dict3 = g_malloc0(sizeof(*ud2->dict1->dict3));
200 ud2->dict1->has_dict3 = true;
201 ud2->dict1->dict3->userdef = g_new0(UserDefOne, 1);
202 ud2->dict1->dict3->userdef->string = g_strdup(string);
ddf21908 203 ud2->dict1->dict3->userdef->integer = value;
6446a592 204 ud2->dict1->dict3->string = g_strdup(strings[3]);
f294f82a 205
51e72bc1 206 visit_type_UserDefTwo(data->ov, "unused", &ud2, &error_abort);
f294f82a 207
ca6b6e1e
MA
208 qdict = qobject_to_qdict(visitor_get(data));
209 g_assert(qdict);
f294f82a
LC
210 g_assert_cmpint(qdict_size(qdict), ==, 2);
211 g_assert_cmpstr(qdict_get_str(qdict, "string0"), ==, strings[0]);
212
213 dict1 = qdict_get_qdict(qdict, "dict1");
214 g_assert_cmpint(qdict_size(dict1), ==, 3);
215 g_assert_cmpstr(qdict_get_str(dict1, "string1"), ==, strings[1]);
216
217 dict2 = qdict_get_qdict(dict1, "dict2");
218 g_assert_cmpint(qdict_size(dict2), ==, 2);
b6fcf32d
EB
219 g_assert_cmpstr(qdict_get_str(dict2, "string"), ==, strings[2]);
220 userdef = qdict_get_qdict(dict2, "userdef");
f294f82a
LC
221 g_assert_cmpint(qdict_size(userdef), ==, 2);
222 g_assert_cmpint(qdict_get_int(userdef, "integer"), ==, value);
223 g_assert_cmpstr(qdict_get_str(userdef, "string"), ==, string);
224
225 dict3 = qdict_get_qdict(dict1, "dict3");
226 g_assert_cmpint(qdict_size(dict3), ==, 2);
b6fcf32d
EB
227 g_assert_cmpstr(qdict_get_str(dict3, "string"), ==, strings[3]);
228 userdef = qdict_get_qdict(dict3, "userdef");
f294f82a
LC
229 g_assert_cmpint(qdict_size(userdef), ==, 2);
230 g_assert_cmpint(qdict_get_int(userdef, "integer"), ==, value);
231 g_assert_cmpstr(qdict_get_str(userdef, "string"), ==, string);
232
b6fcf32d 233 qapi_free_UserDefTwo(ud2);
f294f82a
LC
234}
235
9e9eace8
PB
236static void test_visitor_out_struct_errors(TestOutputVisitorData *data,
237 const void *unused)
238{
7fb1cf16 239 EnumOne bad_values[] = { ENUM_ONE__MAX, -1 };
ddf21908
EB
240 UserDefOne u = {0};
241 UserDefOne *pu = &u;
e940f543 242 Error *err;
9e9eace8
PB
243 int i;
244
245 for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) {
e940f543 246 err = NULL;
9e9eace8
PB
247 u.has_enum1 = true;
248 u.enum1 = bad_values[i];
51e72bc1 249 visit_type_UserDefOne(data->ov, "unused", &pu, &err);
157db293 250 error_free_or_abort(&err);
f2ff429b 251 visitor_reset(data);
9e9eace8
PB
252 }
253}
254
f294f82a
LC
255
256static void test_visitor_out_list(TestOutputVisitorData *data,
257 const void *unused)
258{
bd20588d 259 const char *value_str = "list value";
f294f82a
LC
260 TestStructList *p, *head = NULL;
261 const int max_items = 10;
262 bool value_bool = true;
263 int value_int = 10;
f294f82a 264 QListEntry *entry;
f294f82a
LC
265 QList *qlist;
266 int i;
267
bd20588d 268 /* Build the list in reverse order... */
f294f82a
LC
269 for (i = 0; i < max_items; i++) {
270 p = g_malloc0(sizeof(*p));
271 p->value = g_malloc0(sizeof(*p->value));
bd20588d 272 p->value->integer = value_int + (max_items - i - 1);
f294f82a 273 p->value->boolean = value_bool;
bd20588d 274 p->value->string = g_strdup(value_str);
f294f82a
LC
275
276 p->next = head;
277 head = p;
278 }
279
51e72bc1 280 visit_type_TestStructList(data->ov, NULL, &head, &error_abort);
f294f82a 281
cd17ba51
MA
282 qlist = qobject_to_qlist(visitor_get(data));
283 g_assert(qlist);
f294f82a
LC
284 g_assert(!qlist_empty(qlist));
285
bd20588d 286 /* ...and ensure that the visitor sees it in order */
f294f82a
LC
287 i = 0;
288 QLIST_FOREACH_ENTRY(qlist, entry) {
289 QDict *qdict;
290
f294f82a 291 qdict = qobject_to_qdict(entry->value);
ca6b6e1e 292 g_assert(qdict);
f294f82a 293 g_assert_cmpint(qdict_size(qdict), ==, 3);
bd20588d 294 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, value_int + i);
f294f82a
LC
295 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, value_bool);
296 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, value_str);
297 i++;
298 }
299 g_assert_cmpint(i, ==, max_items);
300
bd20588d 301 qapi_free_TestStructList(head);
f294f82a
LC
302}
303
304static void test_visitor_out_list_qapi_free(TestOutputVisitorData *data,
305 const void *unused)
306{
b6fcf32d 307 UserDefTwoList *p, *head = NULL;
f294f82a
LC
308 const char string[] = "foo bar";
309 int i, max_count = 1024;
310
311 for (i = 0; i < max_count; i++) {
312 p = g_malloc0(sizeof(*p));
313 p->value = g_malloc0(sizeof(*p->value));
314
315 p->value->string0 = g_strdup(string);
6446a592
EB
316 p->value->dict1 = g_new0(UserDefTwoDict, 1);
317 p->value->dict1->string1 = g_strdup(string);
318 p->value->dict1->dict2 = g_new0(UserDefTwoDictDict, 1);
319 p->value->dict1->dict2->userdef = g_new0(UserDefOne, 1);
320 p->value->dict1->dict2->userdef->string = g_strdup(string);
ddf21908 321 p->value->dict1->dict2->userdef->integer = 42;
6446a592
EB
322 p->value->dict1->dict2->string = g_strdup(string);
323 p->value->dict1->has_dict3 = false;
f294f82a
LC
324
325 p->next = head;
326 head = p;
327 }
328
b6fcf32d 329 qapi_free_UserDefTwoList(head);
f294f82a
LC
330}
331
28770e05
MA
332static void test_visitor_out_any(TestOutputVisitorData *data,
333 const void *unused)
334{
335 QObject *qobj;
01b2ffce 336 QNum *qnum;
28770e05
MA
337 QBool *qbool;
338 QString *qstring;
339 QDict *qdict;
01b2ffce 340 int64_t val;
28770e05 341
01b2ffce 342 qobj = QOBJECT(qnum_from_int(-42));
51e72bc1 343 visit_type_any(data->ov, NULL, &qobj, &error_abort);
01b2ffce
MAL
344 qnum = qobject_to_qnum(visitor_get(data));
345 g_assert(qnum);
346 g_assert(qnum_get_try_int(qnum, &val));
347 g_assert_cmpint(val, ==, -42);
28770e05
MA
348 qobject_decref(qobj);
349
f2ff429b 350 visitor_reset(data);
28770e05 351 qdict = qdict_new();
46f5ac20
EB
352 qdict_put_int(qdict, "integer", -42);
353 qdict_put_bool(qdict, "boolean", true);
354 qdict_put_str(qdict, "string", "foo");
28770e05 355 qobj = QOBJECT(qdict);
51e72bc1 356 visit_type_any(data->ov, NULL, &qobj, &error_abort);
b18f1141 357 qobject_decref(qobj);
ca6b6e1e 358 qdict = qobject_to_qdict(visitor_get(data));
28770e05 359 g_assert(qdict);
01b2ffce
MAL
360 qnum = qobject_to_qnum(qdict_get(qdict, "integer"));
361 g_assert(qnum);
362 g_assert(qnum_get_try_int(qnum, &val));
363 g_assert_cmpint(val, ==, -42);
dfad9ec4 364 qbool = qobject_to_qbool(qdict_get(qdict, "boolean"));
28770e05
MA
365 g_assert(qbool);
366 g_assert(qbool_get_bool(qbool) == true);
363e13f8 367 qstring = qobject_to_qstring(qdict_get(qdict, "string"));
28770e05
MA
368 g_assert(qstring);
369 g_assert_cmpstr(qstring_get_str(qstring), ==, "foo");
28770e05
MA
370}
371
2fc00432
MA
372static void test_visitor_out_union_flat(TestOutputVisitorData *data,
373 const void *unused)
374{
2fc00432
MA
375 QDict *qdict;
376
2fc00432 377 UserDefFlatUnion *tmp = g_malloc0(sizeof(UserDefFlatUnion));
0f61af3e 378 tmp->enum1 = ENUM_ONE_VALUE1;
5223070c 379 tmp->string = g_strdup("str");
c363acef 380 tmp->integer = 41;
544a3731 381 tmp->u.value1.boolean = true;
2fc00432 382
51e72bc1 383 visit_type_UserDefFlatUnion(data->ov, NULL, &tmp, &error_abort);
ca6b6e1e
MA
384 qdict = qobject_to_qdict(visitor_get(data));
385 g_assert(qdict);
5223070c
WX
386 g_assert_cmpstr(qdict_get_str(qdict, "enum1"), ==, "value1");
387 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "str");
c363acef 388 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 41);
2fc00432
MA
389 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, true);
390
391 qapi_free_UserDefFlatUnion(tmp);
2fc00432
MA
392}
393
ab045267
EB
394static void test_visitor_out_alternate(TestOutputVisitorData *data,
395 const void *unused)
2c38b600 396{
12fafd7c 397 UserDefAlternate *tmp;
01b2ffce 398 QNum *qnum;
363e13f8 399 QString *qstr;
68d07839 400 QDict *qdict;
01b2ffce 401 int64_t val;
2c38b600 402
12fafd7c 403 tmp = g_new0(UserDefAlternate, 1);
01b2ffce 404 tmp->type = QTYPE_QNUM;
c363acef 405 tmp->u.i = 42;
2c38b600 406
51e72bc1 407 visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
01b2ffce
MAL
408 qnum = qobject_to_qnum(visitor_get(data));
409 g_assert(qnum);
410 g_assert(qnum_get_try_int(qnum, &val));
411 g_assert_cmpint(val, ==, 42);
2c38b600 412
ab045267 413 qapi_free_UserDefAlternate(tmp);
12fafd7c 414
f2ff429b 415 visitor_reset(data);
12fafd7c 416 tmp = g_new0(UserDefAlternate, 1);
0426d53c 417 tmp->type = QTYPE_QSTRING;
8168ca8e 418 tmp->u.e = ENUM_ONE_VALUE1;
12fafd7c 419
51e72bc1 420 visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
363e13f8
MA
421 qstr = qobject_to_qstring(visitor_get(data));
422 g_assert(qstr);
8168ca8e 423 g_assert_cmpstr(qstring_get_str(qstr), ==, "value1");
12fafd7c
EB
424
425 qapi_free_UserDefAlternate(tmp);
68d07839 426
4d2d5c41
MA
427 visitor_reset(data);
428 tmp = g_new0(UserDefAlternate, 1);
429 tmp->type = QTYPE_QNULL;
430 tmp->u.n = qnull();
431
432 visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
433 g_assert_cmpint(qobject_type(visitor_get(data)), ==, QTYPE_QNULL);
434
435 qapi_free_UserDefAlternate(tmp);
436
f2ff429b 437 visitor_reset(data);
68d07839
EB
438 tmp = g_new0(UserDefAlternate, 1);
439 tmp->type = QTYPE_QDICT;
becceedc
EB
440 tmp->u.udfu.integer = 1;
441 tmp->u.udfu.string = g_strdup("str");
442 tmp->u.udfu.enum1 = ENUM_ONE_VALUE1;
544a3731 443 tmp->u.udfu.u.value1.boolean = true;
68d07839
EB
444
445 visit_type_UserDefAlternate(data->ov, NULL, &tmp, &error_abort);
ca6b6e1e
MA
446 qdict = qobject_to_qdict(visitor_get(data));
447 g_assert(qdict);
68d07839
EB
448 g_assert_cmpint(qdict_size(qdict), ==, 4);
449 g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 1);
450 g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "str");
451 g_assert_cmpstr(qdict_get_str(qdict, "enum1"), ==, "value1");
452 g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, true);
453
454 qapi_free_UserDefAlternate(tmp);
2c38b600
MA
455}
456
3df016f1
EB
457static void test_visitor_out_null(TestOutputVisitorData *data,
458 const void *unused)
a199b2b6 459{
d2f95f4d 460 QNull *null = NULL;
3df016f1
EB
461 QDict *qdict;
462 QObject *nil;
a199b2b6 463
3df016f1 464 visit_start_struct(data->ov, NULL, NULL, 0, &error_abort);
d2f95f4d 465 visit_type_null(data->ov, "a", &null, &error_abort);
15c2f669 466 visit_check_struct(data->ov, &error_abort);
1158bb2a 467 visit_end_struct(data->ov, NULL);
ca6b6e1e
MA
468 qdict = qobject_to_qdict(visitor_get(data));
469 g_assert(qdict);
3df016f1
EB
470 g_assert_cmpint(qdict_size(qdict), ==, 1);
471 nil = qdict_get(qdict, "a");
472 g_assert(nil);
473 g_assert(qobject_type(nil) == QTYPE_QNULL);
a199b2b6
MA
474}
475
83c84667
MR
476static void init_native_list(UserDefNativeListUnion *cvalue)
477{
478 int i;
c363acef 479 switch (cvalue->type) {
83c84667 480 case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER: {
32bafa8f 481 intList **list = &cvalue->u.integer.data;
83c84667
MR
482 for (i = 0; i < 32; i++) {
483 *list = g_new0(intList, 1);
484 (*list)->value = i;
485 (*list)->next = NULL;
486 list = &(*list)->next;
487 }
488 break;
489 }
490 case USER_DEF_NATIVE_LIST_UNION_KIND_S8: {
32bafa8f 491 int8List **list = &cvalue->u.s8.data;
83c84667
MR
492 for (i = 0; i < 32; i++) {
493 *list = g_new0(int8List, 1);
494 (*list)->value = i;
495 (*list)->next = NULL;
496 list = &(*list)->next;
497 }
498 break;
499 }
500 case USER_DEF_NATIVE_LIST_UNION_KIND_S16: {
32bafa8f 501 int16List **list = &cvalue->u.s16.data;
83c84667
MR
502 for (i = 0; i < 32; i++) {
503 *list = g_new0(int16List, 1);
504 (*list)->value = i;
505 (*list)->next = NULL;
506 list = &(*list)->next;
507 }
508 break;
509 }
510 case USER_DEF_NATIVE_LIST_UNION_KIND_S32: {
32bafa8f 511 int32List **list = &cvalue->u.s32.data;
83c84667
MR
512 for (i = 0; i < 32; i++) {
513 *list = g_new0(int32List, 1);
514 (*list)->value = i;
515 (*list)->next = NULL;
516 list = &(*list)->next;
517 }
518 break;
519 }
520 case USER_DEF_NATIVE_LIST_UNION_KIND_S64: {
32bafa8f 521 int64List **list = &cvalue->u.s64.data;
83c84667
MR
522 for (i = 0; i < 32; i++) {
523 *list = g_new0(int64List, 1);
524 (*list)->value = i;
525 (*list)->next = NULL;
526 list = &(*list)->next;
527 }
528 break;
529 }
530 case USER_DEF_NATIVE_LIST_UNION_KIND_U8: {
32bafa8f 531 uint8List **list = &cvalue->u.u8.data;
83c84667
MR
532 for (i = 0; i < 32; i++) {
533 *list = g_new0(uint8List, 1);
534 (*list)->value = i;
535 (*list)->next = NULL;
536 list = &(*list)->next;
537 }
538 break;
539 }
540 case USER_DEF_NATIVE_LIST_UNION_KIND_U16: {
32bafa8f 541 uint16List **list = &cvalue->u.u16.data;
83c84667
MR
542 for (i = 0; i < 32; i++) {
543 *list = g_new0(uint16List, 1);
544 (*list)->value = i;
545 (*list)->next = NULL;
546 list = &(*list)->next;
547 }
548 break;
549 }
550 case USER_DEF_NATIVE_LIST_UNION_KIND_U32: {
32bafa8f 551 uint32List **list = &cvalue->u.u32.data;
83c84667
MR
552 for (i = 0; i < 32; i++) {
553 *list = g_new0(uint32List, 1);
554 (*list)->value = i;
555 (*list)->next = NULL;
556 list = &(*list)->next;
557 }
558 break;
559 }
560 case USER_DEF_NATIVE_LIST_UNION_KIND_U64: {
32bafa8f 561 uint64List **list = &cvalue->u.u64.data;
83c84667
MR
562 for (i = 0; i < 32; i++) {
563 *list = g_new0(uint64List, 1);
564 (*list)->value = i;
565 (*list)->next = NULL;
566 list = &(*list)->next;
567 }
568 break;
569 }
570 case USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN: {
32bafa8f 571 boolList **list = &cvalue->u.boolean.data;
83c84667
MR
572 for (i = 0; i < 32; i++) {
573 *list = g_new0(boolList, 1);
574 (*list)->value = (i % 3 == 0);
575 (*list)->next = NULL;
576 list = &(*list)->next;
577 }
578 break;
579 }
580 case USER_DEF_NATIVE_LIST_UNION_KIND_STRING: {
32bafa8f 581 strList **list = &cvalue->u.string.data;
83c84667
MR
582 for (i = 0; i < 32; i++) {
583 *list = g_new0(strList, 1);
584 (*list)->value = g_strdup_printf("%d", i);
585 (*list)->next = NULL;
586 list = &(*list)->next;
587 }
588 break;
589 }
590 case USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER: {
32bafa8f 591 numberList **list = &cvalue->u.number.data;
83c84667
MR
592 for (i = 0; i < 32; i++) {
593 *list = g_new0(numberList, 1);
594 (*list)->value = (double)i / 3;
595 (*list)->next = NULL;
596 list = &(*list)->next;
597 }
598 break;
599 }
600 default:
dfc6f865 601 g_assert_not_reached();
83c84667
MR
602 }
603}
604
605static void check_native_list(QObject *qobj,
606 UserDefNativeListUnionKind kind)
607{
608 QDict *qdict;
609 QList *qlist;
610 int i;
611
83c84667
MR
612 qdict = qobject_to_qdict(qobj);
613 g_assert(qdict);
614 g_assert(qdict_haskey(qdict, "data"));
615 qlist = qlist_copy(qobject_to_qlist(qdict_get(qdict, "data")));
616
617 switch (kind) {
83c84667
MR
618 case USER_DEF_NATIVE_LIST_UNION_KIND_U8:
619 case USER_DEF_NATIVE_LIST_UNION_KIND_U16:
620 case USER_DEF_NATIVE_LIST_UNION_KIND_U32:
621 case USER_DEF_NATIVE_LIST_UNION_KIND_U64:
5923f85f
MAL
622 for (i = 0; i < 32; i++) {
623 QObject *tmp;
624 QNum *qvalue;
625 uint64_t val;
626
627 tmp = qlist_peek(qlist);
628 g_assert(tmp);
629 qvalue = qobject_to_qnum(tmp);
630 g_assert(qnum_get_try_uint(qvalue, &val));
631 g_assert_cmpint(val, ==, i);
632 qobject_decref(qlist_pop(qlist));
633 }
634 break;
635
636 case USER_DEF_NATIVE_LIST_UNION_KIND_S8:
637 case USER_DEF_NATIVE_LIST_UNION_KIND_S16:
638 case USER_DEF_NATIVE_LIST_UNION_KIND_S32:
639 case USER_DEF_NATIVE_LIST_UNION_KIND_S64:
01b2ffce
MAL
640 /*
641 * All integer elements in JSON arrays get stored into QNums
642 * when we convert to QObjects, so we can check them all in
643 * the same fashion, so simply fall through here.
83c84667
MR
644 */
645 case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER:
646 for (i = 0; i < 32; i++) {
647 QObject *tmp;
01b2ffce
MAL
648 QNum *qvalue;
649 int64_t val;
650
83c84667
MR
651 tmp = qlist_peek(qlist);
652 g_assert(tmp);
01b2ffce
MAL
653 qvalue = qobject_to_qnum(tmp);
654 g_assert(qnum_get_try_int(qvalue, &val));
655 g_assert_cmpint(val, ==, i);
83c84667
MR
656 qobject_decref(qlist_pop(qlist));
657 }
658 break;
659 case USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN:
660 for (i = 0; i < 32; i++) {
661 QObject *tmp;
662 QBool *qvalue;
663 tmp = qlist_peek(qlist);
664 g_assert(tmp);
665 qvalue = qobject_to_qbool(tmp);
fc48ffc3 666 g_assert_cmpint(qbool_get_bool(qvalue), ==, i % 3 == 0);
83c84667
MR
667 qobject_decref(qlist_pop(qlist));
668 }
669 break;
670 case USER_DEF_NATIVE_LIST_UNION_KIND_STRING:
671 for (i = 0; i < 32; i++) {
672 QObject *tmp;
673 QString *qvalue;
674 gchar str[8];
675 tmp = qlist_peek(qlist);
676 g_assert(tmp);
677 qvalue = qobject_to_qstring(tmp);
678 sprintf(str, "%d", i);
679 g_assert_cmpstr(qstring_get_str(qvalue), ==, str);
680 qobject_decref(qlist_pop(qlist));
681 }
682 break;
683 case USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER:
684 for (i = 0; i < 32; i++) {
685 QObject *tmp;
01b2ffce 686 QNum *qvalue;
83c84667
MR
687 GString *double_expected = g_string_new("");
688 GString *double_actual = g_string_new("");
689
690 tmp = qlist_peek(qlist);
691 g_assert(tmp);
01b2ffce 692 qvalue = qobject_to_qnum(tmp);
83c84667 693 g_string_printf(double_expected, "%.6f", (double)i / 3);
01b2ffce 694 g_string_printf(double_actual, "%.6f", qnum_get_double(qvalue));
83c84667
MR
695 g_assert_cmpstr(double_actual->str, ==, double_expected->str);
696
697 qobject_decref(qlist_pop(qlist));
698 g_string_free(double_expected, true);
699 g_string_free(double_actual, true);
700 }
701 break;
702 default:
dfc6f865 703 g_assert_not_reached();
83c84667
MR
704 }
705 QDECREF(qlist);
706}
707
708static void test_native_list(TestOutputVisitorData *data,
709 const void *unused,
710 UserDefNativeListUnionKind kind)
711{
712 UserDefNativeListUnion *cvalue = g_new0(UserDefNativeListUnion, 1);
83c84667
MR
713 QObject *obj;
714
c363acef 715 cvalue->type = kind;
83c84667
MR
716 init_native_list(cvalue);
717
51e72bc1 718 visit_type_UserDefNativeListUnion(data->ov, NULL, &cvalue, &error_abort);
83c84667 719
23d1705f 720 obj = visitor_get(data);
c363acef 721 check_native_list(obj, cvalue->type);
83c84667 722 qapi_free_UserDefNativeListUnion(cvalue);
83c84667
MR
723}
724
725static void test_visitor_out_native_list_int(TestOutputVisitorData *data,
726 const void *unused)
727{
728 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER);
729}
730
731static void test_visitor_out_native_list_int8(TestOutputVisitorData *data,
732 const void *unused)
733{
734 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_S8);
735}
736
737static void test_visitor_out_native_list_int16(TestOutputVisitorData *data,
738 const void *unused)
739{
740 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_S16);
741}
742
743static void test_visitor_out_native_list_int32(TestOutputVisitorData *data,
744 const void *unused)
745{
746 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_S32);
747}
748
749static void test_visitor_out_native_list_int64(TestOutputVisitorData *data,
750 const void *unused)
751{
752 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_S64);
753}
754
755static void test_visitor_out_native_list_uint8(TestOutputVisitorData *data,
756 const void *unused)
757{
758 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_U8);
759}
760
761static void test_visitor_out_native_list_uint16(TestOutputVisitorData *data,
762 const void *unused)
763{
764 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_U16);
765}
766
767static void test_visitor_out_native_list_uint32(TestOutputVisitorData *data,
768 const void *unused)
769{
770 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_U32);
771}
772
773static void test_visitor_out_native_list_uint64(TestOutputVisitorData *data,
774 const void *unused)
775{
776 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_U64);
777}
778
779static void test_visitor_out_native_list_bool(TestOutputVisitorData *data,
780 const void *unused)
781{
782 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN);
783}
784
785static void test_visitor_out_native_list_str(TestOutputVisitorData *data,
786 const void *unused)
787{
788 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_STRING);
789}
790
791static void test_visitor_out_native_list_number(TestOutputVisitorData *data,
792 const void *unused)
793{
794 test_native_list(data, unused, USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER);
795}
796
f294f82a
LC
797static void output_visitor_test_add(const char *testpath,
798 TestOutputVisitorData *data,
799 void (*test_func)(TestOutputVisitorData *data, const void *user_data))
800{
801 g_test_add(testpath, TestOutputVisitorData, data, visitor_output_setup,
802 test_func, visitor_output_teardown);
803}
804
805int main(int argc, char **argv)
806{
807 TestOutputVisitorData out_visitor_data;
808
809 g_test_init(&argc, &argv, NULL);
810
811 output_visitor_test_add("/visitor/output/int",
812 &out_visitor_data, test_visitor_out_int);
813 output_visitor_test_add("/visitor/output/bool",
814 &out_visitor_data, test_visitor_out_bool);
815 output_visitor_test_add("/visitor/output/number",
816 &out_visitor_data, test_visitor_out_number);
817 output_visitor_test_add("/visitor/output/string",
818 &out_visitor_data, test_visitor_out_string);
819 output_visitor_test_add("/visitor/output/no-string",
820 &out_visitor_data, test_visitor_out_no_string);
821 output_visitor_test_add("/visitor/output/enum",
822 &out_visitor_data, test_visitor_out_enum);
823 output_visitor_test_add("/visitor/output/enum-errors",
824 &out_visitor_data, test_visitor_out_enum_errors);
825 output_visitor_test_add("/visitor/output/struct",
826 &out_visitor_data, test_visitor_out_struct);
827 output_visitor_test_add("/visitor/output/struct-nested",
828 &out_visitor_data, test_visitor_out_struct_nested);
9e9eace8
PB
829 output_visitor_test_add("/visitor/output/struct-errors",
830 &out_visitor_data, test_visitor_out_struct_errors);
f294f82a
LC
831 output_visitor_test_add("/visitor/output/list",
832 &out_visitor_data, test_visitor_out_list);
28770e05
MA
833 output_visitor_test_add("/visitor/output/any",
834 &out_visitor_data, test_visitor_out_any);
f294f82a
LC
835 output_visitor_test_add("/visitor/output/list-qapi-free",
836 &out_visitor_data, test_visitor_out_list_qapi_free);
2fc00432
MA
837 output_visitor_test_add("/visitor/output/union-flat",
838 &out_visitor_data, test_visitor_out_union_flat);
ab045267
EB
839 output_visitor_test_add("/visitor/output/alternate",
840 &out_visitor_data, test_visitor_out_alternate);
3df016f1
EB
841 output_visitor_test_add("/visitor/output/null",
842 &out_visitor_data, test_visitor_out_null);
83c84667 843 output_visitor_test_add("/visitor/output/native_list/int",
805017b7
EB
844 &out_visitor_data,
845 test_visitor_out_native_list_int);
83c84667 846 output_visitor_test_add("/visitor/output/native_list/int8",
805017b7
EB
847 &out_visitor_data,
848 test_visitor_out_native_list_int8);
83c84667 849 output_visitor_test_add("/visitor/output/native_list/int16",
805017b7
EB
850 &out_visitor_data,
851 test_visitor_out_native_list_int16);
83c84667 852 output_visitor_test_add("/visitor/output/native_list/int32",
805017b7
EB
853 &out_visitor_data,
854 test_visitor_out_native_list_int32);
83c84667 855 output_visitor_test_add("/visitor/output/native_list/int64",
805017b7
EB
856 &out_visitor_data,
857 test_visitor_out_native_list_int64);
83c84667 858 output_visitor_test_add("/visitor/output/native_list/uint8",
805017b7
EB
859 &out_visitor_data,
860 test_visitor_out_native_list_uint8);
83c84667 861 output_visitor_test_add("/visitor/output/native_list/uint16",
805017b7
EB
862 &out_visitor_data,
863 test_visitor_out_native_list_uint16);
83c84667 864 output_visitor_test_add("/visitor/output/native_list/uint32",
805017b7
EB
865 &out_visitor_data,
866 test_visitor_out_native_list_uint32);
83c84667 867 output_visitor_test_add("/visitor/output/native_list/uint64",
805017b7
EB
868 &out_visitor_data,
869 test_visitor_out_native_list_uint64);
83c84667 870 output_visitor_test_add("/visitor/output/native_list/bool",
805017b7
EB
871 &out_visitor_data,
872 test_visitor_out_native_list_bool);
83c84667 873 output_visitor_test_add("/visitor/output/native_list/string",
805017b7
EB
874 &out_visitor_data,
875 test_visitor_out_native_list_str);
83c84667 876 output_visitor_test_add("/visitor/output/native_list/number",
805017b7
EB
877 &out_visitor_data,
878 test_visitor_out_native_list_number);
f294f82a
LC
879
880 g_test_run();
881
882 return 0;
883}
This page took 0.573839 seconds and 4 git commands to generate.