1d88f5fd1SLuiz Capitulino /* 2b3db211fSDaniel P. Berrange * QObject Input Visitor unit-tests. 3d88f5fd1SLuiz Capitulino * 468d07839SEric Blake * Copyright (C) 2011-2016 Red Hat Inc. 5d88f5fd1SLuiz Capitulino * 6d88f5fd1SLuiz Capitulino * Authors: 7d88f5fd1SLuiz Capitulino * Luiz Capitulino <lcapitulino@redhat.com> 877c47de2SMarkus Armbruster * Paolo Bonzini <pbonzini@redhat.com> 9d88f5fd1SLuiz Capitulino * 10d88f5fd1SLuiz Capitulino * This work is licensed under the terms of the GNU GPL, version 2 or later. 11d88f5fd1SLuiz Capitulino * See the COPYING file in the top-level directory. 12d88f5fd1SLuiz Capitulino */ 13d88f5fd1SLuiz Capitulino 14681c28a3SPeter Maydell #include "qemu/osdep.h" 15d88f5fd1SLuiz Capitulino 1679ee7df8SPaolo Bonzini #include "qemu-common.h" 17da34e65cSMarkus Armbruster #include "qapi/error.h" 18b3db211fSDaniel P. Berrange #include "qapi/qobject-input-visitor.h" 19d88f5fd1SLuiz Capitulino #include "test-qapi-visit.h" 206b673957SMarkus Armbruster #include "qapi/qmp/qbool.h" 21452fcdbcSMarkus Armbruster #include "qapi/qmp/qdict.h" 2215280c36SMarkus Armbruster #include "qapi/qmp/qnull.h" 2315280c36SMarkus Armbruster #include "qapi/qmp/qnum.h" 24*fc81fa1eSMarkus Armbruster #include "qapi/qmp/qstring.h" 25c7eb39cbSEric Blake #include "qapi/qmp/qjson.h" 2677c47de2SMarkus Armbruster #include "test-qmp-introspect.h" 2777c47de2SMarkus Armbruster #include "qmp-introspect.h" 2877c47de2SMarkus Armbruster #include "qapi-visit.h" 29d88f5fd1SLuiz Capitulino 30d88f5fd1SLuiz Capitulino typedef struct TestInputVisitorData { 31d88f5fd1SLuiz Capitulino QObject *obj; 32b70ce101SEric Blake Visitor *qiv; 33d88f5fd1SLuiz Capitulino } TestInputVisitorData; 34d88f5fd1SLuiz Capitulino 35d88f5fd1SLuiz Capitulino static void visitor_input_teardown(TestInputVisitorData *data, 36d88f5fd1SLuiz Capitulino const void *unused) 37d88f5fd1SLuiz Capitulino { 38d88f5fd1SLuiz Capitulino qobject_decref(data->obj); 39d88f5fd1SLuiz Capitulino data->obj = NULL; 40d88f5fd1SLuiz Capitulino 41d88f5fd1SLuiz Capitulino if (data->qiv) { 42b70ce101SEric Blake visit_free(data->qiv); 43d88f5fd1SLuiz Capitulino data->qiv = NULL; 44d88f5fd1SLuiz Capitulino } 45d88f5fd1SLuiz Capitulino } 46d88f5fd1SLuiz Capitulino 470920a171SEric Blake /* The various test_init functions are provided instead of a test setup 480920a171SEric Blake function so that the JSON string used by the tests are kept in the test 490920a171SEric Blake functions (and not in main()). */ 500920a171SEric Blake static Visitor *visitor_input_test_init_internal(TestInputVisitorData *data, 51cbd8acf3SDaniel P. Berrange bool keyval, 520920a171SEric Blake const char *json_string, 530920a171SEric Blake va_list *ap) 540920a171SEric Blake { 55b18f1141SEric Blake visitor_input_teardown(data, NULL); 56b18f1141SEric Blake 57bff17e84SMarkus Armbruster data->obj = qobject_from_jsonv(json_string, ap, &error_abort); 580920a171SEric Blake g_assert(data->obj); 590920a171SEric Blake 60cbd8acf3SDaniel P. Berrange if (keyval) { 61cbd8acf3SDaniel P. Berrange data->qiv = qobject_input_visitor_new_keyval(data->obj); 62cbd8acf3SDaniel P. Berrange } else { 63048abb7bSMarkus Armbruster data->qiv = qobject_input_visitor_new(data->obj); 64cbd8acf3SDaniel P. Berrange } 650920a171SEric Blake g_assert(data->qiv); 66b70ce101SEric Blake return data->qiv; 670920a171SEric Blake } 680920a171SEric Blake 69cbd8acf3SDaniel P. Berrange static GCC_FMT_ATTR(3, 4) 70cbd8acf3SDaniel P. Berrange Visitor *visitor_input_test_init_full(TestInputVisitorData *data, 71cbd8acf3SDaniel P. Berrange bool keyval, 72cbd8acf3SDaniel P. Berrange const char *json_string, ...) 73cbd8acf3SDaniel P. Berrange { 74cbd8acf3SDaniel P. Berrange Visitor *v; 75cbd8acf3SDaniel P. Berrange va_list ap; 76cbd8acf3SDaniel P. Berrange 77cbd8acf3SDaniel P. Berrange va_start(ap, json_string); 78cbd8acf3SDaniel P. Berrange v = visitor_input_test_init_internal(data, keyval, json_string, &ap); 79cbd8acf3SDaniel P. Berrange va_end(ap); 80cbd8acf3SDaniel P. Berrange return v; 81cbd8acf3SDaniel P. Berrange } 82cbd8acf3SDaniel P. Berrange 83aba2107aSStefan Weil static GCC_FMT_ATTR(2, 3) 84aba2107aSStefan Weil Visitor *visitor_input_test_init(TestInputVisitorData *data, 85d88f5fd1SLuiz Capitulino const char *json_string, ...) 86d88f5fd1SLuiz Capitulino { 87d88f5fd1SLuiz Capitulino Visitor *v; 88d88f5fd1SLuiz Capitulino va_list ap; 89d88f5fd1SLuiz Capitulino 90d88f5fd1SLuiz Capitulino va_start(ap, json_string); 91cbd8acf3SDaniel P. Berrange v = visitor_input_test_init_internal(data, false, json_string, &ap); 92d88f5fd1SLuiz Capitulino va_end(ap); 93d88f5fd1SLuiz Capitulino return v; 94d88f5fd1SLuiz Capitulino } 95d88f5fd1SLuiz Capitulino 96199e0f17SMichael Roth /* similar to visitor_input_test_init(), but does not expect a string 97199e0f17SMichael Roth * literal/format json_string argument and so can be used for 98199e0f17SMichael Roth * programatically generated strings (and we can't pass in programatically 99199e0f17SMichael Roth * generated strings via %s format parameters since qobject_from_jsonv() 100199e0f17SMichael Roth * will wrap those in double-quotes and treat the entire object as a 101199e0f17SMichael Roth * string) 102199e0f17SMichael Roth */ 103199e0f17SMichael Roth static Visitor *visitor_input_test_init_raw(TestInputVisitorData *data, 104199e0f17SMichael Roth const char *json_string) 105199e0f17SMichael Roth { 106cbd8acf3SDaniel P. Berrange return visitor_input_test_init_internal(data, false, json_string, NULL); 107199e0f17SMichael Roth } 108199e0f17SMichael Roth 109d88f5fd1SLuiz Capitulino static void test_visitor_in_int(TestInputVisitorData *data, 110d88f5fd1SLuiz Capitulino const void *unused) 111d88f5fd1SLuiz Capitulino { 11229a6731aSEric Blake int64_t res = 0; 113c1214ad3SMarc-André Lureau double dbl; 11429a6731aSEric Blake int value = -42; 115d88f5fd1SLuiz Capitulino Visitor *v; 116d88f5fd1SLuiz Capitulino 11729a6731aSEric Blake v = visitor_input_test_init(data, "%d", value); 118d88f5fd1SLuiz Capitulino 11951e72bc1SEric Blake visit_type_int(v, NULL, &res, &error_abort); 120d88f5fd1SLuiz Capitulino g_assert_cmpint(res, ==, value); 121c1214ad3SMarc-André Lureau 122c1214ad3SMarc-André Lureau visit_type_number(v, NULL, &dbl, &error_abort); 123c1214ad3SMarc-André Lureau g_assert_cmpfloat(dbl, ==, -42.0); 124d88f5fd1SLuiz Capitulino } 125d88f5fd1SLuiz Capitulino 1264bc0c94dSMarkus Armbruster static void test_visitor_in_uint(TestInputVisitorData *data, 1274bc0c94dSMarkus Armbruster const void *unused) 1284bc0c94dSMarkus Armbruster { 1294bc0c94dSMarkus Armbruster uint64_t res = 0; 130c1214ad3SMarc-André Lureau int64_t i64; 131c1214ad3SMarc-André Lureau double dbl; 1324bc0c94dSMarkus Armbruster int value = 42; 1334bc0c94dSMarkus Armbruster Visitor *v; 1344bc0c94dSMarkus Armbruster 1354bc0c94dSMarkus Armbruster v = visitor_input_test_init(data, "%d", value); 1364bc0c94dSMarkus Armbruster 1374bc0c94dSMarkus Armbruster visit_type_uint64(v, NULL, &res, &error_abort); 1384bc0c94dSMarkus Armbruster g_assert_cmpuint(res, ==, (uint64_t)value); 1394bc0c94dSMarkus Armbruster 140c1214ad3SMarc-André Lureau visit_type_int(v, NULL, &i64, &error_abort); 141c1214ad3SMarc-André Lureau g_assert_cmpint(i64, ==, value); 1424bc0c94dSMarkus Armbruster 143c1214ad3SMarc-André Lureau visit_type_number(v, NULL, &dbl, &error_abort); 144c1214ad3SMarc-André Lureau g_assert_cmpfloat(dbl, ==, value); 145c1214ad3SMarc-André Lureau 146c1214ad3SMarc-André Lureau /* BUG: value between INT64_MIN and -1 accepted modulo 2^64 */ 1474bc0c94dSMarkus Armbruster v = visitor_input_test_init(data, "%d", -value); 1484bc0c94dSMarkus Armbruster 1494bc0c94dSMarkus Armbruster visit_type_uint64(v, NULL, &res, &error_abort); 1504bc0c94dSMarkus Armbruster g_assert_cmpuint(res, ==, (uint64_t)-value); 1514bc0c94dSMarkus Armbruster 1524bc0c94dSMarkus Armbruster v = visitor_input_test_init(data, "18446744073709551574"); 1534bc0c94dSMarkus Armbruster 1545923f85fSMarc-André Lureau visit_type_uint64(v, NULL, &res, &error_abort); 1555923f85fSMarc-André Lureau g_assert_cmpuint(res, ==, 18446744073709551574U); 156c1214ad3SMarc-André Lureau 157c1214ad3SMarc-André Lureau visit_type_number(v, NULL, &dbl, &error_abort); 158c1214ad3SMarc-André Lureau g_assert_cmpfloat(dbl, ==, 18446744073709552000.0); 1594bc0c94dSMarkus Armbruster } 1604bc0c94dSMarkus Armbruster 161e92cfa0dSMichael Roth static void test_visitor_in_int_overflow(TestInputVisitorData *data, 162e92cfa0dSMichael Roth const void *unused) 163e92cfa0dSMichael Roth { 164e92cfa0dSMichael Roth int64_t res = 0; 165e940f543SMarkus Armbruster Error *err = NULL; 166e92cfa0dSMichael Roth Visitor *v; 167e92cfa0dSMichael Roth 16801b2ffceSMarc-André Lureau /* 16901b2ffceSMarc-André Lureau * This will overflow a QNUM_I64, so should be deserialized into a 17001b2ffceSMarc-André Lureau * QNUM_DOUBLE field instead, leading to an error if we pass it to 17101b2ffceSMarc-André Lureau * visit_type_int(). Confirm this. 172e92cfa0dSMichael Roth */ 173e92cfa0dSMichael Roth v = visitor_input_test_init(data, "%f", DBL_MAX); 174e92cfa0dSMichael Roth 17551e72bc1SEric Blake visit_type_int(v, NULL, &res, &err); 176a12a5a1aSEric Blake error_free_or_abort(&err); 177e92cfa0dSMichael Roth } 178e92cfa0dSMichael Roth 179cbd8acf3SDaniel P. Berrange static void test_visitor_in_int_keyval(TestInputVisitorData *data, 180cbd8acf3SDaniel P. Berrange const void *unused) 181cbd8acf3SDaniel P. Berrange { 182cbd8acf3SDaniel P. Berrange int64_t res = 0, value = -42; 183cbd8acf3SDaniel P. Berrange Error *err = NULL; 184cbd8acf3SDaniel P. Berrange Visitor *v; 185cbd8acf3SDaniel P. Berrange 186cbd8acf3SDaniel P. Berrange v = visitor_input_test_init_full(data, true, "%" PRId64, value); 187cbd8acf3SDaniel P. Berrange visit_type_int(v, NULL, &res, &err); 188cbd8acf3SDaniel P. Berrange error_free_or_abort(&err); 189cbd8acf3SDaniel P. Berrange } 190cbd8acf3SDaniel P. Berrange 191cbd8acf3SDaniel P. Berrange static void test_visitor_in_int_str_keyval(TestInputVisitorData *data, 192cbd8acf3SDaniel P. Berrange const void *unused) 193cbd8acf3SDaniel P. Berrange { 194cbd8acf3SDaniel P. Berrange int64_t res = 0, value = -42; 195cbd8acf3SDaniel P. Berrange Visitor *v; 196cbd8acf3SDaniel P. Berrange 197cbd8acf3SDaniel P. Berrange v = visitor_input_test_init_full(data, true, "\"-42\""); 198cbd8acf3SDaniel P. Berrange 199cbd8acf3SDaniel P. Berrange visit_type_int(v, NULL, &res, &error_abort); 200cbd8acf3SDaniel P. Berrange g_assert_cmpint(res, ==, value); 201cbd8acf3SDaniel P. Berrange } 202cbd8acf3SDaniel P. Berrange 203cbd8acf3SDaniel P. Berrange static void test_visitor_in_int_str_fail(TestInputVisitorData *data, 204cbd8acf3SDaniel P. Berrange const void *unused) 205cbd8acf3SDaniel P. Berrange { 206cbd8acf3SDaniel P. Berrange int64_t res = 0; 207cbd8acf3SDaniel P. Berrange Visitor *v; 208cbd8acf3SDaniel P. Berrange Error *err = NULL; 209cbd8acf3SDaniel P. Berrange 210cbd8acf3SDaniel P. Berrange v = visitor_input_test_init(data, "\"-42\""); 211cbd8acf3SDaniel P. Berrange 212cbd8acf3SDaniel P. Berrange visit_type_int(v, NULL, &res, &err); 213cbd8acf3SDaniel P. Berrange error_free_or_abort(&err); 214cbd8acf3SDaniel P. Berrange } 215cbd8acf3SDaniel P. Berrange 216d88f5fd1SLuiz Capitulino static void test_visitor_in_bool(TestInputVisitorData *data, 217d88f5fd1SLuiz Capitulino const void *unused) 218d88f5fd1SLuiz Capitulino { 219d88f5fd1SLuiz Capitulino bool res = false; 220d88f5fd1SLuiz Capitulino Visitor *v; 221d88f5fd1SLuiz Capitulino 222d88f5fd1SLuiz Capitulino v = visitor_input_test_init(data, "true"); 223d88f5fd1SLuiz Capitulino 22451e72bc1SEric Blake visit_type_bool(v, NULL, &res, &error_abort); 225d88f5fd1SLuiz Capitulino g_assert_cmpint(res, ==, true); 226d88f5fd1SLuiz Capitulino } 227d88f5fd1SLuiz Capitulino 228cbd8acf3SDaniel P. Berrange static void test_visitor_in_bool_keyval(TestInputVisitorData *data, 229cbd8acf3SDaniel P. Berrange const void *unused) 230cbd8acf3SDaniel P. Berrange { 231cbd8acf3SDaniel P. Berrange bool res = false; 232cbd8acf3SDaniel P. Berrange Error *err = NULL; 233cbd8acf3SDaniel P. Berrange Visitor *v; 234cbd8acf3SDaniel P. Berrange 235cbd8acf3SDaniel P. Berrange v = visitor_input_test_init_full(data, true, "true"); 236cbd8acf3SDaniel P. Berrange 237cbd8acf3SDaniel P. Berrange visit_type_bool(v, NULL, &res, &err); 238cbd8acf3SDaniel P. Berrange error_free_or_abort(&err); 239cbd8acf3SDaniel P. Berrange } 240cbd8acf3SDaniel P. Berrange 241cbd8acf3SDaniel P. Berrange static void test_visitor_in_bool_str_keyval(TestInputVisitorData *data, 242cbd8acf3SDaniel P. Berrange const void *unused) 243cbd8acf3SDaniel P. Berrange { 244cbd8acf3SDaniel P. Berrange bool res = false; 245cbd8acf3SDaniel P. Berrange Visitor *v; 246cbd8acf3SDaniel P. Berrange 247cbd8acf3SDaniel P. Berrange v = visitor_input_test_init_full(data, true, "\"on\""); 248cbd8acf3SDaniel P. Berrange 249cbd8acf3SDaniel P. Berrange visit_type_bool(v, NULL, &res, &error_abort); 250cbd8acf3SDaniel P. Berrange g_assert_cmpint(res, ==, true); 251cbd8acf3SDaniel P. Berrange } 252cbd8acf3SDaniel P. Berrange 253cbd8acf3SDaniel P. Berrange static void test_visitor_in_bool_str_fail(TestInputVisitorData *data, 254cbd8acf3SDaniel P. Berrange const void *unused) 255cbd8acf3SDaniel P. Berrange { 256cbd8acf3SDaniel P. Berrange bool res = false; 257cbd8acf3SDaniel P. Berrange Visitor *v; 258cbd8acf3SDaniel P. Berrange Error *err = NULL; 259cbd8acf3SDaniel P. Berrange 260cbd8acf3SDaniel P. Berrange v = visitor_input_test_init(data, "\"true\""); 261cbd8acf3SDaniel P. Berrange 262cbd8acf3SDaniel P. Berrange visit_type_bool(v, NULL, &res, &err); 263cbd8acf3SDaniel P. Berrange error_free_or_abort(&err); 264cbd8acf3SDaniel P. Berrange } 265cbd8acf3SDaniel P. Berrange 266d88f5fd1SLuiz Capitulino static void test_visitor_in_number(TestInputVisitorData *data, 267d88f5fd1SLuiz Capitulino const void *unused) 268d88f5fd1SLuiz Capitulino { 269d88f5fd1SLuiz Capitulino double res = 0, value = 3.14; 270d88f5fd1SLuiz Capitulino Visitor *v; 271d88f5fd1SLuiz Capitulino 272d88f5fd1SLuiz Capitulino v = visitor_input_test_init(data, "%f", value); 273d88f5fd1SLuiz Capitulino 27451e72bc1SEric Blake visit_type_number(v, NULL, &res, &error_abort); 275d88f5fd1SLuiz Capitulino g_assert_cmpfloat(res, ==, value); 276d88f5fd1SLuiz Capitulino } 277d88f5fd1SLuiz Capitulino 278c1214ad3SMarc-André Lureau static void test_visitor_in_large_number(TestInputVisitorData *data, 279c1214ad3SMarc-André Lureau const void *unused) 280c1214ad3SMarc-André Lureau { 281c1214ad3SMarc-André Lureau Error *err = NULL; 282c1214ad3SMarc-André Lureau double res = 0; 283c1214ad3SMarc-André Lureau int64_t i64; 284c1214ad3SMarc-André Lureau uint64_t u64; 285c1214ad3SMarc-André Lureau Visitor *v; 286c1214ad3SMarc-André Lureau 287c1214ad3SMarc-André Lureau v = visitor_input_test_init(data, "-18446744073709551616"); /* -2^64 */ 288c1214ad3SMarc-André Lureau 289c1214ad3SMarc-André Lureau visit_type_number(v, NULL, &res, &error_abort); 290c1214ad3SMarc-André Lureau g_assert_cmpfloat(res, ==, -18446744073709552e3); 291c1214ad3SMarc-André Lureau 292c1214ad3SMarc-André Lureau visit_type_int(v, NULL, &i64, &err); 293c1214ad3SMarc-André Lureau error_free_or_abort(&err); 294c1214ad3SMarc-André Lureau 295c1214ad3SMarc-André Lureau visit_type_uint64(v, NULL, &u64, &err); 296c1214ad3SMarc-André Lureau error_free_or_abort(&err); 297c1214ad3SMarc-André Lureau } 298c1214ad3SMarc-André Lureau 299cbd8acf3SDaniel P. Berrange static void test_visitor_in_number_keyval(TestInputVisitorData *data, 300cbd8acf3SDaniel P. Berrange const void *unused) 301cbd8acf3SDaniel P. Berrange { 302cbd8acf3SDaniel P. Berrange double res = 0, value = 3.14; 303cbd8acf3SDaniel P. Berrange Error *err = NULL; 304cbd8acf3SDaniel P. Berrange Visitor *v; 305cbd8acf3SDaniel P. Berrange 306cbd8acf3SDaniel P. Berrange v = visitor_input_test_init_full(data, true, "%f", value); 307cbd8acf3SDaniel P. Berrange 308cbd8acf3SDaniel P. Berrange visit_type_number(v, NULL, &res, &err); 309cbd8acf3SDaniel P. Berrange error_free_or_abort(&err); 310cbd8acf3SDaniel P. Berrange } 311cbd8acf3SDaniel P. Berrange 312cbd8acf3SDaniel P. Berrange static void test_visitor_in_number_str_keyval(TestInputVisitorData *data, 313cbd8acf3SDaniel P. Berrange const void *unused) 314cbd8acf3SDaniel P. Berrange { 315cbd8acf3SDaniel P. Berrange double res = 0, value = 3.14; 316cbd8acf3SDaniel P. Berrange Visitor *v; 3175891c388SMarkus Armbruster Error *err = NULL; 318cbd8acf3SDaniel P. Berrange 319cbd8acf3SDaniel P. Berrange v = visitor_input_test_init_full(data, true, "\"3.14\""); 320cbd8acf3SDaniel P. Berrange 321cbd8acf3SDaniel P. Berrange visit_type_number(v, NULL, &res, &error_abort); 322cbd8acf3SDaniel P. Berrange g_assert_cmpfloat(res, ==, value); 3235891c388SMarkus Armbruster 3245891c388SMarkus Armbruster v = visitor_input_test_init_full(data, true, "\"inf\""); 3255891c388SMarkus Armbruster 3265891c388SMarkus Armbruster visit_type_number(v, NULL, &res, &err); 3275891c388SMarkus Armbruster error_free_or_abort(&err); 328cbd8acf3SDaniel P. Berrange } 329cbd8acf3SDaniel P. Berrange 330cbd8acf3SDaniel P. Berrange static void test_visitor_in_number_str_fail(TestInputVisitorData *data, 331cbd8acf3SDaniel P. Berrange const void *unused) 332cbd8acf3SDaniel P. Berrange { 333cbd8acf3SDaniel P. Berrange double res = 0; 334cbd8acf3SDaniel P. Berrange Visitor *v; 335cbd8acf3SDaniel P. Berrange Error *err = NULL; 336cbd8acf3SDaniel P. Berrange 337cbd8acf3SDaniel P. Berrange v = visitor_input_test_init(data, "\"3.14\""); 338cbd8acf3SDaniel P. Berrange 339cbd8acf3SDaniel P. Berrange visit_type_number(v, NULL, &res, &err); 340cbd8acf3SDaniel P. Berrange error_free_or_abort(&err); 341cbd8acf3SDaniel P. Berrange } 342cbd8acf3SDaniel P. Berrange 343cbd8acf3SDaniel P. Berrange static void test_visitor_in_size_str_keyval(TestInputVisitorData *data, 344cbd8acf3SDaniel P. Berrange const void *unused) 345cbd8acf3SDaniel P. Berrange { 346cbd8acf3SDaniel P. Berrange uint64_t res, value = 500 * 1024 * 1024; 347cbd8acf3SDaniel P. Berrange Visitor *v; 348cbd8acf3SDaniel P. Berrange 349cbd8acf3SDaniel P. Berrange v = visitor_input_test_init_full(data, true, "\"500M\""); 350cbd8acf3SDaniel P. Berrange 351cbd8acf3SDaniel P. Berrange visit_type_size(v, NULL, &res, &error_abort); 352cbd8acf3SDaniel P. Berrange g_assert_cmpfloat(res, ==, value); 353cbd8acf3SDaniel P. Berrange } 354cbd8acf3SDaniel P. Berrange 355cbd8acf3SDaniel P. Berrange static void test_visitor_in_size_str_fail(TestInputVisitorData *data, 356cbd8acf3SDaniel P. Berrange const void *unused) 357cbd8acf3SDaniel P. Berrange { 358cbd8acf3SDaniel P. Berrange uint64_t res = 0; 359cbd8acf3SDaniel P. Berrange Visitor *v; 360cbd8acf3SDaniel P. Berrange Error *err = NULL; 361cbd8acf3SDaniel P. Berrange 362cbd8acf3SDaniel P. Berrange v = visitor_input_test_init(data, "\"500M\""); 363cbd8acf3SDaniel P. Berrange 364cbd8acf3SDaniel P. Berrange visit_type_size(v, NULL, &res, &err); 365cbd8acf3SDaniel P. Berrange error_free_or_abort(&err); 366cbd8acf3SDaniel P. Berrange } 367cbd8acf3SDaniel P. Berrange 368d88f5fd1SLuiz Capitulino static void test_visitor_in_string(TestInputVisitorData *data, 369d88f5fd1SLuiz Capitulino const void *unused) 370d88f5fd1SLuiz Capitulino { 371d88f5fd1SLuiz Capitulino char *res = NULL, *value = (char *) "Q E M U"; 372d88f5fd1SLuiz Capitulino Visitor *v; 373d88f5fd1SLuiz Capitulino 374d88f5fd1SLuiz Capitulino v = visitor_input_test_init(data, "%s", value); 375d88f5fd1SLuiz Capitulino 37651e72bc1SEric Blake visit_type_str(v, NULL, &res, &error_abort); 377d88f5fd1SLuiz Capitulino g_assert_cmpstr(res, ==, value); 378d88f5fd1SLuiz Capitulino 379d88f5fd1SLuiz Capitulino g_free(res); 380d88f5fd1SLuiz Capitulino } 381d88f5fd1SLuiz Capitulino 382d88f5fd1SLuiz Capitulino static void test_visitor_in_enum(TestInputVisitorData *data, 383d88f5fd1SLuiz Capitulino const void *unused) 384d88f5fd1SLuiz Capitulino { 385d88f5fd1SLuiz Capitulino Visitor *v; 386d88f5fd1SLuiz Capitulino EnumOne i; 387d88f5fd1SLuiz Capitulino 3881c236ba5SMarkus Armbruster for (i = 0; i < ENUM_ONE__MAX; i++) { 389d88f5fd1SLuiz Capitulino EnumOne res = -1; 390d88f5fd1SLuiz Capitulino 391977c736fSMarkus Armbruster v = visitor_input_test_init(data, "%s", EnumOne_str(i)); 392d88f5fd1SLuiz Capitulino 39351e72bc1SEric Blake visit_type_EnumOne(v, NULL, &res, &error_abort); 394d88f5fd1SLuiz Capitulino g_assert_cmpint(i, ==, res); 395d88f5fd1SLuiz Capitulino } 396d88f5fd1SLuiz Capitulino } 397d88f5fd1SLuiz Capitulino 398d88f5fd1SLuiz Capitulino 399d88f5fd1SLuiz Capitulino static void test_visitor_in_struct(TestInputVisitorData *data, 400d88f5fd1SLuiz Capitulino const void *unused) 401d88f5fd1SLuiz Capitulino { 402d88f5fd1SLuiz Capitulino TestStruct *p = NULL; 403d88f5fd1SLuiz Capitulino Visitor *v; 404d88f5fd1SLuiz Capitulino 405d88f5fd1SLuiz Capitulino v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }"); 406d88f5fd1SLuiz Capitulino 40751e72bc1SEric Blake visit_type_TestStruct(v, NULL, &p, &error_abort); 408d88f5fd1SLuiz Capitulino g_assert_cmpint(p->integer, ==, -42); 409d88f5fd1SLuiz Capitulino g_assert(p->boolean == true); 410d88f5fd1SLuiz Capitulino g_assert_cmpstr(p->string, ==, "foo"); 411d88f5fd1SLuiz Capitulino 412d88f5fd1SLuiz Capitulino g_free(p->string); 413d88f5fd1SLuiz Capitulino g_free(p); 414d88f5fd1SLuiz Capitulino } 415d88f5fd1SLuiz Capitulino 416d88f5fd1SLuiz Capitulino static void test_visitor_in_struct_nested(TestInputVisitorData *data, 417d88f5fd1SLuiz Capitulino const void *unused) 418d88f5fd1SLuiz Capitulino { 419b6fcf32dSEric Blake UserDefTwo *udp = NULL; 420d88f5fd1SLuiz Capitulino Visitor *v; 421d88f5fd1SLuiz Capitulino 422b6fcf32dSEric Blake v = visitor_input_test_init(data, "{ 'string0': 'string0', " 423b6fcf32dSEric Blake "'dict1': { 'string1': 'string1', " 424b6fcf32dSEric Blake "'dict2': { 'userdef': { 'integer': 42, " 425b6fcf32dSEric Blake "'string': 'string' }, 'string': 'string2'}}}"); 426d88f5fd1SLuiz Capitulino 42751e72bc1SEric Blake visit_type_UserDefTwo(v, NULL, &udp, &error_abort); 428d88f5fd1SLuiz Capitulino 429b18f1141SEric Blake g_assert_cmpstr(udp->string0, ==, "string0"); 430b18f1141SEric Blake g_assert_cmpstr(udp->dict1->string1, ==, "string1"); 431ddf21908SEric Blake g_assert_cmpint(udp->dict1->dict2->userdef->integer, ==, 42); 432b18f1141SEric Blake g_assert_cmpstr(udp->dict1->dict2->userdef->string, ==, "string"); 433b18f1141SEric Blake g_assert_cmpstr(udp->dict1->dict2->string, ==, "string2"); 4346446a592SEric Blake g_assert(udp->dict1->has_dict3 == false); 435d88f5fd1SLuiz Capitulino 436b18f1141SEric Blake qapi_free_UserDefTwo(udp); 437d88f5fd1SLuiz Capitulino } 438d88f5fd1SLuiz Capitulino 439d88f5fd1SLuiz Capitulino static void test_visitor_in_list(TestInputVisitorData *data, 440d88f5fd1SLuiz Capitulino const void *unused) 441d88f5fd1SLuiz Capitulino { 442d88f5fd1SLuiz Capitulino UserDefOneList *item, *head = NULL; 443d88f5fd1SLuiz Capitulino Visitor *v; 444d88f5fd1SLuiz Capitulino int i; 445d88f5fd1SLuiz Capitulino 446d88f5fd1SLuiz Capitulino v = visitor_input_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44 } ]"); 447d88f5fd1SLuiz Capitulino 44851e72bc1SEric Blake visit_type_UserDefOneList(v, NULL, &head, &error_abort); 449d88f5fd1SLuiz Capitulino g_assert(head != NULL); 450d88f5fd1SLuiz Capitulino 451d88f5fd1SLuiz Capitulino for (i = 0, item = head; item; item = item->next, i++) { 452d88f5fd1SLuiz Capitulino char string[12]; 453d88f5fd1SLuiz Capitulino 454d88f5fd1SLuiz Capitulino snprintf(string, sizeof(string), "string%d", i); 455d88f5fd1SLuiz Capitulino g_assert_cmpstr(item->value->string, ==, string); 456ddf21908SEric Blake g_assert_cmpint(item->value->integer, ==, 42 + i); 457d88f5fd1SLuiz Capitulino } 458d88f5fd1SLuiz Capitulino 459d88f5fd1SLuiz Capitulino qapi_free_UserDefOneList(head); 4602533377cSEric Blake head = NULL; 4612533377cSEric Blake 4622533377cSEric Blake /* An empty list is valid */ 4632533377cSEric Blake v = visitor_input_test_init(data, "[]"); 46451e72bc1SEric Blake visit_type_UserDefOneList(v, NULL, &head, &error_abort); 4652533377cSEric Blake g_assert(!head); 466d88f5fd1SLuiz Capitulino } 467d88f5fd1SLuiz Capitulino 46828770e05SMarkus Armbruster static void test_visitor_in_any(TestInputVisitorData *data, 46928770e05SMarkus Armbruster const void *unused) 47028770e05SMarkus Armbruster { 47128770e05SMarkus Armbruster QObject *res = NULL; 47228770e05SMarkus Armbruster Visitor *v; 47301b2ffceSMarc-André Lureau QNum *qnum; 47428770e05SMarkus Armbruster QBool *qbool; 47528770e05SMarkus Armbruster QString *qstring; 47628770e05SMarkus Armbruster QDict *qdict; 47728770e05SMarkus Armbruster QObject *qobj; 47801b2ffceSMarc-André Lureau int64_t val; 47928770e05SMarkus Armbruster 48028770e05SMarkus Armbruster v = visitor_input_test_init(data, "-42"); 48151e72bc1SEric Blake visit_type_any(v, NULL, &res, &error_abort); 48201b2ffceSMarc-André Lureau qnum = qobject_to_qnum(res); 48301b2ffceSMarc-André Lureau g_assert(qnum); 48401b2ffceSMarc-André Lureau g_assert(qnum_get_try_int(qnum, &val)); 48501b2ffceSMarc-André Lureau g_assert_cmpint(val, ==, -42); 48628770e05SMarkus Armbruster qobject_decref(res); 48728770e05SMarkus Armbruster 48828770e05SMarkus Armbruster v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }"); 48951e72bc1SEric Blake visit_type_any(v, NULL, &res, &error_abort); 49028770e05SMarkus Armbruster qdict = qobject_to_qdict(res); 49128770e05SMarkus Armbruster g_assert(qdict && qdict_size(qdict) == 3); 49228770e05SMarkus Armbruster qobj = qdict_get(qdict, "integer"); 49328770e05SMarkus Armbruster g_assert(qobj); 49401b2ffceSMarc-André Lureau qnum = qobject_to_qnum(qobj); 49501b2ffceSMarc-André Lureau g_assert(qnum); 49601b2ffceSMarc-André Lureau g_assert(qnum_get_try_int(qnum, &val)); 49701b2ffceSMarc-André Lureau g_assert_cmpint(val, ==, -42); 49828770e05SMarkus Armbruster qobj = qdict_get(qdict, "boolean"); 49928770e05SMarkus Armbruster g_assert(qobj); 50028770e05SMarkus Armbruster qbool = qobject_to_qbool(qobj); 50128770e05SMarkus Armbruster g_assert(qbool); 50228770e05SMarkus Armbruster g_assert(qbool_get_bool(qbool) == true); 50328770e05SMarkus Armbruster qobj = qdict_get(qdict, "string"); 50428770e05SMarkus Armbruster g_assert(qobj); 50528770e05SMarkus Armbruster qstring = qobject_to_qstring(qobj); 50628770e05SMarkus Armbruster g_assert(qstring); 50728770e05SMarkus Armbruster g_assert_cmpstr(qstring_get_str(qstring), ==, "foo"); 50828770e05SMarkus Armbruster qobject_decref(res); 50928770e05SMarkus Armbruster } 51028770e05SMarkus Armbruster 5113df016f1SEric Blake static void test_visitor_in_null(TestInputVisitorData *data, 5123df016f1SEric Blake const void *unused) 5133df016f1SEric Blake { 5143df016f1SEric Blake Visitor *v; 5153df016f1SEric Blake Error *err = NULL; 516d2f95f4dSMarkus Armbruster QNull *null; 5173df016f1SEric Blake char *tmp; 5183df016f1SEric Blake 5193df016f1SEric Blake /* 5203df016f1SEric Blake * FIXME: Since QAPI doesn't know the 'null' type yet, we can't 5213df016f1SEric Blake * test visit_type_null() by reading into a QAPI struct then 5223df016f1SEric Blake * checking that it was populated correctly. The best we can do 5233df016f1SEric Blake * for now is ensure that we consumed null from the input, proven 5243df016f1SEric Blake * by the fact that we can't re-read the key; and that we detect 5253df016f1SEric Blake * when input is not null. 5263df016f1SEric Blake */ 5273df016f1SEric Blake 528cbd8acf3SDaniel P. Berrange v = visitor_input_test_init_full(data, false, 529cbd8acf3SDaniel P. Berrange "{ 'a': null, 'b': '' }"); 5303df016f1SEric Blake visit_start_struct(v, NULL, NULL, 0, &error_abort); 531d2f95f4dSMarkus Armbruster visit_type_null(v, "a", &null, &error_abort); 532d2f95f4dSMarkus Armbruster g_assert(qobject_type(QOBJECT(null)) == QTYPE_QNULL); 533d2f95f4dSMarkus Armbruster QDECREF(null); 534d2f95f4dSMarkus Armbruster visit_type_null(v, "b", &null, &err); 5353df016f1SEric Blake error_free_or_abort(&err); 536d2f95f4dSMarkus Armbruster g_assert(!null); 537ec95f614SMarkus Armbruster visit_type_str(v, "c", &tmp, &err); 538ec95f614SMarkus Armbruster error_free_or_abort(&err); 539d2f95f4dSMarkus Armbruster g_assert(!tmp); 54015c2f669SEric Blake visit_check_struct(v, &error_abort); 5411158bb2aSEric Blake visit_end_struct(v, NULL); 5423df016f1SEric Blake } 5433df016f1SEric Blake 5442fc00432SMarkus Armbruster static void test_visitor_in_union_flat(TestInputVisitorData *data, 5452fc00432SMarkus Armbruster const void *unused) 5462fc00432SMarkus Armbruster { 5472fc00432SMarkus Armbruster Visitor *v; 5482fc00432SMarkus Armbruster UserDefFlatUnion *tmp; 54930594fe1SEric Blake UserDefUnionBase *base; 5502fc00432SMarkus Armbruster 5515223070cSWenchao Xia v = visitor_input_test_init(data, 5525223070cSWenchao Xia "{ 'enum1': 'value1', " 553441cbac0SMarkus Armbruster "'integer': 41, " 5545223070cSWenchao Xia "'string': 'str', " 5555223070cSWenchao Xia "'boolean': true }"); 5562fc00432SMarkus Armbruster 55751e72bc1SEric Blake visit_type_UserDefFlatUnion(v, NULL, &tmp, &error_abort); 5580f61af3eSMarkus Armbruster g_assert_cmpint(tmp->enum1, ==, ENUM_ONE_VALUE1); 5595223070cSWenchao Xia g_assert_cmpstr(tmp->string, ==, "str"); 560441cbac0SMarkus Armbruster g_assert_cmpint(tmp->integer, ==, 41); 561544a3731SEric Blake g_assert_cmpint(tmp->u.value1.boolean, ==, true); 56230594fe1SEric Blake 56330594fe1SEric Blake base = qapi_UserDefFlatUnion_base(tmp); 56430594fe1SEric Blake g_assert(&base->enum1 == &tmp->enum1); 56530594fe1SEric Blake 5662fc00432SMarkus Armbruster qapi_free_UserDefFlatUnion(tmp); 5672fc00432SMarkus Armbruster } 5682fc00432SMarkus Armbruster 569ab045267SEric Blake static void test_visitor_in_alternate(TestInputVisitorData *data, 5702c38b600SMarkus Armbruster const void *unused) 5712c38b600SMarkus Armbruster { 5722c38b600SMarkus Armbruster Visitor *v; 573ab045267SEric Blake UserDefAlternate *tmp; 57468d07839SEric Blake WrapAlternate *wrap; 5752c38b600SMarkus Armbruster 5762c38b600SMarkus Armbruster v = visitor_input_test_init(data, "42"); 57751e72bc1SEric Blake visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort); 57801b2ffceSMarc-André Lureau g_assert_cmpint(tmp->type, ==, QTYPE_QNUM); 579c363acefSEric Blake g_assert_cmpint(tmp->u.i, ==, 42); 580ab045267SEric Blake qapi_free_UserDefAlternate(tmp); 5819c51b441SEric Blake 5828168ca8eSMarkus Armbruster v = visitor_input_test_init(data, "'value1'"); 58351e72bc1SEric Blake visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort); 5840426d53cSEric Blake g_assert_cmpint(tmp->type, ==, QTYPE_QSTRING); 5858168ca8eSMarkus Armbruster g_assert_cmpint(tmp->u.e, ==, ENUM_ONE_VALUE1); 5869c51b441SEric Blake qapi_free_UserDefAlternate(tmp); 5879c51b441SEric Blake 5884d2d5c41SMarkus Armbruster v = visitor_input_test_init(data, "null"); 5894d2d5c41SMarkus Armbruster visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort); 5904d2d5c41SMarkus Armbruster g_assert_cmpint(tmp->type, ==, QTYPE_QNULL); 5914d2d5c41SMarkus Armbruster qapi_free_UserDefAlternate(tmp); 5924d2d5c41SMarkus Armbruster 59368d07839SEric Blake v = visitor_input_test_init(data, "{'integer':1, 'string':'str', " 59468d07839SEric Blake "'enum1':'value1', 'boolean':true}"); 59568d07839SEric Blake visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort); 59668d07839SEric Blake g_assert_cmpint(tmp->type, ==, QTYPE_QDICT); 597becceedcSEric Blake g_assert_cmpint(tmp->u.udfu.integer, ==, 1); 598becceedcSEric Blake g_assert_cmpstr(tmp->u.udfu.string, ==, "str"); 599becceedcSEric Blake g_assert_cmpint(tmp->u.udfu.enum1, ==, ENUM_ONE_VALUE1); 600544a3731SEric Blake g_assert_cmpint(tmp->u.udfu.u.value1.boolean, ==, true); 601544a3731SEric Blake g_assert_cmpint(tmp->u.udfu.u.value1.has_a_b, ==, false); 60268d07839SEric Blake qapi_free_UserDefAlternate(tmp); 60368d07839SEric Blake 60468d07839SEric Blake v = visitor_input_test_init(data, "{ 'alt': 42 }"); 60568d07839SEric Blake visit_type_WrapAlternate(v, NULL, &wrap, &error_abort); 60601b2ffceSMarc-André Lureau g_assert_cmpint(wrap->alt->type, ==, QTYPE_QNUM); 60768d07839SEric Blake g_assert_cmpint(wrap->alt->u.i, ==, 42); 60868d07839SEric Blake qapi_free_WrapAlternate(wrap); 60968d07839SEric Blake 6108168ca8eSMarkus Armbruster v = visitor_input_test_init(data, "{ 'alt': 'value1' }"); 61168d07839SEric Blake visit_type_WrapAlternate(v, NULL, &wrap, &error_abort); 61268d07839SEric Blake g_assert_cmpint(wrap->alt->type, ==, QTYPE_QSTRING); 6138168ca8eSMarkus Armbruster g_assert_cmpint(wrap->alt->u.e, ==, ENUM_ONE_VALUE1); 61468d07839SEric Blake qapi_free_WrapAlternate(wrap); 61568d07839SEric Blake 61668d07839SEric Blake v = visitor_input_test_init(data, "{ 'alt': {'integer':1, 'string':'str', " 61768d07839SEric Blake "'enum1':'value1', 'boolean':true} }"); 61868d07839SEric Blake visit_type_WrapAlternate(v, NULL, &wrap, &error_abort); 61968d07839SEric Blake g_assert_cmpint(wrap->alt->type, ==, QTYPE_QDICT); 620becceedcSEric Blake g_assert_cmpint(wrap->alt->u.udfu.integer, ==, 1); 621becceedcSEric Blake g_assert_cmpstr(wrap->alt->u.udfu.string, ==, "str"); 622becceedcSEric Blake g_assert_cmpint(wrap->alt->u.udfu.enum1, ==, ENUM_ONE_VALUE1); 623544a3731SEric Blake g_assert_cmpint(wrap->alt->u.udfu.u.value1.boolean, ==, true); 624544a3731SEric Blake g_assert_cmpint(wrap->alt->u.udfu.u.value1.has_a_b, ==, false); 62568d07839SEric Blake qapi_free_WrapAlternate(wrap); 6269c51b441SEric Blake } 6279c51b441SEric Blake 6289c51b441SEric Blake static void test_visitor_in_alternate_number(TestInputVisitorData *data, 6299c51b441SEric Blake const void *unused) 6309c51b441SEric Blake { 6319c51b441SEric Blake Visitor *v; 6329c51b441SEric Blake Error *err = NULL; 6338168ca8eSMarkus Armbruster AltEnumBool *aeb; 6348168ca8eSMarkus Armbruster AltEnumNum *aen; 6358168ca8eSMarkus Armbruster AltNumEnum *ans; 6368168ca8eSMarkus Armbruster AltEnumInt *asi; 6379c51b441SEric Blake 6389c51b441SEric Blake /* Parsing an int */ 6399c51b441SEric Blake 6409c51b441SEric Blake v = visitor_input_test_init(data, "42"); 6418168ca8eSMarkus Armbruster visit_type_AltEnumBool(v, NULL, &aeb, &err); 642a12a5a1aSEric Blake error_free_or_abort(&err); 6438168ca8eSMarkus Armbruster qapi_free_AltEnumBool(aeb); 6449c51b441SEric Blake 6459c51b441SEric Blake v = visitor_input_test_init(data, "42"); 6468168ca8eSMarkus Armbruster visit_type_AltEnumNum(v, NULL, &aen, &error_abort); 64701b2ffceSMarc-André Lureau g_assert_cmpint(aen->type, ==, QTYPE_QNUM); 6488168ca8eSMarkus Armbruster g_assert_cmpfloat(aen->u.n, ==, 42); 6498168ca8eSMarkus Armbruster qapi_free_AltEnumNum(aen); 6509c51b441SEric Blake 6519c51b441SEric Blake v = visitor_input_test_init(data, "42"); 6528168ca8eSMarkus Armbruster visit_type_AltNumEnum(v, NULL, &ans, &error_abort); 65301b2ffceSMarc-André Lureau g_assert_cmpint(ans->type, ==, QTYPE_QNUM); 654d00341afSEric Blake g_assert_cmpfloat(ans->u.n, ==, 42); 6558168ca8eSMarkus Armbruster qapi_free_AltNumEnum(ans); 6569c51b441SEric Blake 6579c51b441SEric Blake v = visitor_input_test_init(data, "42"); 6588168ca8eSMarkus Armbruster visit_type_AltEnumInt(v, NULL, &asi, &error_abort); 65901b2ffceSMarc-André Lureau g_assert_cmpint(asi->type, ==, QTYPE_QNUM); 660c363acefSEric Blake g_assert_cmpint(asi->u.i, ==, 42); 6618168ca8eSMarkus Armbruster qapi_free_AltEnumInt(asi); 6629c51b441SEric Blake 6639c51b441SEric Blake /* Parsing a double */ 6649c51b441SEric Blake 6659c51b441SEric Blake v = visitor_input_test_init(data, "42.5"); 6668168ca8eSMarkus Armbruster visit_type_AltEnumBool(v, NULL, &aeb, &err); 667a12a5a1aSEric Blake error_free_or_abort(&err); 6688168ca8eSMarkus Armbruster qapi_free_AltEnumBool(aeb); 6699c51b441SEric Blake 6709c51b441SEric Blake v = visitor_input_test_init(data, "42.5"); 6718168ca8eSMarkus Armbruster visit_type_AltEnumNum(v, NULL, &aen, &error_abort); 67201b2ffceSMarc-André Lureau g_assert_cmpint(aen->type, ==, QTYPE_QNUM); 6738168ca8eSMarkus Armbruster g_assert_cmpfloat(aen->u.n, ==, 42.5); 6748168ca8eSMarkus Armbruster qapi_free_AltEnumNum(aen); 6759c51b441SEric Blake 6769c51b441SEric Blake v = visitor_input_test_init(data, "42.5"); 6778168ca8eSMarkus Armbruster visit_type_AltNumEnum(v, NULL, &ans, &error_abort); 67801b2ffceSMarc-André Lureau g_assert_cmpint(ans->type, ==, QTYPE_QNUM); 679c363acefSEric Blake g_assert_cmpfloat(ans->u.n, ==, 42.5); 6808168ca8eSMarkus Armbruster qapi_free_AltNumEnum(ans); 6819c51b441SEric Blake 6829c51b441SEric Blake v = visitor_input_test_init(data, "42.5"); 6838168ca8eSMarkus Armbruster visit_type_AltEnumInt(v, NULL, &asi, &err); 684a12a5a1aSEric Blake error_free_or_abort(&err); 6858168ca8eSMarkus Armbruster qapi_free_AltEnumInt(asi); 6862c38b600SMarkus Armbruster } 6872c38b600SMarkus Armbruster 688199e0f17SMichael Roth static void test_native_list_integer_helper(TestInputVisitorData *data, 689199e0f17SMichael Roth const void *unused, 690199e0f17SMichael Roth UserDefNativeListUnionKind kind) 691199e0f17SMichael Roth { 692199e0f17SMichael Roth UserDefNativeListUnion *cvalue = NULL; 693199e0f17SMichael Roth Visitor *v; 694199e0f17SMichael Roth GString *gstr_list = g_string_new(""); 695199e0f17SMichael Roth GString *gstr_union = g_string_new(""); 696199e0f17SMichael Roth int i; 697199e0f17SMichael Roth 698199e0f17SMichael Roth for (i = 0; i < 32; i++) { 699199e0f17SMichael Roth g_string_append_printf(gstr_list, "%d", i); 700199e0f17SMichael Roth if (i != 31) { 701199e0f17SMichael Roth g_string_append(gstr_list, ", "); 702199e0f17SMichael Roth } 703199e0f17SMichael Roth } 704199e0f17SMichael Roth g_string_append_printf(gstr_union, "{ 'type': '%s', 'data': [ %s ] }", 705977c736fSMarkus Armbruster UserDefNativeListUnionKind_str(kind), 706199e0f17SMichael Roth gstr_list->str); 707199e0f17SMichael Roth v = visitor_input_test_init_raw(data, gstr_union->str); 708199e0f17SMichael Roth 70951e72bc1SEric Blake visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort); 710199e0f17SMichael Roth g_assert(cvalue != NULL); 711c363acefSEric Blake g_assert_cmpint(cvalue->type, ==, kind); 712199e0f17SMichael Roth 713199e0f17SMichael Roth switch (kind) { 714199e0f17SMichael Roth case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER: { 715199e0f17SMichael Roth intList *elem = NULL; 71632bafa8fSEric Blake for (i = 0, elem = cvalue->u.integer.data; 71732bafa8fSEric Blake elem; elem = elem->next, i++) { 718199e0f17SMichael Roth g_assert_cmpint(elem->value, ==, i); 719199e0f17SMichael Roth } 720199e0f17SMichael Roth break; 721199e0f17SMichael Roth } 722199e0f17SMichael Roth case USER_DEF_NATIVE_LIST_UNION_KIND_S8: { 723199e0f17SMichael Roth int8List *elem = NULL; 72432bafa8fSEric Blake for (i = 0, elem = cvalue->u.s8.data; elem; elem = elem->next, i++) { 725199e0f17SMichael Roth g_assert_cmpint(elem->value, ==, i); 726199e0f17SMichael Roth } 727199e0f17SMichael Roth break; 728199e0f17SMichael Roth } 729199e0f17SMichael Roth case USER_DEF_NATIVE_LIST_UNION_KIND_S16: { 730199e0f17SMichael Roth int16List *elem = NULL; 73132bafa8fSEric Blake for (i = 0, elem = cvalue->u.s16.data; elem; elem = elem->next, i++) { 732199e0f17SMichael Roth g_assert_cmpint(elem->value, ==, i); 733199e0f17SMichael Roth } 734199e0f17SMichael Roth break; 735199e0f17SMichael Roth } 736199e0f17SMichael Roth case USER_DEF_NATIVE_LIST_UNION_KIND_S32: { 737199e0f17SMichael Roth int32List *elem = NULL; 73832bafa8fSEric Blake for (i = 0, elem = cvalue->u.s32.data; elem; elem = elem->next, i++) { 739199e0f17SMichael Roth g_assert_cmpint(elem->value, ==, i); 740199e0f17SMichael Roth } 741199e0f17SMichael Roth break; 742199e0f17SMichael Roth } 743199e0f17SMichael Roth case USER_DEF_NATIVE_LIST_UNION_KIND_S64: { 744199e0f17SMichael Roth int64List *elem = NULL; 74532bafa8fSEric Blake for (i = 0, elem = cvalue->u.s64.data; elem; elem = elem->next, i++) { 746199e0f17SMichael Roth g_assert_cmpint(elem->value, ==, i); 747199e0f17SMichael Roth } 748199e0f17SMichael Roth break; 749199e0f17SMichael Roth } 750199e0f17SMichael Roth case USER_DEF_NATIVE_LIST_UNION_KIND_U8: { 751199e0f17SMichael Roth uint8List *elem = NULL; 75232bafa8fSEric Blake for (i = 0, elem = cvalue->u.u8.data; elem; elem = elem->next, i++) { 753199e0f17SMichael Roth g_assert_cmpint(elem->value, ==, i); 754199e0f17SMichael Roth } 755199e0f17SMichael Roth break; 756199e0f17SMichael Roth } 757199e0f17SMichael Roth case USER_DEF_NATIVE_LIST_UNION_KIND_U16: { 758199e0f17SMichael Roth uint16List *elem = NULL; 75932bafa8fSEric Blake for (i = 0, elem = cvalue->u.u16.data; elem; elem = elem->next, i++) { 760199e0f17SMichael Roth g_assert_cmpint(elem->value, ==, i); 761199e0f17SMichael Roth } 762199e0f17SMichael Roth break; 763199e0f17SMichael Roth } 764199e0f17SMichael Roth case USER_DEF_NATIVE_LIST_UNION_KIND_U32: { 765199e0f17SMichael Roth uint32List *elem = NULL; 76632bafa8fSEric Blake for (i = 0, elem = cvalue->u.u32.data; elem; elem = elem->next, i++) { 767199e0f17SMichael Roth g_assert_cmpint(elem->value, ==, i); 768199e0f17SMichael Roth } 769199e0f17SMichael Roth break; 770199e0f17SMichael Roth } 771199e0f17SMichael Roth case USER_DEF_NATIVE_LIST_UNION_KIND_U64: { 772199e0f17SMichael Roth uint64List *elem = NULL; 77332bafa8fSEric Blake for (i = 0, elem = cvalue->u.u64.data; elem; elem = elem->next, i++) { 774199e0f17SMichael Roth g_assert_cmpint(elem->value, ==, i); 775199e0f17SMichael Roth } 776199e0f17SMichael Roth break; 777199e0f17SMichael Roth } 778199e0f17SMichael Roth default: 779dfc6f865SStefan Weil g_assert_not_reached(); 780199e0f17SMichael Roth } 781199e0f17SMichael Roth 782199e0f17SMichael Roth g_string_free(gstr_union, true); 783199e0f17SMichael Roth g_string_free(gstr_list, true); 784199e0f17SMichael Roth qapi_free_UserDefNativeListUnion(cvalue); 785199e0f17SMichael Roth } 786199e0f17SMichael Roth 787199e0f17SMichael Roth static void test_visitor_in_native_list_int(TestInputVisitorData *data, 788199e0f17SMichael Roth const void *unused) 789199e0f17SMichael Roth { 790199e0f17SMichael Roth test_native_list_integer_helper(data, unused, 791199e0f17SMichael Roth USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER); 792199e0f17SMichael Roth } 793199e0f17SMichael Roth 794199e0f17SMichael Roth static void test_visitor_in_native_list_int8(TestInputVisitorData *data, 795199e0f17SMichael Roth const void *unused) 796199e0f17SMichael Roth { 797199e0f17SMichael Roth test_native_list_integer_helper(data, unused, 798199e0f17SMichael Roth USER_DEF_NATIVE_LIST_UNION_KIND_S8); 799199e0f17SMichael Roth } 800199e0f17SMichael Roth 801199e0f17SMichael Roth static void test_visitor_in_native_list_int16(TestInputVisitorData *data, 802199e0f17SMichael Roth const void *unused) 803199e0f17SMichael Roth { 804199e0f17SMichael Roth test_native_list_integer_helper(data, unused, 805199e0f17SMichael Roth USER_DEF_NATIVE_LIST_UNION_KIND_S16); 806199e0f17SMichael Roth } 807199e0f17SMichael Roth 808199e0f17SMichael Roth static void test_visitor_in_native_list_int32(TestInputVisitorData *data, 809199e0f17SMichael Roth const void *unused) 810199e0f17SMichael Roth { 811199e0f17SMichael Roth test_native_list_integer_helper(data, unused, 812199e0f17SMichael Roth USER_DEF_NATIVE_LIST_UNION_KIND_S32); 813199e0f17SMichael Roth } 814199e0f17SMichael Roth 815199e0f17SMichael Roth static void test_visitor_in_native_list_int64(TestInputVisitorData *data, 816199e0f17SMichael Roth const void *unused) 817199e0f17SMichael Roth { 818199e0f17SMichael Roth test_native_list_integer_helper(data, unused, 819199e0f17SMichael Roth USER_DEF_NATIVE_LIST_UNION_KIND_S64); 820199e0f17SMichael Roth } 821199e0f17SMichael Roth 822199e0f17SMichael Roth static void test_visitor_in_native_list_uint8(TestInputVisitorData *data, 823199e0f17SMichael Roth const void *unused) 824199e0f17SMichael Roth { 825199e0f17SMichael Roth test_native_list_integer_helper(data, unused, 826199e0f17SMichael Roth USER_DEF_NATIVE_LIST_UNION_KIND_U8); 827199e0f17SMichael Roth } 828199e0f17SMichael Roth 829199e0f17SMichael Roth static void test_visitor_in_native_list_uint16(TestInputVisitorData *data, 830199e0f17SMichael Roth const void *unused) 831199e0f17SMichael Roth { 832199e0f17SMichael Roth test_native_list_integer_helper(data, unused, 833199e0f17SMichael Roth USER_DEF_NATIVE_LIST_UNION_KIND_U16); 834199e0f17SMichael Roth } 835199e0f17SMichael Roth 836199e0f17SMichael Roth static void test_visitor_in_native_list_uint32(TestInputVisitorData *data, 837199e0f17SMichael Roth const void *unused) 838199e0f17SMichael Roth { 839199e0f17SMichael Roth test_native_list_integer_helper(data, unused, 840199e0f17SMichael Roth USER_DEF_NATIVE_LIST_UNION_KIND_U32); 841199e0f17SMichael Roth } 842199e0f17SMichael Roth 843199e0f17SMichael Roth static void test_visitor_in_native_list_uint64(TestInputVisitorData *data, 844199e0f17SMichael Roth const void *unused) 845199e0f17SMichael Roth { 846199e0f17SMichael Roth test_native_list_integer_helper(data, unused, 847199e0f17SMichael Roth USER_DEF_NATIVE_LIST_UNION_KIND_U64); 848199e0f17SMichael Roth } 849199e0f17SMichael Roth 850199e0f17SMichael Roth static void test_visitor_in_native_list_bool(TestInputVisitorData *data, 851199e0f17SMichael Roth const void *unused) 852199e0f17SMichael Roth { 853199e0f17SMichael Roth UserDefNativeListUnion *cvalue = NULL; 854199e0f17SMichael Roth boolList *elem = NULL; 855199e0f17SMichael Roth Visitor *v; 856199e0f17SMichael Roth GString *gstr_list = g_string_new(""); 857199e0f17SMichael Roth GString *gstr_union = g_string_new(""); 858199e0f17SMichael Roth int i; 859199e0f17SMichael Roth 860199e0f17SMichael Roth for (i = 0; i < 32; i++) { 861199e0f17SMichael Roth g_string_append_printf(gstr_list, "%s", 862199e0f17SMichael Roth (i % 3 == 0) ? "true" : "false"); 863199e0f17SMichael Roth if (i != 31) { 864199e0f17SMichael Roth g_string_append(gstr_list, ", "); 865199e0f17SMichael Roth } 866199e0f17SMichael Roth } 867199e0f17SMichael Roth g_string_append_printf(gstr_union, "{ 'type': 'boolean', 'data': [ %s ] }", 868199e0f17SMichael Roth gstr_list->str); 869199e0f17SMichael Roth v = visitor_input_test_init_raw(data, gstr_union->str); 870199e0f17SMichael Roth 87151e72bc1SEric Blake visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort); 872199e0f17SMichael Roth g_assert(cvalue != NULL); 873c363acefSEric Blake g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN); 874199e0f17SMichael Roth 87532bafa8fSEric Blake for (i = 0, elem = cvalue->u.boolean.data; elem; elem = elem->next, i++) { 876199e0f17SMichael Roth g_assert_cmpint(elem->value, ==, (i % 3 == 0) ? 1 : 0); 877199e0f17SMichael Roth } 878199e0f17SMichael Roth 879199e0f17SMichael Roth g_string_free(gstr_union, true); 880199e0f17SMichael Roth g_string_free(gstr_list, true); 881199e0f17SMichael Roth qapi_free_UserDefNativeListUnion(cvalue); 882199e0f17SMichael Roth } 883199e0f17SMichael Roth 884199e0f17SMichael Roth static void test_visitor_in_native_list_string(TestInputVisitorData *data, 885199e0f17SMichael Roth const void *unused) 886199e0f17SMichael Roth { 887199e0f17SMichael Roth UserDefNativeListUnion *cvalue = NULL; 888199e0f17SMichael Roth strList *elem = NULL; 889199e0f17SMichael Roth Visitor *v; 890199e0f17SMichael Roth GString *gstr_list = g_string_new(""); 891199e0f17SMichael Roth GString *gstr_union = g_string_new(""); 892199e0f17SMichael Roth int i; 893199e0f17SMichael Roth 894199e0f17SMichael Roth for (i = 0; i < 32; i++) { 895199e0f17SMichael Roth g_string_append_printf(gstr_list, "'%d'", i); 896199e0f17SMichael Roth if (i != 31) { 897199e0f17SMichael Roth g_string_append(gstr_list, ", "); 898199e0f17SMichael Roth } 899199e0f17SMichael Roth } 900199e0f17SMichael Roth g_string_append_printf(gstr_union, "{ 'type': 'string', 'data': [ %s ] }", 901199e0f17SMichael Roth gstr_list->str); 902199e0f17SMichael Roth v = visitor_input_test_init_raw(data, gstr_union->str); 903199e0f17SMichael Roth 90451e72bc1SEric Blake visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort); 905199e0f17SMichael Roth g_assert(cvalue != NULL); 906c363acefSEric Blake g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_STRING); 907199e0f17SMichael Roth 90832bafa8fSEric Blake for (i = 0, elem = cvalue->u.string.data; elem; elem = elem->next, i++) { 909199e0f17SMichael Roth gchar str[8]; 910199e0f17SMichael Roth sprintf(str, "%d", i); 911199e0f17SMichael Roth g_assert_cmpstr(elem->value, ==, str); 912199e0f17SMichael Roth } 913199e0f17SMichael Roth 914199e0f17SMichael Roth g_string_free(gstr_union, true); 915199e0f17SMichael Roth g_string_free(gstr_list, true); 916199e0f17SMichael Roth qapi_free_UserDefNativeListUnion(cvalue); 917199e0f17SMichael Roth } 918199e0f17SMichael Roth 919199e0f17SMichael Roth #define DOUBLE_STR_MAX 16 920199e0f17SMichael Roth 921199e0f17SMichael Roth static void test_visitor_in_native_list_number(TestInputVisitorData *data, 922199e0f17SMichael Roth const void *unused) 923199e0f17SMichael Roth { 924199e0f17SMichael Roth UserDefNativeListUnion *cvalue = NULL; 925199e0f17SMichael Roth numberList *elem = NULL; 926199e0f17SMichael Roth Visitor *v; 927199e0f17SMichael Roth GString *gstr_list = g_string_new(""); 928199e0f17SMichael Roth GString *gstr_union = g_string_new(""); 929199e0f17SMichael Roth int i; 930199e0f17SMichael Roth 931199e0f17SMichael Roth for (i = 0; i < 32; i++) { 932199e0f17SMichael Roth g_string_append_printf(gstr_list, "%f", (double)i / 3); 933199e0f17SMichael Roth if (i != 31) { 934199e0f17SMichael Roth g_string_append(gstr_list, ", "); 935199e0f17SMichael Roth } 936199e0f17SMichael Roth } 937199e0f17SMichael Roth g_string_append_printf(gstr_union, "{ 'type': 'number', 'data': [ %s ] }", 938199e0f17SMichael Roth gstr_list->str); 939199e0f17SMichael Roth v = visitor_input_test_init_raw(data, gstr_union->str); 940199e0f17SMichael Roth 94151e72bc1SEric Blake visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort); 942199e0f17SMichael Roth g_assert(cvalue != NULL); 943c363acefSEric Blake g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER); 944199e0f17SMichael Roth 94532bafa8fSEric Blake for (i = 0, elem = cvalue->u.number.data; elem; elem = elem->next, i++) { 946199e0f17SMichael Roth GString *double_expected = g_string_new(""); 947199e0f17SMichael Roth GString *double_actual = g_string_new(""); 948199e0f17SMichael Roth 949199e0f17SMichael Roth g_string_printf(double_expected, "%.6f", (double)i / 3); 950199e0f17SMichael Roth g_string_printf(double_actual, "%.6f", elem->value); 951199e0f17SMichael Roth g_assert_cmpstr(double_expected->str, ==, double_actual->str); 952199e0f17SMichael Roth 953199e0f17SMichael Roth g_string_free(double_expected, true); 954199e0f17SMichael Roth g_string_free(double_actual, true); 955199e0f17SMichael Roth } 956199e0f17SMichael Roth 957199e0f17SMichael Roth g_string_free(gstr_union, true); 958199e0f17SMichael Roth g_string_free(gstr_list, true); 959199e0f17SMichael Roth qapi_free_UserDefNativeListUnion(cvalue); 960199e0f17SMichael Roth } 961199e0f17SMichael Roth 962d88f5fd1SLuiz Capitulino static void input_visitor_test_add(const char *testpath, 963b1d2e5f1SDaniel P. Berrange const void *user_data, 964b1d2e5f1SDaniel P. Berrange void (*test_func)(TestInputVisitorData *data, 965b1d2e5f1SDaniel P. Berrange const void *user_data)) 966d88f5fd1SLuiz Capitulino { 967b1d2e5f1SDaniel P. Berrange g_test_add(testpath, TestInputVisitorData, user_data, NULL, test_func, 968d88f5fd1SLuiz Capitulino visitor_input_teardown); 969d88f5fd1SLuiz Capitulino } 970d88f5fd1SLuiz Capitulino 9713dcf71f6SPaolo Bonzini static void test_visitor_in_errors(TestInputVisitorData *data, 9723dcf71f6SPaolo Bonzini const void *unused) 9733dcf71f6SPaolo Bonzini { 9743dcf71f6SPaolo Bonzini TestStruct *p = NULL; 975e940f543SMarkus Armbruster Error *err = NULL; 9763dcf71f6SPaolo Bonzini Visitor *v; 977dd5ee2c2SEric Blake strList *q = NULL; 9789b4e38feSEric Blake UserDefTwo *r = NULL; 9799b4e38feSEric Blake WrapAlternate *s = NULL; 9803dcf71f6SPaolo Bonzini 981dd5ee2c2SEric Blake v = visitor_input_test_init(data, "{ 'integer': false, 'boolean': 'foo', " 982dd5ee2c2SEric Blake "'string': -42 }"); 9833dcf71f6SPaolo Bonzini 98451e72bc1SEric Blake visit_type_TestStruct(v, NULL, &p, &err); 985a12a5a1aSEric Blake error_free_or_abort(&err); 98668ab47e4SEric Blake g_assert(!p); 987dd5ee2c2SEric Blake 988dd5ee2c2SEric Blake v = visitor_input_test_init(data, "[ '1', '2', false, '3' ]"); 98951e72bc1SEric Blake visit_type_strList(v, NULL, &q, &err); 990dd5ee2c2SEric Blake error_free_or_abort(&err); 99168ab47e4SEric Blake assert(!q); 9929b4e38feSEric Blake 9939b4e38feSEric Blake v = visitor_input_test_init(data, "{ 'str':'hi' }"); 9949b4e38feSEric Blake visit_type_UserDefTwo(v, NULL, &r, &err); 9959b4e38feSEric Blake error_free_or_abort(&err); 9969b4e38feSEric Blake assert(!r); 9979b4e38feSEric Blake 9989b4e38feSEric Blake v = visitor_input_test_init(data, "{ }"); 9999b4e38feSEric Blake visit_type_WrapAlternate(v, NULL, &s, &err); 10009b4e38feSEric Blake error_free_or_abort(&err); 10019b4e38feSEric Blake assert(!s); 10023dcf71f6SPaolo Bonzini } 10033dcf71f6SPaolo Bonzini 10042533377cSEric Blake static void test_visitor_in_wrong_type(TestInputVisitorData *data, 10052533377cSEric Blake const void *unused) 10062533377cSEric Blake { 10072533377cSEric Blake TestStruct *p = NULL; 10082533377cSEric Blake Visitor *v; 10092533377cSEric Blake strList *q = NULL; 10102533377cSEric Blake int64_t i; 10112533377cSEric Blake Error *err = NULL; 10122533377cSEric Blake 10132533377cSEric Blake /* Make sure arrays and structs cannot be confused */ 10142533377cSEric Blake 10152533377cSEric Blake v = visitor_input_test_init(data, "[]"); 101651e72bc1SEric Blake visit_type_TestStruct(v, NULL, &p, &err); 10172533377cSEric Blake error_free_or_abort(&err); 10182533377cSEric Blake g_assert(!p); 10192533377cSEric Blake 10202533377cSEric Blake v = visitor_input_test_init(data, "{}"); 102151e72bc1SEric Blake visit_type_strList(v, NULL, &q, &err); 10222533377cSEric Blake error_free_or_abort(&err); 10232533377cSEric Blake assert(!q); 10242533377cSEric Blake 10252533377cSEric Blake /* Make sure primitives and struct cannot be confused */ 10262533377cSEric Blake 10272533377cSEric Blake v = visitor_input_test_init(data, "1"); 102851e72bc1SEric Blake visit_type_TestStruct(v, NULL, &p, &err); 10292533377cSEric Blake error_free_or_abort(&err); 10302533377cSEric Blake g_assert(!p); 10312533377cSEric Blake 10322533377cSEric Blake v = visitor_input_test_init(data, "{}"); 103351e72bc1SEric Blake visit_type_int(v, NULL, &i, &err); 10342533377cSEric Blake error_free_or_abort(&err); 10352533377cSEric Blake 10362533377cSEric Blake /* Make sure primitives and arrays cannot be confused */ 10372533377cSEric Blake 10382533377cSEric Blake v = visitor_input_test_init(data, "1"); 103951e72bc1SEric Blake visit_type_strList(v, NULL, &q, &err); 10402533377cSEric Blake error_free_or_abort(&err); 10412533377cSEric Blake assert(!q); 10422533377cSEric Blake 10432533377cSEric Blake v = visitor_input_test_init(data, "[]"); 104451e72bc1SEric Blake visit_type_int(v, NULL, &i, &err); 10452533377cSEric Blake error_free_or_abort(&err); 10462533377cSEric Blake } 10472533377cSEric Blake 104877c47de2SMarkus Armbruster static void test_visitor_in_fail_struct(TestInputVisitorData *data, 104977c47de2SMarkus Armbruster const void *unused) 105077c47de2SMarkus Armbruster { 105177c47de2SMarkus Armbruster TestStruct *p = NULL; 105277c47de2SMarkus Armbruster Error *err = NULL; 105377c47de2SMarkus Armbruster Visitor *v; 105477c47de2SMarkus Armbruster 105577c47de2SMarkus Armbruster v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo', 'extra': 42 }"); 105677c47de2SMarkus Armbruster 105777c47de2SMarkus Armbruster visit_type_TestStruct(v, NULL, &p, &err); 105877c47de2SMarkus Armbruster error_free_or_abort(&err); 105977c47de2SMarkus Armbruster g_assert(!p); 106077c47de2SMarkus Armbruster } 106177c47de2SMarkus Armbruster 106277c47de2SMarkus Armbruster static void test_visitor_in_fail_struct_nested(TestInputVisitorData *data, 106377c47de2SMarkus Armbruster const void *unused) 106477c47de2SMarkus Armbruster { 106577c47de2SMarkus Armbruster UserDefTwo *udp = NULL; 106677c47de2SMarkus Armbruster Error *err = NULL; 106777c47de2SMarkus Armbruster Visitor *v; 106877c47de2SMarkus Armbruster 106977c47de2SMarkus Armbruster v = visitor_input_test_init(data, "{ 'string0': 'string0', 'dict1': { 'string1': 'string1', 'dict2': { 'userdef1': { 'integer': 42, 'string': 'string', 'extra': [42, 23, {'foo':'bar'}] }, 'string2': 'string2'}}}"); 107077c47de2SMarkus Armbruster 107177c47de2SMarkus Armbruster visit_type_UserDefTwo(v, NULL, &udp, &err); 107277c47de2SMarkus Armbruster error_free_or_abort(&err); 107377c47de2SMarkus Armbruster g_assert(!udp); 107477c47de2SMarkus Armbruster } 107577c47de2SMarkus Armbruster 107677c47de2SMarkus Armbruster static void test_visitor_in_fail_struct_in_list(TestInputVisitorData *data, 107777c47de2SMarkus Armbruster const void *unused) 107877c47de2SMarkus Armbruster { 107977c47de2SMarkus Armbruster UserDefOneList *head = NULL; 108077c47de2SMarkus Armbruster Error *err = NULL; 108177c47de2SMarkus Armbruster Visitor *v; 108277c47de2SMarkus Armbruster 108377c47de2SMarkus Armbruster v = visitor_input_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44, 'extra': 'ggg' } ]"); 108477c47de2SMarkus Armbruster 108577c47de2SMarkus Armbruster visit_type_UserDefOneList(v, NULL, &head, &err); 108677c47de2SMarkus Armbruster error_free_or_abort(&err); 108777c47de2SMarkus Armbruster g_assert(!head); 108877c47de2SMarkus Armbruster } 108977c47de2SMarkus Armbruster 109077c47de2SMarkus Armbruster static void test_visitor_in_fail_struct_missing(TestInputVisitorData *data, 109177c47de2SMarkus Armbruster const void *unused) 109277c47de2SMarkus Armbruster { 109377c47de2SMarkus Armbruster Error *err = NULL; 109477c47de2SMarkus Armbruster Visitor *v; 109577c47de2SMarkus Armbruster QObject *any; 1096d2f95f4dSMarkus Armbruster QNull *null; 109777c47de2SMarkus Armbruster GenericAlternate *alt; 109877c47de2SMarkus Armbruster bool present; 109977c47de2SMarkus Armbruster int en; 110077c47de2SMarkus Armbruster int64_t i64; 110177c47de2SMarkus Armbruster uint32_t u32; 110277c47de2SMarkus Armbruster int8_t i8; 110377c47de2SMarkus Armbruster char *str; 110477c47de2SMarkus Armbruster double dbl; 110577c47de2SMarkus Armbruster 110686ca0dbeSMarkus Armbruster v = visitor_input_test_init(data, "{ 'sub': [ {} ] }"); 110777c47de2SMarkus Armbruster visit_start_struct(v, NULL, NULL, 0, &error_abort); 110877c47de2SMarkus Armbruster visit_start_struct(v, "struct", NULL, 0, &err); 110977c47de2SMarkus Armbruster error_free_or_abort(&err); 111077c47de2SMarkus Armbruster visit_start_list(v, "list", NULL, 0, &err); 111177c47de2SMarkus Armbruster error_free_or_abort(&err); 111260390d2dSMarc-André Lureau visit_start_alternate(v, "alternate", &alt, sizeof(*alt), &err); 111377c47de2SMarkus Armbruster error_free_or_abort(&err); 111477c47de2SMarkus Armbruster visit_optional(v, "optional", &present); 111577c47de2SMarkus Armbruster g_assert(!present); 1116f7abe0ecSMarc-André Lureau visit_type_enum(v, "enum", &en, &EnumOne_lookup, &err); 111777c47de2SMarkus Armbruster error_free_or_abort(&err); 111877c47de2SMarkus Armbruster visit_type_int(v, "i64", &i64, &err); 111977c47de2SMarkus Armbruster error_free_or_abort(&err); 112077c47de2SMarkus Armbruster visit_type_uint32(v, "u32", &u32, &err); 112177c47de2SMarkus Armbruster error_free_or_abort(&err); 112277c47de2SMarkus Armbruster visit_type_int8(v, "i8", &i8, &err); 112377c47de2SMarkus Armbruster error_free_or_abort(&err); 112477c47de2SMarkus Armbruster visit_type_str(v, "i8", &str, &err); 112577c47de2SMarkus Armbruster error_free_or_abort(&err); 112677c47de2SMarkus Armbruster visit_type_number(v, "dbl", &dbl, &err); 112777c47de2SMarkus Armbruster error_free_or_abort(&err); 112877c47de2SMarkus Armbruster visit_type_any(v, "any", &any, &err); 112977c47de2SMarkus Armbruster error_free_or_abort(&err); 1130d2f95f4dSMarkus Armbruster visit_type_null(v, "null", &null, &err); 113177c47de2SMarkus Armbruster error_free_or_abort(&err); 113286ca0dbeSMarkus Armbruster visit_start_list(v, "sub", NULL, 0, &error_abort); 113386ca0dbeSMarkus Armbruster visit_start_struct(v, NULL, NULL, 0, &error_abort); 113486ca0dbeSMarkus Armbruster visit_type_int(v, "i64", &i64, &err); 113586ca0dbeSMarkus Armbruster error_free_or_abort(&err); 113686ca0dbeSMarkus Armbruster visit_end_struct(v, NULL); 113786ca0dbeSMarkus Armbruster visit_end_list(v, NULL); 113877c47de2SMarkus Armbruster visit_end_struct(v, NULL); 113977c47de2SMarkus Armbruster } 114077c47de2SMarkus Armbruster 11419cb8ef36SMarkus Armbruster static void test_visitor_in_fail_list(TestInputVisitorData *data, 11429cb8ef36SMarkus Armbruster const void *unused) 11439cb8ef36SMarkus Armbruster { 11449cb8ef36SMarkus Armbruster int64_t i64 = -1; 1145a4a1c70dSMarkus Armbruster Error *err = NULL; 11469cb8ef36SMarkus Armbruster Visitor *v; 11479cb8ef36SMarkus Armbruster 11489cb8ef36SMarkus Armbruster /* Unvisited list tail */ 11499cb8ef36SMarkus Armbruster 11509cb8ef36SMarkus Armbruster v = visitor_input_test_init(data, "[ 1, 2, 3 ]"); 11519cb8ef36SMarkus Armbruster 11529cb8ef36SMarkus Armbruster visit_start_list(v, NULL, NULL, 0, &error_abort); 11539cb8ef36SMarkus Armbruster visit_type_int(v, NULL, &i64, &error_abort); 11549cb8ef36SMarkus Armbruster g_assert_cmpint(i64, ==, 1); 11559cb8ef36SMarkus Armbruster visit_type_int(v, NULL, &i64, &error_abort); 11569cb8ef36SMarkus Armbruster g_assert_cmpint(i64, ==, 2); 1157a4a1c70dSMarkus Armbruster visit_check_list(v, &err); 1158a4a1c70dSMarkus Armbruster error_free_or_abort(&err); 11599cb8ef36SMarkus Armbruster visit_end_list(v, NULL); 1160a9416dc6SMarkus Armbruster 1161a9416dc6SMarkus Armbruster /* Visit beyond end of list */ 1162a9416dc6SMarkus Armbruster v = visitor_input_test_init(data, "[]"); 1163a9416dc6SMarkus Armbruster 1164a9416dc6SMarkus Armbruster visit_start_list(v, NULL, NULL, 0, &error_abort); 1165a9416dc6SMarkus Armbruster visit_type_int(v, NULL, &i64, &err); 1166a9416dc6SMarkus Armbruster error_free_or_abort(&err); 1167a9416dc6SMarkus Armbruster visit_end_list(v, NULL); 11689cb8ef36SMarkus Armbruster } 11699cb8ef36SMarkus Armbruster 11709cb8ef36SMarkus Armbruster static void test_visitor_in_fail_list_nested(TestInputVisitorData *data, 11719cb8ef36SMarkus Armbruster const void *unused) 11729cb8ef36SMarkus Armbruster { 11739cb8ef36SMarkus Armbruster int64_t i64 = -1; 1174a4a1c70dSMarkus Armbruster Error *err = NULL; 11759cb8ef36SMarkus Armbruster Visitor *v; 11769cb8ef36SMarkus Armbruster 11779cb8ef36SMarkus Armbruster /* Unvisited nested list tail */ 11789cb8ef36SMarkus Armbruster 11799cb8ef36SMarkus Armbruster v = visitor_input_test_init(data, "[ 0, [ 1, 2, 3 ] ]"); 11809cb8ef36SMarkus Armbruster 11819cb8ef36SMarkus Armbruster visit_start_list(v, NULL, NULL, 0, &error_abort); 11829cb8ef36SMarkus Armbruster visit_type_int(v, NULL, &i64, &error_abort); 11839cb8ef36SMarkus Armbruster g_assert_cmpint(i64, ==, 0); 11849cb8ef36SMarkus Armbruster visit_start_list(v, NULL, NULL, 0, &error_abort); 11859cb8ef36SMarkus Armbruster visit_type_int(v, NULL, &i64, &error_abort); 11869cb8ef36SMarkus Armbruster g_assert_cmpint(i64, ==, 1); 1187a4a1c70dSMarkus Armbruster visit_check_list(v, &err); 1188a4a1c70dSMarkus Armbruster error_free_or_abort(&err); 11899cb8ef36SMarkus Armbruster visit_end_list(v, NULL); 1190a4a1c70dSMarkus Armbruster visit_check_list(v, &error_abort); 11919cb8ef36SMarkus Armbruster visit_end_list(v, NULL); 11929cb8ef36SMarkus Armbruster } 11939cb8ef36SMarkus Armbruster 119477c47de2SMarkus Armbruster static void test_visitor_in_fail_union_native_list(TestInputVisitorData *data, 119577c47de2SMarkus Armbruster const void *unused) 119677c47de2SMarkus Armbruster { 119777c47de2SMarkus Armbruster UserDefNativeListUnion *tmp = NULL; 119877c47de2SMarkus Armbruster Error *err = NULL; 119977c47de2SMarkus Armbruster Visitor *v; 120077c47de2SMarkus Armbruster 120177c47de2SMarkus Armbruster v = visitor_input_test_init(data, 120277c47de2SMarkus Armbruster "{ 'type': 'integer', 'data' : [ 'string' ] }"); 120377c47de2SMarkus Armbruster 120477c47de2SMarkus Armbruster visit_type_UserDefNativeListUnion(v, NULL, &tmp, &err); 120577c47de2SMarkus Armbruster error_free_or_abort(&err); 120677c47de2SMarkus Armbruster g_assert(!tmp); 120777c47de2SMarkus Armbruster } 120877c47de2SMarkus Armbruster 120977c47de2SMarkus Armbruster static void test_visitor_in_fail_union_flat(TestInputVisitorData *data, 121077c47de2SMarkus Armbruster const void *unused) 121177c47de2SMarkus Armbruster { 121277c47de2SMarkus Armbruster UserDefFlatUnion *tmp = NULL; 121377c47de2SMarkus Armbruster Error *err = NULL; 121477c47de2SMarkus Armbruster Visitor *v; 121577c47de2SMarkus Armbruster 121677c47de2SMarkus Armbruster v = visitor_input_test_init(data, "{ 'string': 'c', 'integer': 41, 'boolean': true }"); 121777c47de2SMarkus Armbruster 121877c47de2SMarkus Armbruster visit_type_UserDefFlatUnion(v, NULL, &tmp, &err); 121977c47de2SMarkus Armbruster error_free_or_abort(&err); 122077c47de2SMarkus Armbruster g_assert(!tmp); 122177c47de2SMarkus Armbruster } 122277c47de2SMarkus Armbruster 122377c47de2SMarkus Armbruster static void test_visitor_in_fail_union_flat_no_discrim(TestInputVisitorData *data, 122477c47de2SMarkus Armbruster const void *unused) 122577c47de2SMarkus Armbruster { 122677c47de2SMarkus Armbruster UserDefFlatUnion2 *tmp = NULL; 122777c47de2SMarkus Armbruster Error *err = NULL; 122877c47de2SMarkus Armbruster Visitor *v; 122977c47de2SMarkus Armbruster 123077c47de2SMarkus Armbruster /* test situation where discriminator field ('enum1' here) is missing */ 123177c47de2SMarkus Armbruster v = visitor_input_test_init(data, "{ 'integer': 42, 'string': 'c', 'string1': 'd', 'string2': 'e' }"); 123277c47de2SMarkus Armbruster 123377c47de2SMarkus Armbruster visit_type_UserDefFlatUnion2(v, NULL, &tmp, &err); 123477c47de2SMarkus Armbruster error_free_or_abort(&err); 123577c47de2SMarkus Armbruster g_assert(!tmp); 123677c47de2SMarkus Armbruster } 123777c47de2SMarkus Armbruster 123877c47de2SMarkus Armbruster static void test_visitor_in_fail_alternate(TestInputVisitorData *data, 123977c47de2SMarkus Armbruster const void *unused) 124077c47de2SMarkus Armbruster { 124177c47de2SMarkus Armbruster UserDefAlternate *tmp; 124277c47de2SMarkus Armbruster Visitor *v; 124377c47de2SMarkus Armbruster Error *err = NULL; 124477c47de2SMarkus Armbruster 124577c47de2SMarkus Armbruster v = visitor_input_test_init(data, "3.14"); 124677c47de2SMarkus Armbruster 124777c47de2SMarkus Armbruster visit_type_UserDefAlternate(v, NULL, &tmp, &err); 124877c47de2SMarkus Armbruster error_free_or_abort(&err); 124977c47de2SMarkus Armbruster g_assert(!tmp); 125077c47de2SMarkus Armbruster } 125177c47de2SMarkus Armbruster 125277c47de2SMarkus Armbruster static void do_test_visitor_in_qmp_introspect(TestInputVisitorData *data, 125377c47de2SMarkus Armbruster const char *schema_json) 125477c47de2SMarkus Armbruster { 125577c47de2SMarkus Armbruster SchemaInfoList *schema = NULL; 125677c47de2SMarkus Armbruster Visitor *v; 125777c47de2SMarkus Armbruster 125877c47de2SMarkus Armbruster v = visitor_input_test_init_raw(data, schema_json); 125977c47de2SMarkus Armbruster 126077c47de2SMarkus Armbruster visit_type_SchemaInfoList(v, NULL, &schema, &error_abort); 126177c47de2SMarkus Armbruster g_assert(schema); 126277c47de2SMarkus Armbruster 126377c47de2SMarkus Armbruster qapi_free_SchemaInfoList(schema); 126477c47de2SMarkus Armbruster } 126577c47de2SMarkus Armbruster 126677c47de2SMarkus Armbruster static void test_visitor_in_qmp_introspect(TestInputVisitorData *data, 126777c47de2SMarkus Armbruster const void *unused) 126877c47de2SMarkus Armbruster { 126977c47de2SMarkus Armbruster do_test_visitor_in_qmp_introspect(data, test_qmp_schema_json); 127077c47de2SMarkus Armbruster do_test_visitor_in_qmp_introspect(data, qmp_schema_json); 127177c47de2SMarkus Armbruster } 127277c47de2SMarkus Armbruster 1273d88f5fd1SLuiz Capitulino int main(int argc, char **argv) 1274d88f5fd1SLuiz Capitulino { 1275d88f5fd1SLuiz Capitulino g_test_init(&argc, &argv, NULL); 1276d88f5fd1SLuiz Capitulino 1277d88f5fd1SLuiz Capitulino input_visitor_test_add("/visitor/input/int", 1278b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_int); 12794bc0c94dSMarkus Armbruster input_visitor_test_add("/visitor/input/uint", 12804bc0c94dSMarkus Armbruster NULL, test_visitor_in_uint); 1281e92cfa0dSMichael Roth input_visitor_test_add("/visitor/input/int_overflow", 1282b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_int_overflow); 1283cbd8acf3SDaniel P. Berrange input_visitor_test_add("/visitor/input/int_keyval", 1284cbd8acf3SDaniel P. Berrange NULL, test_visitor_in_int_keyval); 1285cbd8acf3SDaniel P. Berrange input_visitor_test_add("/visitor/input/int_str_keyval", 1286cbd8acf3SDaniel P. Berrange NULL, test_visitor_in_int_str_keyval); 1287cbd8acf3SDaniel P. Berrange input_visitor_test_add("/visitor/input/int_str_fail", 1288cbd8acf3SDaniel P. Berrange NULL, test_visitor_in_int_str_fail); 1289d88f5fd1SLuiz Capitulino input_visitor_test_add("/visitor/input/bool", 1290b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_bool); 1291cbd8acf3SDaniel P. Berrange input_visitor_test_add("/visitor/input/bool_keyval", 1292cbd8acf3SDaniel P. Berrange NULL, test_visitor_in_bool_keyval); 1293cbd8acf3SDaniel P. Berrange input_visitor_test_add("/visitor/input/bool_str_keyval", 1294cbd8acf3SDaniel P. Berrange NULL, test_visitor_in_bool_str_keyval); 1295cbd8acf3SDaniel P. Berrange input_visitor_test_add("/visitor/input/bool_str_fail", 1296cbd8acf3SDaniel P. Berrange NULL, test_visitor_in_bool_str_fail); 1297d88f5fd1SLuiz Capitulino input_visitor_test_add("/visitor/input/number", 1298b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_number); 1299c1214ad3SMarc-André Lureau input_visitor_test_add("/visitor/input/large_number", 1300c1214ad3SMarc-André Lureau NULL, test_visitor_in_large_number); 1301cbd8acf3SDaniel P. Berrange input_visitor_test_add("/visitor/input/number_keyval", 1302cbd8acf3SDaniel P. Berrange NULL, test_visitor_in_number_keyval); 1303cbd8acf3SDaniel P. Berrange input_visitor_test_add("/visitor/input/number_str_keyval", 1304cbd8acf3SDaniel P. Berrange NULL, test_visitor_in_number_str_keyval); 1305cbd8acf3SDaniel P. Berrange input_visitor_test_add("/visitor/input/number_str_fail", 1306cbd8acf3SDaniel P. Berrange NULL, test_visitor_in_number_str_fail); 1307cbd8acf3SDaniel P. Berrange input_visitor_test_add("/visitor/input/size_str_keyval", 1308cbd8acf3SDaniel P. Berrange NULL, test_visitor_in_size_str_keyval); 1309cbd8acf3SDaniel P. Berrange input_visitor_test_add("/visitor/input/size_str_fail", 1310cbd8acf3SDaniel P. Berrange NULL, test_visitor_in_size_str_fail); 1311d88f5fd1SLuiz Capitulino input_visitor_test_add("/visitor/input/string", 1312b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_string); 1313d88f5fd1SLuiz Capitulino input_visitor_test_add("/visitor/input/enum", 1314b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_enum); 1315d88f5fd1SLuiz Capitulino input_visitor_test_add("/visitor/input/struct", 1316b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_struct); 1317d88f5fd1SLuiz Capitulino input_visitor_test_add("/visitor/input/struct-nested", 1318b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_struct_nested); 1319d88f5fd1SLuiz Capitulino input_visitor_test_add("/visitor/input/list", 1320b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_list); 132128770e05SMarkus Armbruster input_visitor_test_add("/visitor/input/any", 1322b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_any); 13233df016f1SEric Blake input_visitor_test_add("/visitor/input/null", 1324b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_null); 13252fc00432SMarkus Armbruster input_visitor_test_add("/visitor/input/union-flat", 1326b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_union_flat); 1327ab045267SEric Blake input_visitor_test_add("/visitor/input/alternate", 1328b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_alternate); 13293dcf71f6SPaolo Bonzini input_visitor_test_add("/visitor/input/errors", 1330b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_errors); 13312533377cSEric Blake input_visitor_test_add("/visitor/input/wrong-type", 1332b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_wrong_type); 13339c51b441SEric Blake input_visitor_test_add("/visitor/input/alternate-number", 1334b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_alternate_number); 1335199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/int", 1336b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_int); 1337199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/int8", 1338b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_int8); 1339199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/int16", 1340b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_int16); 1341199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/int32", 1342b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_int32); 1343199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/int64", 1344b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_int64); 1345199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/uint8", 1346b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_uint8); 1347199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/uint16", 1348b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_uint16); 1349199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/uint32", 1350b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_uint32); 1351199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/uint64", 1352b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_uint64); 1353199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/bool", 1354b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_bool); 1355199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/str", 1356b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_string); 1357199e0f17SMichael Roth input_visitor_test_add("/visitor/input/native_list/number", 1358b1d2e5f1SDaniel P. Berrange NULL, test_visitor_in_native_list_number); 135977c47de2SMarkus Armbruster input_visitor_test_add("/visitor/input/fail/struct", 136077c47de2SMarkus Armbruster NULL, test_visitor_in_fail_struct); 136177c47de2SMarkus Armbruster input_visitor_test_add("/visitor/input/fail/struct-nested", 136277c47de2SMarkus Armbruster NULL, test_visitor_in_fail_struct_nested); 136377c47de2SMarkus Armbruster input_visitor_test_add("/visitor/input/fail/struct-in-list", 136477c47de2SMarkus Armbruster NULL, test_visitor_in_fail_struct_in_list); 136577c47de2SMarkus Armbruster input_visitor_test_add("/visitor/input/fail/struct-missing", 136677c47de2SMarkus Armbruster NULL, test_visitor_in_fail_struct_missing); 13679cb8ef36SMarkus Armbruster input_visitor_test_add("/visitor/input/fail/list", 13689cb8ef36SMarkus Armbruster NULL, test_visitor_in_fail_list); 13699cb8ef36SMarkus Armbruster input_visitor_test_add("/visitor/input/fail/list-nested", 13709cb8ef36SMarkus Armbruster NULL, test_visitor_in_fail_list_nested); 137177c47de2SMarkus Armbruster input_visitor_test_add("/visitor/input/fail/union-flat", 137277c47de2SMarkus Armbruster NULL, test_visitor_in_fail_union_flat); 137377c47de2SMarkus Armbruster input_visitor_test_add("/visitor/input/fail/union-flat-no-discriminator", 137477c47de2SMarkus Armbruster NULL, test_visitor_in_fail_union_flat_no_discrim); 137577c47de2SMarkus Armbruster input_visitor_test_add("/visitor/input/fail/alternate", 137677c47de2SMarkus Armbruster NULL, test_visitor_in_fail_alternate); 137777c47de2SMarkus Armbruster input_visitor_test_add("/visitor/input/fail/union-native-list", 137877c47de2SMarkus Armbruster NULL, test_visitor_in_fail_union_native_list); 137977c47de2SMarkus Armbruster input_visitor_test_add("/visitor/input/qmp-introspect", 138077c47de2SMarkus Armbruster NULL, test_visitor_in_qmp_introspect); 1381d88f5fd1SLuiz Capitulino 1382d88f5fd1SLuiz Capitulino g_test_run(); 1383d88f5fd1SLuiz Capitulino 1384d88f5fd1SLuiz Capitulino return 0; 1385d88f5fd1SLuiz Capitulino } 1386