2
0

test-qmp-commands.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include <glib.h>
  2. #include "qemu-objects.h"
  3. #include "test-qmp-commands.h"
  4. #include "qapi/qmp-core.h"
  5. #include "module.h"
  6. void qmp_user_def_cmd(Error **errp)
  7. {
  8. }
  9. void qmp_user_def_cmd1(UserDefOne * ud1, Error **errp)
  10. {
  11. }
  12. UserDefTwo * qmp_user_def_cmd2(UserDefOne * ud1a, UserDefOne * ud1b, Error **errp)
  13. {
  14. UserDefTwo *ret;
  15. UserDefOne *ud1c = g_malloc0(sizeof(UserDefOne));
  16. UserDefOne *ud1d = g_malloc0(sizeof(UserDefOne));
  17. ud1c->string = strdup(ud1a->string);
  18. ud1c->integer = ud1a->integer;
  19. ud1d->string = strdup(ud1b->string);
  20. ud1d->integer = ud1b->integer;
  21. ret = g_malloc0(sizeof(UserDefTwo));
  22. ret->string = strdup("blah1");
  23. ret->dict.string = strdup("blah2");
  24. ret->dict.dict.userdef = ud1c;
  25. ret->dict.dict.string = strdup("blah3");
  26. ret->dict.has_dict2 = true;
  27. ret->dict.dict2.userdef = ud1d;
  28. ret->dict.dict2.string = strdup("blah4");
  29. return ret;
  30. }
  31. /* test commands with no input and no return value */
  32. static void test_dispatch_cmd(void)
  33. {
  34. QDict *req = qdict_new();
  35. QObject *resp;
  36. qdict_put_obj(req, "execute", QOBJECT(qstring_from_str("user_def_cmd")));
  37. resp = qmp_dispatch(QOBJECT(req));
  38. assert(resp != NULL);
  39. assert(!qdict_haskey(qobject_to_qdict(resp), "error"));
  40. g_print("\nresp: %s\n", qstring_get_str(qobject_to_json(resp)));
  41. qobject_decref(resp);
  42. QDECREF(req);
  43. }
  44. /* test commands that return an error due to invalid parameters */
  45. static void test_dispatch_cmd_error(void)
  46. {
  47. QDict *req = qdict_new();
  48. QObject *resp;
  49. qdict_put_obj(req, "execute", QOBJECT(qstring_from_str("user_def_cmd2")));
  50. resp = qmp_dispatch(QOBJECT(req));
  51. assert(resp != NULL);
  52. assert(qdict_haskey(qobject_to_qdict(resp), "error"));
  53. g_print("\nresp: %s\n", qstring_get_str(qobject_to_json_pretty(resp)));
  54. qobject_decref(resp);
  55. QDECREF(req);
  56. }
  57. /* test commands that involve both input parameters and return values */
  58. static void test_dispatch_cmd_io(void)
  59. {
  60. QDict *req = qdict_new();
  61. QDict *args = qdict_new();
  62. QDict *ud1a = qdict_new();
  63. QDict *ud1b = qdict_new();
  64. QObject *resp;
  65. qdict_put_obj(ud1a, "integer", QOBJECT(qint_from_int(42)));
  66. qdict_put_obj(ud1a, "string", QOBJECT(qstring_from_str("hello")));
  67. qdict_put_obj(ud1b, "integer", QOBJECT(qint_from_int(422)));
  68. qdict_put_obj(ud1b, "string", QOBJECT(qstring_from_str("hello2")));
  69. qdict_put_obj(args, "ud1a", QOBJECT(ud1a));
  70. qdict_put_obj(args, "ud1b", QOBJECT(ud1b));
  71. qdict_put_obj(req, "arguments", QOBJECT(args));
  72. qdict_put_obj(req, "execute", QOBJECT(qstring_from_str("user_def_cmd2")));
  73. /* TODO: put in full payload and check for errors */
  74. resp = qmp_dispatch(QOBJECT(req));
  75. assert(resp != NULL);
  76. assert(!qdict_haskey(qobject_to_qdict(resp), "error"));
  77. g_print("\nresp: %s\n", qstring_get_str(qobject_to_json_pretty(resp)));
  78. qobject_decref(resp);
  79. QDECREF(req);
  80. }
  81. /* test generated dealloc functions for generated types */
  82. static void test_dealloc_types(void)
  83. {
  84. UserDefOne *ud1test, *ud1a, *ud1b;
  85. UserDefOneList *ud1list;
  86. ud1test = g_malloc0(sizeof(UserDefOne));
  87. ud1test->integer = 42;
  88. ud1test->string = g_strdup("hi there 42");
  89. qapi_free_UserDefOne(ud1test);
  90. ud1a = g_malloc0(sizeof(UserDefOne));
  91. ud1a->integer = 43;
  92. ud1a->string = g_strdup("hi there 43");
  93. ud1b = g_malloc0(sizeof(UserDefOne));
  94. ud1b->integer = 44;
  95. ud1b->string = g_strdup("hi there 44");
  96. ud1list = g_malloc0(sizeof(UserDefOneList));
  97. ud1list->value = ud1a;
  98. ud1list->next = g_malloc0(sizeof(UserDefOneList));
  99. ud1list->next->value = ud1b;
  100. qapi_free_UserDefOneList(ud1list);
  101. }
  102. int main(int argc, char **argv)
  103. {
  104. g_test_init(&argc, &argv, NULL);
  105. g_test_add_func("/0.15/dispatch_cmd", test_dispatch_cmd);
  106. g_test_add_func("/0.15/dispatch_cmd_error", test_dispatch_cmd_error);
  107. g_test_add_func("/0.15/dispatch_cmd_io", test_dispatch_cmd_io);
  108. g_test_add_func("/0.15/dealloc_types", test_dealloc_types);
  109. module_call_init(MODULE_INIT_QAPI);
  110. g_test_run();
  111. return 0;
  112. }