test-qobject-input-visitor.c 45 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366
  1. /*
  2. * QObject Input Visitor unit-tests.
  3. *
  4. * Copyright (C) 2011-2016 Red Hat Inc.
  5. *
  6. * Authors:
  7. * Luiz Capitulino <lcapitulino@redhat.com>
  8. * Paolo Bonzini <pbonzini@redhat.com>
  9. *
  10. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  11. * See the COPYING file in the top-level directory.
  12. */
  13. #include "qemu/osdep.h"
  14. #include "qemu-common.h"
  15. #include "qapi/error.h"
  16. #include "qapi/qobject-input-visitor.h"
  17. #include "test-qapi-types.h"
  18. #include "test-qapi-visit.h"
  19. #include "qapi/qmp/types.h"
  20. #include "qapi/qmp/qjson.h"
  21. #include "test-qmp-introspect.h"
  22. #include "qmp-introspect.h"
  23. #include "qapi-visit.h"
  24. typedef struct TestInputVisitorData {
  25. QObject *obj;
  26. Visitor *qiv;
  27. } TestInputVisitorData;
  28. static void visitor_input_teardown(TestInputVisitorData *data,
  29. const void *unused)
  30. {
  31. qobject_decref(data->obj);
  32. data->obj = NULL;
  33. if (data->qiv) {
  34. visit_free(data->qiv);
  35. data->qiv = NULL;
  36. }
  37. }
  38. /* The various test_init functions are provided instead of a test setup
  39. function so that the JSON string used by the tests are kept in the test
  40. functions (and not in main()). */
  41. static Visitor *visitor_input_test_init_internal(TestInputVisitorData *data,
  42. bool keyval,
  43. const char *json_string,
  44. va_list *ap)
  45. {
  46. visitor_input_teardown(data, NULL);
  47. data->obj = qobject_from_jsonv(json_string, ap, &error_abort);
  48. g_assert(data->obj);
  49. if (keyval) {
  50. data->qiv = qobject_input_visitor_new_keyval(data->obj);
  51. } else {
  52. data->qiv = qobject_input_visitor_new(data->obj);
  53. }
  54. g_assert(data->qiv);
  55. return data->qiv;
  56. }
  57. static GCC_FMT_ATTR(3, 4)
  58. Visitor *visitor_input_test_init_full(TestInputVisitorData *data,
  59. bool keyval,
  60. const char *json_string, ...)
  61. {
  62. Visitor *v;
  63. va_list ap;
  64. va_start(ap, json_string);
  65. v = visitor_input_test_init_internal(data, keyval, json_string, &ap);
  66. va_end(ap);
  67. return v;
  68. }
  69. static GCC_FMT_ATTR(2, 3)
  70. Visitor *visitor_input_test_init(TestInputVisitorData *data,
  71. const char *json_string, ...)
  72. {
  73. Visitor *v;
  74. va_list ap;
  75. va_start(ap, json_string);
  76. v = visitor_input_test_init_internal(data, false, json_string, &ap);
  77. va_end(ap);
  78. return v;
  79. }
  80. /* similar to visitor_input_test_init(), but does not expect a string
  81. * literal/format json_string argument and so can be used for
  82. * programatically generated strings (and we can't pass in programatically
  83. * generated strings via %s format parameters since qobject_from_jsonv()
  84. * will wrap those in double-quotes and treat the entire object as a
  85. * string)
  86. */
  87. static Visitor *visitor_input_test_init_raw(TestInputVisitorData *data,
  88. const char *json_string)
  89. {
  90. return visitor_input_test_init_internal(data, false, json_string, NULL);
  91. }
  92. static void test_visitor_in_int(TestInputVisitorData *data,
  93. const void *unused)
  94. {
  95. int64_t res = 0;
  96. int value = -42;
  97. Visitor *v;
  98. v = visitor_input_test_init(data, "%d", value);
  99. visit_type_int(v, NULL, &res, &error_abort);
  100. g_assert_cmpint(res, ==, value);
  101. }
  102. static void test_visitor_in_uint(TestInputVisitorData *data,
  103. const void *unused)
  104. {
  105. Error *err = NULL;
  106. uint64_t res = 0;
  107. int value = 42;
  108. Visitor *v;
  109. v = visitor_input_test_init(data, "%d", value);
  110. visit_type_uint64(v, NULL, &res, &error_abort);
  111. g_assert_cmpuint(res, ==, (uint64_t)value);
  112. /* BUG: value between INT64_MIN and -1 accepted modulo 2^64 */
  113. v = visitor_input_test_init(data, "%d", -value);
  114. visit_type_uint64(v, NULL, &res, &error_abort);
  115. g_assert_cmpuint(res, ==, (uint64_t)-value);
  116. /* BUG: value between INT64_MAX+1 and UINT64_MAX rejected */
  117. v = visitor_input_test_init(data, "18446744073709551574");
  118. visit_type_uint64(v, NULL, &res, &err);
  119. error_free_or_abort(&err);
  120. }
  121. static void test_visitor_in_int_overflow(TestInputVisitorData *data,
  122. const void *unused)
  123. {
  124. int64_t res = 0;
  125. Error *err = NULL;
  126. Visitor *v;
  127. /* this will overflow a Qint/int64, so should be deserialized into
  128. * a QFloat/double field instead, leading to an error if we pass it
  129. * to visit_type_int. confirm this.
  130. */
  131. v = visitor_input_test_init(data, "%f", DBL_MAX);
  132. visit_type_int(v, NULL, &res, &err);
  133. error_free_or_abort(&err);
  134. }
  135. static void test_visitor_in_int_keyval(TestInputVisitorData *data,
  136. const void *unused)
  137. {
  138. int64_t res = 0, value = -42;
  139. Error *err = NULL;
  140. Visitor *v;
  141. v = visitor_input_test_init_full(data, true, "%" PRId64, value);
  142. visit_type_int(v, NULL, &res, &err);
  143. error_free_or_abort(&err);
  144. }
  145. static void test_visitor_in_int_str_keyval(TestInputVisitorData *data,
  146. const void *unused)
  147. {
  148. int64_t res = 0, value = -42;
  149. Visitor *v;
  150. v = visitor_input_test_init_full(data, true, "\"-42\"");
  151. visit_type_int(v, NULL, &res, &error_abort);
  152. g_assert_cmpint(res, ==, value);
  153. }
  154. static void test_visitor_in_int_str_fail(TestInputVisitorData *data,
  155. const void *unused)
  156. {
  157. int64_t res = 0;
  158. Visitor *v;
  159. Error *err = NULL;
  160. v = visitor_input_test_init(data, "\"-42\"");
  161. visit_type_int(v, NULL, &res, &err);
  162. error_free_or_abort(&err);
  163. }
  164. static void test_visitor_in_bool(TestInputVisitorData *data,
  165. const void *unused)
  166. {
  167. bool res = false;
  168. Visitor *v;
  169. v = visitor_input_test_init(data, "true");
  170. visit_type_bool(v, NULL, &res, &error_abort);
  171. g_assert_cmpint(res, ==, true);
  172. }
  173. static void test_visitor_in_bool_keyval(TestInputVisitorData *data,
  174. const void *unused)
  175. {
  176. bool res = false;
  177. Error *err = NULL;
  178. Visitor *v;
  179. v = visitor_input_test_init_full(data, true, "true");
  180. visit_type_bool(v, NULL, &res, &err);
  181. error_free_or_abort(&err);
  182. }
  183. static void test_visitor_in_bool_str_keyval(TestInputVisitorData *data,
  184. const void *unused)
  185. {
  186. bool res = false;
  187. Visitor *v;
  188. v = visitor_input_test_init_full(data, true, "\"on\"");
  189. visit_type_bool(v, NULL, &res, &error_abort);
  190. g_assert_cmpint(res, ==, true);
  191. }
  192. static void test_visitor_in_bool_str_fail(TestInputVisitorData *data,
  193. const void *unused)
  194. {
  195. bool res = false;
  196. Visitor *v;
  197. Error *err = NULL;
  198. v = visitor_input_test_init(data, "\"true\"");
  199. visit_type_bool(v, NULL, &res, &err);
  200. error_free_or_abort(&err);
  201. }
  202. static void test_visitor_in_number(TestInputVisitorData *data,
  203. const void *unused)
  204. {
  205. double res = 0, value = 3.14;
  206. Visitor *v;
  207. v = visitor_input_test_init(data, "%f", value);
  208. visit_type_number(v, NULL, &res, &error_abort);
  209. g_assert_cmpfloat(res, ==, value);
  210. }
  211. static void test_visitor_in_number_keyval(TestInputVisitorData *data,
  212. const void *unused)
  213. {
  214. double res = 0, value = 3.14;
  215. Error *err = NULL;
  216. Visitor *v;
  217. v = visitor_input_test_init_full(data, true, "%f", value);
  218. visit_type_number(v, NULL, &res, &err);
  219. error_free_or_abort(&err);
  220. }
  221. static void test_visitor_in_number_str_keyval(TestInputVisitorData *data,
  222. const void *unused)
  223. {
  224. double res = 0, value = 3.14;
  225. Visitor *v;
  226. Error *err = NULL;
  227. v = visitor_input_test_init_full(data, true, "\"3.14\"");
  228. visit_type_number(v, NULL, &res, &error_abort);
  229. g_assert_cmpfloat(res, ==, value);
  230. v = visitor_input_test_init_full(data, true, "\"inf\"");
  231. visit_type_number(v, NULL, &res, &err);
  232. error_free_or_abort(&err);
  233. }
  234. static void test_visitor_in_number_str_fail(TestInputVisitorData *data,
  235. const void *unused)
  236. {
  237. double res = 0;
  238. Visitor *v;
  239. Error *err = NULL;
  240. v = visitor_input_test_init(data, "\"3.14\"");
  241. visit_type_number(v, NULL, &res, &err);
  242. error_free_or_abort(&err);
  243. }
  244. static void test_visitor_in_size_str_keyval(TestInputVisitorData *data,
  245. const void *unused)
  246. {
  247. uint64_t res, value = 500 * 1024 * 1024;
  248. Visitor *v;
  249. v = visitor_input_test_init_full(data, true, "\"500M\"");
  250. visit_type_size(v, NULL, &res, &error_abort);
  251. g_assert_cmpfloat(res, ==, value);
  252. }
  253. static void test_visitor_in_size_str_fail(TestInputVisitorData *data,
  254. const void *unused)
  255. {
  256. uint64_t res = 0;
  257. Visitor *v;
  258. Error *err = NULL;
  259. v = visitor_input_test_init(data, "\"500M\"");
  260. visit_type_size(v, NULL, &res, &err);
  261. error_free_or_abort(&err);
  262. }
  263. static void test_visitor_in_string(TestInputVisitorData *data,
  264. const void *unused)
  265. {
  266. char *res = NULL, *value = (char *) "Q E M U";
  267. Visitor *v;
  268. v = visitor_input_test_init(data, "%s", value);
  269. visit_type_str(v, NULL, &res, &error_abort);
  270. g_assert_cmpstr(res, ==, value);
  271. g_free(res);
  272. }
  273. static void test_visitor_in_enum(TestInputVisitorData *data,
  274. const void *unused)
  275. {
  276. Visitor *v;
  277. EnumOne i;
  278. for (i = 0; EnumOne_lookup[i]; i++) {
  279. EnumOne res = -1;
  280. v = visitor_input_test_init(data, "%s", EnumOne_lookup[i]);
  281. visit_type_EnumOne(v, NULL, &res, &error_abort);
  282. g_assert_cmpint(i, ==, res);
  283. }
  284. }
  285. static void test_visitor_in_struct(TestInputVisitorData *data,
  286. const void *unused)
  287. {
  288. TestStruct *p = NULL;
  289. Visitor *v;
  290. v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }");
  291. visit_type_TestStruct(v, NULL, &p, &error_abort);
  292. g_assert_cmpint(p->integer, ==, -42);
  293. g_assert(p->boolean == true);
  294. g_assert_cmpstr(p->string, ==, "foo");
  295. g_free(p->string);
  296. g_free(p);
  297. }
  298. static void test_visitor_in_struct_nested(TestInputVisitorData *data,
  299. const void *unused)
  300. {
  301. UserDefTwo *udp = NULL;
  302. Visitor *v;
  303. v = visitor_input_test_init(data, "{ 'string0': 'string0', "
  304. "'dict1': { 'string1': 'string1', "
  305. "'dict2': { 'userdef': { 'integer': 42, "
  306. "'string': 'string' }, 'string': 'string2'}}}");
  307. visit_type_UserDefTwo(v, NULL, &udp, &error_abort);
  308. g_assert_cmpstr(udp->string0, ==, "string0");
  309. g_assert_cmpstr(udp->dict1->string1, ==, "string1");
  310. g_assert_cmpint(udp->dict1->dict2->userdef->integer, ==, 42);
  311. g_assert_cmpstr(udp->dict1->dict2->userdef->string, ==, "string");
  312. g_assert_cmpstr(udp->dict1->dict2->string, ==, "string2");
  313. g_assert(udp->dict1->has_dict3 == false);
  314. qapi_free_UserDefTwo(udp);
  315. }
  316. static void test_visitor_in_list(TestInputVisitorData *data,
  317. const void *unused)
  318. {
  319. UserDefOneList *item, *head = NULL;
  320. Visitor *v;
  321. int i;
  322. v = visitor_input_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44 } ]");
  323. visit_type_UserDefOneList(v, NULL, &head, &error_abort);
  324. g_assert(head != NULL);
  325. for (i = 0, item = head; item; item = item->next, i++) {
  326. char string[12];
  327. snprintf(string, sizeof(string), "string%d", i);
  328. g_assert_cmpstr(item->value->string, ==, string);
  329. g_assert_cmpint(item->value->integer, ==, 42 + i);
  330. }
  331. qapi_free_UserDefOneList(head);
  332. head = NULL;
  333. /* An empty list is valid */
  334. v = visitor_input_test_init(data, "[]");
  335. visit_type_UserDefOneList(v, NULL, &head, &error_abort);
  336. g_assert(!head);
  337. }
  338. static void test_visitor_in_any(TestInputVisitorData *data,
  339. const void *unused)
  340. {
  341. QObject *res = NULL;
  342. Visitor *v;
  343. QInt *qint;
  344. QBool *qbool;
  345. QString *qstring;
  346. QDict *qdict;
  347. QObject *qobj;
  348. v = visitor_input_test_init(data, "-42");
  349. visit_type_any(v, NULL, &res, &error_abort);
  350. qint = qobject_to_qint(res);
  351. g_assert(qint);
  352. g_assert_cmpint(qint_get_int(qint), ==, -42);
  353. qobject_decref(res);
  354. v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }");
  355. visit_type_any(v, NULL, &res, &error_abort);
  356. qdict = qobject_to_qdict(res);
  357. g_assert(qdict && qdict_size(qdict) == 3);
  358. qobj = qdict_get(qdict, "integer");
  359. g_assert(qobj);
  360. qint = qobject_to_qint(qobj);
  361. g_assert(qint);
  362. g_assert_cmpint(qint_get_int(qint), ==, -42);
  363. qobj = qdict_get(qdict, "boolean");
  364. g_assert(qobj);
  365. qbool = qobject_to_qbool(qobj);
  366. g_assert(qbool);
  367. g_assert(qbool_get_bool(qbool) == true);
  368. qobj = qdict_get(qdict, "string");
  369. g_assert(qobj);
  370. qstring = qobject_to_qstring(qobj);
  371. g_assert(qstring);
  372. g_assert_cmpstr(qstring_get_str(qstring), ==, "foo");
  373. qobject_decref(res);
  374. }
  375. static void test_visitor_in_null(TestInputVisitorData *data,
  376. const void *unused)
  377. {
  378. Visitor *v;
  379. Error *err = NULL;
  380. char *tmp;
  381. /*
  382. * FIXME: Since QAPI doesn't know the 'null' type yet, we can't
  383. * test visit_type_null() by reading into a QAPI struct then
  384. * checking that it was populated correctly. The best we can do
  385. * for now is ensure that we consumed null from the input, proven
  386. * by the fact that we can't re-read the key; and that we detect
  387. * when input is not null.
  388. */
  389. v = visitor_input_test_init_full(data, false,
  390. "{ 'a': null, 'b': '' }");
  391. visit_start_struct(v, NULL, NULL, 0, &error_abort);
  392. visit_type_null(v, "a", &error_abort);
  393. visit_type_null(v, "b", &err);
  394. error_free_or_abort(&err);
  395. visit_type_str(v, "c", &tmp, &err);
  396. g_assert(!tmp);
  397. error_free_or_abort(&err);
  398. visit_check_struct(v, &error_abort);
  399. visit_end_struct(v, NULL);
  400. }
  401. static void test_visitor_in_union_flat(TestInputVisitorData *data,
  402. const void *unused)
  403. {
  404. Visitor *v;
  405. UserDefFlatUnion *tmp;
  406. UserDefUnionBase *base;
  407. v = visitor_input_test_init(data,
  408. "{ 'enum1': 'value1', "
  409. "'integer': 41, "
  410. "'string': 'str', "
  411. "'boolean': true }");
  412. visit_type_UserDefFlatUnion(v, NULL, &tmp, &error_abort);
  413. g_assert_cmpint(tmp->enum1, ==, ENUM_ONE_VALUE1);
  414. g_assert_cmpstr(tmp->string, ==, "str");
  415. g_assert_cmpint(tmp->integer, ==, 41);
  416. g_assert_cmpint(tmp->u.value1.boolean, ==, true);
  417. base = qapi_UserDefFlatUnion_base(tmp);
  418. g_assert(&base->enum1 == &tmp->enum1);
  419. qapi_free_UserDefFlatUnion(tmp);
  420. }
  421. static void test_visitor_in_alternate(TestInputVisitorData *data,
  422. const void *unused)
  423. {
  424. Visitor *v;
  425. Error *err = NULL;
  426. UserDefAlternate *tmp;
  427. WrapAlternate *wrap;
  428. v = visitor_input_test_init(data, "42");
  429. visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort);
  430. g_assert_cmpint(tmp->type, ==, QTYPE_QINT);
  431. g_assert_cmpint(tmp->u.i, ==, 42);
  432. qapi_free_UserDefAlternate(tmp);
  433. v = visitor_input_test_init(data, "'value1'");
  434. visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort);
  435. g_assert_cmpint(tmp->type, ==, QTYPE_QSTRING);
  436. g_assert_cmpint(tmp->u.e, ==, ENUM_ONE_VALUE1);
  437. qapi_free_UserDefAlternate(tmp);
  438. v = visitor_input_test_init(data, "{'integer':1, 'string':'str', "
  439. "'enum1':'value1', 'boolean':true}");
  440. visit_type_UserDefAlternate(v, NULL, &tmp, &error_abort);
  441. g_assert_cmpint(tmp->type, ==, QTYPE_QDICT);
  442. g_assert_cmpint(tmp->u.udfu.integer, ==, 1);
  443. g_assert_cmpstr(tmp->u.udfu.string, ==, "str");
  444. g_assert_cmpint(tmp->u.udfu.enum1, ==, ENUM_ONE_VALUE1);
  445. g_assert_cmpint(tmp->u.udfu.u.value1.boolean, ==, true);
  446. g_assert_cmpint(tmp->u.udfu.u.value1.has_a_b, ==, false);
  447. qapi_free_UserDefAlternate(tmp);
  448. v = visitor_input_test_init(data, "false");
  449. visit_type_UserDefAlternate(v, NULL, &tmp, &err);
  450. error_free_or_abort(&err);
  451. qapi_free_UserDefAlternate(tmp);
  452. v = visitor_input_test_init(data, "{ 'alt': 42 }");
  453. visit_type_WrapAlternate(v, NULL, &wrap, &error_abort);
  454. g_assert_cmpint(wrap->alt->type, ==, QTYPE_QINT);
  455. g_assert_cmpint(wrap->alt->u.i, ==, 42);
  456. qapi_free_WrapAlternate(wrap);
  457. v = visitor_input_test_init(data, "{ 'alt': 'value1' }");
  458. visit_type_WrapAlternate(v, NULL, &wrap, &error_abort);
  459. g_assert_cmpint(wrap->alt->type, ==, QTYPE_QSTRING);
  460. g_assert_cmpint(wrap->alt->u.e, ==, ENUM_ONE_VALUE1);
  461. qapi_free_WrapAlternate(wrap);
  462. v = visitor_input_test_init(data, "{ 'alt': {'integer':1, 'string':'str', "
  463. "'enum1':'value1', 'boolean':true} }");
  464. visit_type_WrapAlternate(v, NULL, &wrap, &error_abort);
  465. g_assert_cmpint(wrap->alt->type, ==, QTYPE_QDICT);
  466. g_assert_cmpint(wrap->alt->u.udfu.integer, ==, 1);
  467. g_assert_cmpstr(wrap->alt->u.udfu.string, ==, "str");
  468. g_assert_cmpint(wrap->alt->u.udfu.enum1, ==, ENUM_ONE_VALUE1);
  469. g_assert_cmpint(wrap->alt->u.udfu.u.value1.boolean, ==, true);
  470. g_assert_cmpint(wrap->alt->u.udfu.u.value1.has_a_b, ==, false);
  471. qapi_free_WrapAlternate(wrap);
  472. }
  473. static void test_visitor_in_alternate_number(TestInputVisitorData *data,
  474. const void *unused)
  475. {
  476. Visitor *v;
  477. Error *err = NULL;
  478. AltEnumBool *aeb;
  479. AltEnumNum *aen;
  480. AltNumEnum *ans;
  481. AltEnumInt *asi;
  482. AltIntNum *ain;
  483. AltNumInt *ani;
  484. /* Parsing an int */
  485. v = visitor_input_test_init(data, "42");
  486. visit_type_AltEnumBool(v, NULL, &aeb, &err);
  487. error_free_or_abort(&err);
  488. qapi_free_AltEnumBool(aeb);
  489. v = visitor_input_test_init(data, "42");
  490. visit_type_AltEnumNum(v, NULL, &aen, &error_abort);
  491. g_assert_cmpint(aen->type, ==, QTYPE_QFLOAT);
  492. g_assert_cmpfloat(aen->u.n, ==, 42);
  493. qapi_free_AltEnumNum(aen);
  494. v = visitor_input_test_init(data, "42");
  495. visit_type_AltNumEnum(v, NULL, &ans, &error_abort);
  496. g_assert_cmpint(ans->type, ==, QTYPE_QFLOAT);
  497. g_assert_cmpfloat(ans->u.n, ==, 42);
  498. qapi_free_AltNumEnum(ans);
  499. v = visitor_input_test_init(data, "42");
  500. visit_type_AltEnumInt(v, NULL, &asi, &error_abort);
  501. g_assert_cmpint(asi->type, ==, QTYPE_QINT);
  502. g_assert_cmpint(asi->u.i, ==, 42);
  503. qapi_free_AltEnumInt(asi);
  504. v = visitor_input_test_init(data, "42");
  505. visit_type_AltIntNum(v, NULL, &ain, &error_abort);
  506. g_assert_cmpint(ain->type, ==, QTYPE_QINT);
  507. g_assert_cmpint(ain->u.i, ==, 42);
  508. qapi_free_AltIntNum(ain);
  509. v = visitor_input_test_init(data, "42");
  510. visit_type_AltNumInt(v, NULL, &ani, &error_abort);
  511. g_assert_cmpint(ani->type, ==, QTYPE_QINT);
  512. g_assert_cmpint(ani->u.i, ==, 42);
  513. qapi_free_AltNumInt(ani);
  514. /* Parsing a double */
  515. v = visitor_input_test_init(data, "42.5");
  516. visit_type_AltEnumBool(v, NULL, &aeb, &err);
  517. error_free_or_abort(&err);
  518. qapi_free_AltEnumBool(aeb);
  519. v = visitor_input_test_init(data, "42.5");
  520. visit_type_AltEnumNum(v, NULL, &aen, &error_abort);
  521. g_assert_cmpint(aen->type, ==, QTYPE_QFLOAT);
  522. g_assert_cmpfloat(aen->u.n, ==, 42.5);
  523. qapi_free_AltEnumNum(aen);
  524. v = visitor_input_test_init(data, "42.5");
  525. visit_type_AltNumEnum(v, NULL, &ans, &error_abort);
  526. g_assert_cmpint(ans->type, ==, QTYPE_QFLOAT);
  527. g_assert_cmpfloat(ans->u.n, ==, 42.5);
  528. qapi_free_AltNumEnum(ans);
  529. v = visitor_input_test_init(data, "42.5");
  530. visit_type_AltEnumInt(v, NULL, &asi, &err);
  531. error_free_or_abort(&err);
  532. qapi_free_AltEnumInt(asi);
  533. v = visitor_input_test_init(data, "42.5");
  534. visit_type_AltIntNum(v, NULL, &ain, &error_abort);
  535. g_assert_cmpint(ain->type, ==, QTYPE_QFLOAT);
  536. g_assert_cmpfloat(ain->u.n, ==, 42.5);
  537. qapi_free_AltIntNum(ain);
  538. v = visitor_input_test_init(data, "42.5");
  539. visit_type_AltNumInt(v, NULL, &ani, &error_abort);
  540. g_assert_cmpint(ani->type, ==, QTYPE_QFLOAT);
  541. g_assert_cmpfloat(ani->u.n, ==, 42.5);
  542. qapi_free_AltNumInt(ani);
  543. }
  544. static void test_native_list_integer_helper(TestInputVisitorData *data,
  545. const void *unused,
  546. UserDefNativeListUnionKind kind)
  547. {
  548. UserDefNativeListUnion *cvalue = NULL;
  549. Visitor *v;
  550. GString *gstr_list = g_string_new("");
  551. GString *gstr_union = g_string_new("");
  552. int i;
  553. for (i = 0; i < 32; i++) {
  554. g_string_append_printf(gstr_list, "%d", i);
  555. if (i != 31) {
  556. g_string_append(gstr_list, ", ");
  557. }
  558. }
  559. g_string_append_printf(gstr_union, "{ 'type': '%s', 'data': [ %s ] }",
  560. UserDefNativeListUnionKind_lookup[kind],
  561. gstr_list->str);
  562. v = visitor_input_test_init_raw(data, gstr_union->str);
  563. visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
  564. g_assert(cvalue != NULL);
  565. g_assert_cmpint(cvalue->type, ==, kind);
  566. switch (kind) {
  567. case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER: {
  568. intList *elem = NULL;
  569. for (i = 0, elem = cvalue->u.integer.data;
  570. elem; elem = elem->next, i++) {
  571. g_assert_cmpint(elem->value, ==, i);
  572. }
  573. break;
  574. }
  575. case USER_DEF_NATIVE_LIST_UNION_KIND_S8: {
  576. int8List *elem = NULL;
  577. for (i = 0, elem = cvalue->u.s8.data; elem; elem = elem->next, i++) {
  578. g_assert_cmpint(elem->value, ==, i);
  579. }
  580. break;
  581. }
  582. case USER_DEF_NATIVE_LIST_UNION_KIND_S16: {
  583. int16List *elem = NULL;
  584. for (i = 0, elem = cvalue->u.s16.data; elem; elem = elem->next, i++) {
  585. g_assert_cmpint(elem->value, ==, i);
  586. }
  587. break;
  588. }
  589. case USER_DEF_NATIVE_LIST_UNION_KIND_S32: {
  590. int32List *elem = NULL;
  591. for (i = 0, elem = cvalue->u.s32.data; elem; elem = elem->next, i++) {
  592. g_assert_cmpint(elem->value, ==, i);
  593. }
  594. break;
  595. }
  596. case USER_DEF_NATIVE_LIST_UNION_KIND_S64: {
  597. int64List *elem = NULL;
  598. for (i = 0, elem = cvalue->u.s64.data; elem; elem = elem->next, i++) {
  599. g_assert_cmpint(elem->value, ==, i);
  600. }
  601. break;
  602. }
  603. case USER_DEF_NATIVE_LIST_UNION_KIND_U8: {
  604. uint8List *elem = NULL;
  605. for (i = 0, elem = cvalue->u.u8.data; elem; elem = elem->next, i++) {
  606. g_assert_cmpint(elem->value, ==, i);
  607. }
  608. break;
  609. }
  610. case USER_DEF_NATIVE_LIST_UNION_KIND_U16: {
  611. uint16List *elem = NULL;
  612. for (i = 0, elem = cvalue->u.u16.data; elem; elem = elem->next, i++) {
  613. g_assert_cmpint(elem->value, ==, i);
  614. }
  615. break;
  616. }
  617. case USER_DEF_NATIVE_LIST_UNION_KIND_U32: {
  618. uint32List *elem = NULL;
  619. for (i = 0, elem = cvalue->u.u32.data; elem; elem = elem->next, i++) {
  620. g_assert_cmpint(elem->value, ==, i);
  621. }
  622. break;
  623. }
  624. case USER_DEF_NATIVE_LIST_UNION_KIND_U64: {
  625. uint64List *elem = NULL;
  626. for (i = 0, elem = cvalue->u.u64.data; elem; elem = elem->next, i++) {
  627. g_assert_cmpint(elem->value, ==, i);
  628. }
  629. break;
  630. }
  631. default:
  632. g_assert_not_reached();
  633. }
  634. g_string_free(gstr_union, true);
  635. g_string_free(gstr_list, true);
  636. qapi_free_UserDefNativeListUnion(cvalue);
  637. }
  638. static void test_visitor_in_native_list_int(TestInputVisitorData *data,
  639. const void *unused)
  640. {
  641. test_native_list_integer_helper(data, unused,
  642. USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER);
  643. }
  644. static void test_visitor_in_native_list_int8(TestInputVisitorData *data,
  645. const void *unused)
  646. {
  647. test_native_list_integer_helper(data, unused,
  648. USER_DEF_NATIVE_LIST_UNION_KIND_S8);
  649. }
  650. static void test_visitor_in_native_list_int16(TestInputVisitorData *data,
  651. const void *unused)
  652. {
  653. test_native_list_integer_helper(data, unused,
  654. USER_DEF_NATIVE_LIST_UNION_KIND_S16);
  655. }
  656. static void test_visitor_in_native_list_int32(TestInputVisitorData *data,
  657. const void *unused)
  658. {
  659. test_native_list_integer_helper(data, unused,
  660. USER_DEF_NATIVE_LIST_UNION_KIND_S32);
  661. }
  662. static void test_visitor_in_native_list_int64(TestInputVisitorData *data,
  663. const void *unused)
  664. {
  665. test_native_list_integer_helper(data, unused,
  666. USER_DEF_NATIVE_LIST_UNION_KIND_S64);
  667. }
  668. static void test_visitor_in_native_list_uint8(TestInputVisitorData *data,
  669. const void *unused)
  670. {
  671. test_native_list_integer_helper(data, unused,
  672. USER_DEF_NATIVE_LIST_UNION_KIND_U8);
  673. }
  674. static void test_visitor_in_native_list_uint16(TestInputVisitorData *data,
  675. const void *unused)
  676. {
  677. test_native_list_integer_helper(data, unused,
  678. USER_DEF_NATIVE_LIST_UNION_KIND_U16);
  679. }
  680. static void test_visitor_in_native_list_uint32(TestInputVisitorData *data,
  681. const void *unused)
  682. {
  683. test_native_list_integer_helper(data, unused,
  684. USER_DEF_NATIVE_LIST_UNION_KIND_U32);
  685. }
  686. static void test_visitor_in_native_list_uint64(TestInputVisitorData *data,
  687. const void *unused)
  688. {
  689. test_native_list_integer_helper(data, unused,
  690. USER_DEF_NATIVE_LIST_UNION_KIND_U64);
  691. }
  692. static void test_visitor_in_native_list_bool(TestInputVisitorData *data,
  693. const void *unused)
  694. {
  695. UserDefNativeListUnion *cvalue = NULL;
  696. boolList *elem = NULL;
  697. Visitor *v;
  698. GString *gstr_list = g_string_new("");
  699. GString *gstr_union = g_string_new("");
  700. int i;
  701. for (i = 0; i < 32; i++) {
  702. g_string_append_printf(gstr_list, "%s",
  703. (i % 3 == 0) ? "true" : "false");
  704. if (i != 31) {
  705. g_string_append(gstr_list, ", ");
  706. }
  707. }
  708. g_string_append_printf(gstr_union, "{ 'type': 'boolean', 'data': [ %s ] }",
  709. gstr_list->str);
  710. v = visitor_input_test_init_raw(data, gstr_union->str);
  711. visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
  712. g_assert(cvalue != NULL);
  713. g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN);
  714. for (i = 0, elem = cvalue->u.boolean.data; elem; elem = elem->next, i++) {
  715. g_assert_cmpint(elem->value, ==, (i % 3 == 0) ? 1 : 0);
  716. }
  717. g_string_free(gstr_union, true);
  718. g_string_free(gstr_list, true);
  719. qapi_free_UserDefNativeListUnion(cvalue);
  720. }
  721. static void test_visitor_in_native_list_string(TestInputVisitorData *data,
  722. const void *unused)
  723. {
  724. UserDefNativeListUnion *cvalue = NULL;
  725. strList *elem = NULL;
  726. Visitor *v;
  727. GString *gstr_list = g_string_new("");
  728. GString *gstr_union = g_string_new("");
  729. int i;
  730. for (i = 0; i < 32; i++) {
  731. g_string_append_printf(gstr_list, "'%d'", i);
  732. if (i != 31) {
  733. g_string_append(gstr_list, ", ");
  734. }
  735. }
  736. g_string_append_printf(gstr_union, "{ 'type': 'string', 'data': [ %s ] }",
  737. gstr_list->str);
  738. v = visitor_input_test_init_raw(data, gstr_union->str);
  739. visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
  740. g_assert(cvalue != NULL);
  741. g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_STRING);
  742. for (i = 0, elem = cvalue->u.string.data; elem; elem = elem->next, i++) {
  743. gchar str[8];
  744. sprintf(str, "%d", i);
  745. g_assert_cmpstr(elem->value, ==, str);
  746. }
  747. g_string_free(gstr_union, true);
  748. g_string_free(gstr_list, true);
  749. qapi_free_UserDefNativeListUnion(cvalue);
  750. }
  751. #define DOUBLE_STR_MAX 16
  752. static void test_visitor_in_native_list_number(TestInputVisitorData *data,
  753. const void *unused)
  754. {
  755. UserDefNativeListUnion *cvalue = NULL;
  756. numberList *elem = NULL;
  757. Visitor *v;
  758. GString *gstr_list = g_string_new("");
  759. GString *gstr_union = g_string_new("");
  760. int i;
  761. for (i = 0; i < 32; i++) {
  762. g_string_append_printf(gstr_list, "%f", (double)i / 3);
  763. if (i != 31) {
  764. g_string_append(gstr_list, ", ");
  765. }
  766. }
  767. g_string_append_printf(gstr_union, "{ 'type': 'number', 'data': [ %s ] }",
  768. gstr_list->str);
  769. v = visitor_input_test_init_raw(data, gstr_union->str);
  770. visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort);
  771. g_assert(cvalue != NULL);
  772. g_assert_cmpint(cvalue->type, ==, USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER);
  773. for (i = 0, elem = cvalue->u.number.data; elem; elem = elem->next, i++) {
  774. GString *double_expected = g_string_new("");
  775. GString *double_actual = g_string_new("");
  776. g_string_printf(double_expected, "%.6f", (double)i / 3);
  777. g_string_printf(double_actual, "%.6f", elem->value);
  778. g_assert_cmpstr(double_expected->str, ==, double_actual->str);
  779. g_string_free(double_expected, true);
  780. g_string_free(double_actual, true);
  781. }
  782. g_string_free(gstr_union, true);
  783. g_string_free(gstr_list, true);
  784. qapi_free_UserDefNativeListUnion(cvalue);
  785. }
  786. static void input_visitor_test_add(const char *testpath,
  787. const void *user_data,
  788. void (*test_func)(TestInputVisitorData *data,
  789. const void *user_data))
  790. {
  791. g_test_add(testpath, TestInputVisitorData, user_data, NULL, test_func,
  792. visitor_input_teardown);
  793. }
  794. static void test_visitor_in_errors(TestInputVisitorData *data,
  795. const void *unused)
  796. {
  797. TestStruct *p = NULL;
  798. Error *err = NULL;
  799. Visitor *v;
  800. strList *q = NULL;
  801. UserDefTwo *r = NULL;
  802. WrapAlternate *s = NULL;
  803. v = visitor_input_test_init(data, "{ 'integer': false, 'boolean': 'foo', "
  804. "'string': -42 }");
  805. visit_type_TestStruct(v, NULL, &p, &err);
  806. error_free_or_abort(&err);
  807. g_assert(!p);
  808. v = visitor_input_test_init(data, "[ '1', '2', false, '3' ]");
  809. visit_type_strList(v, NULL, &q, &err);
  810. error_free_or_abort(&err);
  811. assert(!q);
  812. v = visitor_input_test_init(data, "{ 'str':'hi' }");
  813. visit_type_UserDefTwo(v, NULL, &r, &err);
  814. error_free_or_abort(&err);
  815. assert(!r);
  816. v = visitor_input_test_init(data, "{ }");
  817. visit_type_WrapAlternate(v, NULL, &s, &err);
  818. error_free_or_abort(&err);
  819. assert(!s);
  820. }
  821. static void test_visitor_in_wrong_type(TestInputVisitorData *data,
  822. const void *unused)
  823. {
  824. TestStruct *p = NULL;
  825. Visitor *v;
  826. strList *q = NULL;
  827. int64_t i;
  828. Error *err = NULL;
  829. /* Make sure arrays and structs cannot be confused */
  830. v = visitor_input_test_init(data, "[]");
  831. visit_type_TestStruct(v, NULL, &p, &err);
  832. error_free_or_abort(&err);
  833. g_assert(!p);
  834. v = visitor_input_test_init(data, "{}");
  835. visit_type_strList(v, NULL, &q, &err);
  836. error_free_or_abort(&err);
  837. assert(!q);
  838. /* Make sure primitives and struct cannot be confused */
  839. v = visitor_input_test_init(data, "1");
  840. visit_type_TestStruct(v, NULL, &p, &err);
  841. error_free_or_abort(&err);
  842. g_assert(!p);
  843. v = visitor_input_test_init(data, "{}");
  844. visit_type_int(v, NULL, &i, &err);
  845. error_free_or_abort(&err);
  846. /* Make sure primitives and arrays cannot be confused */
  847. v = visitor_input_test_init(data, "1");
  848. visit_type_strList(v, NULL, &q, &err);
  849. error_free_or_abort(&err);
  850. assert(!q);
  851. v = visitor_input_test_init(data, "[]");
  852. visit_type_int(v, NULL, &i, &err);
  853. error_free_or_abort(&err);
  854. }
  855. static void test_visitor_in_fail_struct(TestInputVisitorData *data,
  856. const void *unused)
  857. {
  858. TestStruct *p = NULL;
  859. Error *err = NULL;
  860. Visitor *v;
  861. v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo', 'extra': 42 }");
  862. visit_type_TestStruct(v, NULL, &p, &err);
  863. error_free_or_abort(&err);
  864. g_assert(!p);
  865. }
  866. static void test_visitor_in_fail_struct_nested(TestInputVisitorData *data,
  867. const void *unused)
  868. {
  869. UserDefTwo *udp = NULL;
  870. Error *err = NULL;
  871. Visitor *v;
  872. v = visitor_input_test_init(data, "{ 'string0': 'string0', 'dict1': { 'string1': 'string1', 'dict2': { 'userdef1': { 'integer': 42, 'string': 'string', 'extra': [42, 23, {'foo':'bar'}] }, 'string2': 'string2'}}}");
  873. visit_type_UserDefTwo(v, NULL, &udp, &err);
  874. error_free_or_abort(&err);
  875. g_assert(!udp);
  876. }
  877. static void test_visitor_in_fail_struct_in_list(TestInputVisitorData *data,
  878. const void *unused)
  879. {
  880. UserDefOneList *head = NULL;
  881. Error *err = NULL;
  882. Visitor *v;
  883. v = visitor_input_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44, 'extra': 'ggg' } ]");
  884. visit_type_UserDefOneList(v, NULL, &head, &err);
  885. error_free_or_abort(&err);
  886. g_assert(!head);
  887. }
  888. static void test_visitor_in_fail_struct_missing(TestInputVisitorData *data,
  889. const void *unused)
  890. {
  891. Error *err = NULL;
  892. Visitor *v;
  893. QObject *any;
  894. GenericAlternate *alt;
  895. bool present;
  896. int en;
  897. int64_t i64;
  898. uint32_t u32;
  899. int8_t i8;
  900. char *str;
  901. double dbl;
  902. v = visitor_input_test_init(data, "{ 'sub': [ {} ] }");
  903. visit_start_struct(v, NULL, NULL, 0, &error_abort);
  904. visit_start_struct(v, "struct", NULL, 0, &err);
  905. error_free_or_abort(&err);
  906. visit_start_list(v, "list", NULL, 0, &err);
  907. error_free_or_abort(&err);
  908. visit_start_alternate(v, "alternate", &alt, sizeof(*alt), false, &err);
  909. error_free_or_abort(&err);
  910. visit_optional(v, "optional", &present);
  911. g_assert(!present);
  912. visit_type_enum(v, "enum", &en, EnumOne_lookup, &err);
  913. error_free_or_abort(&err);
  914. visit_type_int(v, "i64", &i64, &err);
  915. error_free_or_abort(&err);
  916. visit_type_uint32(v, "u32", &u32, &err);
  917. error_free_or_abort(&err);
  918. visit_type_int8(v, "i8", &i8, &err);
  919. error_free_or_abort(&err);
  920. visit_type_str(v, "i8", &str, &err);
  921. error_free_or_abort(&err);
  922. visit_type_number(v, "dbl", &dbl, &err);
  923. error_free_or_abort(&err);
  924. visit_type_any(v, "any", &any, &err);
  925. error_free_or_abort(&err);
  926. visit_type_null(v, "null", &err);
  927. error_free_or_abort(&err);
  928. visit_start_list(v, "sub", NULL, 0, &error_abort);
  929. visit_start_struct(v, NULL, NULL, 0, &error_abort);
  930. visit_type_int(v, "i64", &i64, &err);
  931. error_free_or_abort(&err);
  932. visit_end_struct(v, NULL);
  933. visit_end_list(v, NULL);
  934. visit_end_struct(v, NULL);
  935. }
  936. static void test_visitor_in_fail_list(TestInputVisitorData *data,
  937. const void *unused)
  938. {
  939. int64_t i64 = -1;
  940. Error *err = NULL;
  941. Visitor *v;
  942. /* Unvisited list tail */
  943. v = visitor_input_test_init(data, "[ 1, 2, 3 ]");
  944. visit_start_list(v, NULL, NULL, 0, &error_abort);
  945. visit_type_int(v, NULL, &i64, &error_abort);
  946. g_assert_cmpint(i64, ==, 1);
  947. visit_type_int(v, NULL, &i64, &error_abort);
  948. g_assert_cmpint(i64, ==, 2);
  949. visit_check_list(v, &err);
  950. error_free_or_abort(&err);
  951. visit_end_list(v, NULL);
  952. /* Visit beyond end of list */
  953. v = visitor_input_test_init(data, "[]");
  954. visit_start_list(v, NULL, NULL, 0, &error_abort);
  955. visit_type_int(v, NULL, &i64, &err);
  956. error_free_or_abort(&err);
  957. visit_end_list(v, NULL);
  958. }
  959. static void test_visitor_in_fail_list_nested(TestInputVisitorData *data,
  960. const void *unused)
  961. {
  962. int64_t i64 = -1;
  963. Error *err = NULL;
  964. Visitor *v;
  965. /* Unvisited nested list tail */
  966. v = visitor_input_test_init(data, "[ 0, [ 1, 2, 3 ] ]");
  967. visit_start_list(v, NULL, NULL, 0, &error_abort);
  968. visit_type_int(v, NULL, &i64, &error_abort);
  969. g_assert_cmpint(i64, ==, 0);
  970. visit_start_list(v, NULL, NULL, 0, &error_abort);
  971. visit_type_int(v, NULL, &i64, &error_abort);
  972. g_assert_cmpint(i64, ==, 1);
  973. visit_check_list(v, &err);
  974. error_free_or_abort(&err);
  975. visit_end_list(v, NULL);
  976. visit_check_list(v, &error_abort);
  977. visit_end_list(v, NULL);
  978. }
  979. static void test_visitor_in_fail_union_native_list(TestInputVisitorData *data,
  980. const void *unused)
  981. {
  982. UserDefNativeListUnion *tmp = NULL;
  983. Error *err = NULL;
  984. Visitor *v;
  985. v = visitor_input_test_init(data,
  986. "{ 'type': 'integer', 'data' : [ 'string' ] }");
  987. visit_type_UserDefNativeListUnion(v, NULL, &tmp, &err);
  988. error_free_or_abort(&err);
  989. g_assert(!tmp);
  990. }
  991. static void test_visitor_in_fail_union_flat(TestInputVisitorData *data,
  992. const void *unused)
  993. {
  994. UserDefFlatUnion *tmp = NULL;
  995. Error *err = NULL;
  996. Visitor *v;
  997. v = visitor_input_test_init(data, "{ 'string': 'c', 'integer': 41, 'boolean': true }");
  998. visit_type_UserDefFlatUnion(v, NULL, &tmp, &err);
  999. error_free_or_abort(&err);
  1000. g_assert(!tmp);
  1001. }
  1002. static void test_visitor_in_fail_union_flat_no_discrim(TestInputVisitorData *data,
  1003. const void *unused)
  1004. {
  1005. UserDefFlatUnion2 *tmp = NULL;
  1006. Error *err = NULL;
  1007. Visitor *v;
  1008. /* test situation where discriminator field ('enum1' here) is missing */
  1009. v = visitor_input_test_init(data, "{ 'integer': 42, 'string': 'c', 'string1': 'd', 'string2': 'e' }");
  1010. visit_type_UserDefFlatUnion2(v, NULL, &tmp, &err);
  1011. error_free_or_abort(&err);
  1012. g_assert(!tmp);
  1013. }
  1014. static void test_visitor_in_fail_alternate(TestInputVisitorData *data,
  1015. const void *unused)
  1016. {
  1017. UserDefAlternate *tmp;
  1018. Visitor *v;
  1019. Error *err = NULL;
  1020. v = visitor_input_test_init(data, "3.14");
  1021. visit_type_UserDefAlternate(v, NULL, &tmp, &err);
  1022. error_free_or_abort(&err);
  1023. g_assert(!tmp);
  1024. }
  1025. static void do_test_visitor_in_qmp_introspect(TestInputVisitorData *data,
  1026. const char *schema_json)
  1027. {
  1028. SchemaInfoList *schema = NULL;
  1029. Visitor *v;
  1030. v = visitor_input_test_init_raw(data, schema_json);
  1031. visit_type_SchemaInfoList(v, NULL, &schema, &error_abort);
  1032. g_assert(schema);
  1033. qapi_free_SchemaInfoList(schema);
  1034. }
  1035. static void test_visitor_in_qmp_introspect(TestInputVisitorData *data,
  1036. const void *unused)
  1037. {
  1038. do_test_visitor_in_qmp_introspect(data, test_qmp_schema_json);
  1039. do_test_visitor_in_qmp_introspect(data, qmp_schema_json);
  1040. }
  1041. int main(int argc, char **argv)
  1042. {
  1043. g_test_init(&argc, &argv, NULL);
  1044. input_visitor_test_add("/visitor/input/int",
  1045. NULL, test_visitor_in_int);
  1046. input_visitor_test_add("/visitor/input/uint",
  1047. NULL, test_visitor_in_uint);
  1048. input_visitor_test_add("/visitor/input/int_overflow",
  1049. NULL, test_visitor_in_int_overflow);
  1050. input_visitor_test_add("/visitor/input/int_keyval",
  1051. NULL, test_visitor_in_int_keyval);
  1052. input_visitor_test_add("/visitor/input/int_str_keyval",
  1053. NULL, test_visitor_in_int_str_keyval);
  1054. input_visitor_test_add("/visitor/input/int_str_fail",
  1055. NULL, test_visitor_in_int_str_fail);
  1056. input_visitor_test_add("/visitor/input/bool",
  1057. NULL, test_visitor_in_bool);
  1058. input_visitor_test_add("/visitor/input/bool_keyval",
  1059. NULL, test_visitor_in_bool_keyval);
  1060. input_visitor_test_add("/visitor/input/bool_str_keyval",
  1061. NULL, test_visitor_in_bool_str_keyval);
  1062. input_visitor_test_add("/visitor/input/bool_str_fail",
  1063. NULL, test_visitor_in_bool_str_fail);
  1064. input_visitor_test_add("/visitor/input/number",
  1065. NULL, test_visitor_in_number);
  1066. input_visitor_test_add("/visitor/input/number_keyval",
  1067. NULL, test_visitor_in_number_keyval);
  1068. input_visitor_test_add("/visitor/input/number_str_keyval",
  1069. NULL, test_visitor_in_number_str_keyval);
  1070. input_visitor_test_add("/visitor/input/number_str_fail",
  1071. NULL, test_visitor_in_number_str_fail);
  1072. input_visitor_test_add("/visitor/input/size_str_keyval",
  1073. NULL, test_visitor_in_size_str_keyval);
  1074. input_visitor_test_add("/visitor/input/size_str_fail",
  1075. NULL, test_visitor_in_size_str_fail);
  1076. input_visitor_test_add("/visitor/input/string",
  1077. NULL, test_visitor_in_string);
  1078. input_visitor_test_add("/visitor/input/enum",
  1079. NULL, test_visitor_in_enum);
  1080. input_visitor_test_add("/visitor/input/struct",
  1081. NULL, test_visitor_in_struct);
  1082. input_visitor_test_add("/visitor/input/struct-nested",
  1083. NULL, test_visitor_in_struct_nested);
  1084. input_visitor_test_add("/visitor/input/list",
  1085. NULL, test_visitor_in_list);
  1086. input_visitor_test_add("/visitor/input/any",
  1087. NULL, test_visitor_in_any);
  1088. input_visitor_test_add("/visitor/input/null",
  1089. NULL, test_visitor_in_null);
  1090. input_visitor_test_add("/visitor/input/union-flat",
  1091. NULL, test_visitor_in_union_flat);
  1092. input_visitor_test_add("/visitor/input/alternate",
  1093. NULL, test_visitor_in_alternate);
  1094. input_visitor_test_add("/visitor/input/errors",
  1095. NULL, test_visitor_in_errors);
  1096. input_visitor_test_add("/visitor/input/wrong-type",
  1097. NULL, test_visitor_in_wrong_type);
  1098. input_visitor_test_add("/visitor/input/alternate-number",
  1099. NULL, test_visitor_in_alternate_number);
  1100. input_visitor_test_add("/visitor/input/native_list/int",
  1101. NULL, test_visitor_in_native_list_int);
  1102. input_visitor_test_add("/visitor/input/native_list/int8",
  1103. NULL, test_visitor_in_native_list_int8);
  1104. input_visitor_test_add("/visitor/input/native_list/int16",
  1105. NULL, test_visitor_in_native_list_int16);
  1106. input_visitor_test_add("/visitor/input/native_list/int32",
  1107. NULL, test_visitor_in_native_list_int32);
  1108. input_visitor_test_add("/visitor/input/native_list/int64",
  1109. NULL, test_visitor_in_native_list_int64);
  1110. input_visitor_test_add("/visitor/input/native_list/uint8",
  1111. NULL, test_visitor_in_native_list_uint8);
  1112. input_visitor_test_add("/visitor/input/native_list/uint16",
  1113. NULL, test_visitor_in_native_list_uint16);
  1114. input_visitor_test_add("/visitor/input/native_list/uint32",
  1115. NULL, test_visitor_in_native_list_uint32);
  1116. input_visitor_test_add("/visitor/input/native_list/uint64",
  1117. NULL, test_visitor_in_native_list_uint64);
  1118. input_visitor_test_add("/visitor/input/native_list/bool",
  1119. NULL, test_visitor_in_native_list_bool);
  1120. input_visitor_test_add("/visitor/input/native_list/str",
  1121. NULL, test_visitor_in_native_list_string);
  1122. input_visitor_test_add("/visitor/input/native_list/number",
  1123. NULL, test_visitor_in_native_list_number);
  1124. input_visitor_test_add("/visitor/input/fail/struct",
  1125. NULL, test_visitor_in_fail_struct);
  1126. input_visitor_test_add("/visitor/input/fail/struct-nested",
  1127. NULL, test_visitor_in_fail_struct_nested);
  1128. input_visitor_test_add("/visitor/input/fail/struct-in-list",
  1129. NULL, test_visitor_in_fail_struct_in_list);
  1130. input_visitor_test_add("/visitor/input/fail/struct-missing",
  1131. NULL, test_visitor_in_fail_struct_missing);
  1132. input_visitor_test_add("/visitor/input/fail/list",
  1133. NULL, test_visitor_in_fail_list);
  1134. input_visitor_test_add("/visitor/input/fail/list-nested",
  1135. NULL, test_visitor_in_fail_list_nested);
  1136. input_visitor_test_add("/visitor/input/fail/union-flat",
  1137. NULL, test_visitor_in_fail_union_flat);
  1138. input_visitor_test_add("/visitor/input/fail/union-flat-no-discriminator",
  1139. NULL, test_visitor_in_fail_union_flat_no_discrim);
  1140. input_visitor_test_add("/visitor/input/fail/alternate",
  1141. NULL, test_visitor_in_fail_alternate);
  1142. input_visitor_test_add("/visitor/input/fail/union-native-list",
  1143. NULL, test_visitor_in_fail_union_native_list);
  1144. input_visitor_test_add("/visitor/input/qmp-introspect",
  1145. NULL, test_visitor_in_qmp_introspect);
  1146. g_test_run();
  1147. return 0;
  1148. }