test-qobject-input-visitor.c 46 KB

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