test-string-output-visitor.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. /*
  2. * String Output Visitor unit-tests.
  3. *
  4. * Copyright (C) 2012 Red Hat Inc.
  5. *
  6. * Authors:
  7. * Paolo Bonzini <pbonzini@redhat.com> (based on test-qmp-output-visitor)
  8. *
  9. * This work is licensed under the terms of the GNU GPL, version 2 or later.
  10. * See the COPYING file in the top-level directory.
  11. */
  12. #include <glib.h>
  13. #include "qemu-common.h"
  14. #include "qapi/string-output-visitor.h"
  15. #include "test-qapi-types.h"
  16. #include "test-qapi-visit.h"
  17. #include "qapi/qmp/types.h"
  18. typedef struct TestOutputVisitorData {
  19. StringOutputVisitor *sov;
  20. Visitor *ov;
  21. bool human;
  22. } TestOutputVisitorData;
  23. static void visitor_output_setup(TestOutputVisitorData *data,
  24. const void *unused)
  25. {
  26. data->human = false;
  27. data->sov = string_output_visitor_new(data->human);
  28. g_assert(data->sov != NULL);
  29. data->ov = string_output_get_visitor(data->sov);
  30. g_assert(data->ov != NULL);
  31. }
  32. static void visitor_output_setup_human(TestOutputVisitorData *data,
  33. const void *unused)
  34. {
  35. data->human = true;
  36. data->sov = string_output_visitor_new(data->human);
  37. g_assert(data->sov != NULL);
  38. data->ov = string_output_get_visitor(data->sov);
  39. g_assert(data->ov != NULL);
  40. }
  41. static void visitor_output_teardown(TestOutputVisitorData *data,
  42. const void *unused)
  43. {
  44. string_output_visitor_cleanup(data->sov);
  45. data->sov = NULL;
  46. data->ov = NULL;
  47. }
  48. static void test_visitor_out_int(TestOutputVisitorData *data,
  49. const void *unused)
  50. {
  51. int64_t value = 42;
  52. Error *err = NULL;
  53. char *str;
  54. visit_type_int(data->ov, &value, NULL, &err);
  55. g_assert(!err);
  56. str = string_output_get_string(data->sov);
  57. g_assert(str != NULL);
  58. if (data->human) {
  59. g_assert_cmpstr(str, ==, "42 (0x2a)");
  60. } else {
  61. g_assert_cmpstr(str, ==, "42");
  62. }
  63. g_free(str);
  64. }
  65. static void test_visitor_out_intList(TestOutputVisitorData *data,
  66. const void *unused)
  67. {
  68. int64_t value[] = {0, 1, 9, 10, 16, 15, 14,
  69. 3, 4, 5, 6, 11, 12, 13, 21, 22, INT64_MAX - 1, INT64_MAX};
  70. intList *list = NULL, **tmp = &list;
  71. int i;
  72. Error *errp = NULL;
  73. char *str;
  74. for (i = 0; i < sizeof(value) / sizeof(value[0]); i++) {
  75. *tmp = g_malloc0(sizeof(**tmp));
  76. (*tmp)->value = value[i];
  77. tmp = &(*tmp)->next;
  78. }
  79. visit_type_intList(data->ov, &list, NULL, &errp);
  80. g_assert(errp == NULL);
  81. str = string_output_get_string(data->sov);
  82. g_assert(str != NULL);
  83. if (data->human) {
  84. g_assert_cmpstr(str, ==,
  85. "0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807 "
  86. "(0x0-0x1,0x3-0x6,0x9-0x10,0x15-0x16,"
  87. "0x7ffffffffffffffe-0x7fffffffffffffff)");
  88. } else {
  89. g_assert_cmpstr(str, ==,
  90. "0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807");
  91. }
  92. g_free(str);
  93. while (list) {
  94. intList *tmp2;
  95. tmp2 = list->next;
  96. g_free(list);
  97. list = tmp2;
  98. }
  99. }
  100. static void test_visitor_out_bool(TestOutputVisitorData *data,
  101. const void *unused)
  102. {
  103. Error *err = NULL;
  104. bool value = true;
  105. char *str;
  106. visit_type_bool(data->ov, &value, NULL, &err);
  107. g_assert(!err);
  108. str = string_output_get_string(data->sov);
  109. g_assert(str != NULL);
  110. g_assert_cmpstr(str, ==, "true");
  111. g_free(str);
  112. }
  113. static void test_visitor_out_number(TestOutputVisitorData *data,
  114. const void *unused)
  115. {
  116. double value = 3.14;
  117. Error *err = NULL;
  118. char *str;
  119. visit_type_number(data->ov, &value, NULL, &err);
  120. g_assert(!err);
  121. str = string_output_get_string(data->sov);
  122. g_assert(str != NULL);
  123. g_assert_cmpstr(str, ==, "3.140000");
  124. g_free(str);
  125. }
  126. static void test_visitor_out_string(TestOutputVisitorData *data,
  127. const void *unused)
  128. {
  129. char *string = (char *) "Q E M U";
  130. const char *string_human = "\"Q E M U\"";
  131. Error *err = NULL;
  132. char *str;
  133. visit_type_str(data->ov, &string, NULL, &err);
  134. g_assert(!err);
  135. str = string_output_get_string(data->sov);
  136. g_assert(str != NULL);
  137. if (data->human) {
  138. g_assert_cmpstr(str, ==, string_human);
  139. } else {
  140. g_assert_cmpstr(str, ==, string);
  141. }
  142. g_free(str);
  143. }
  144. static void test_visitor_out_no_string(TestOutputVisitorData *data,
  145. const void *unused)
  146. {
  147. char *string = NULL;
  148. Error *err = NULL;
  149. char *str;
  150. /* A null string should return "" */
  151. visit_type_str(data->ov, &string, NULL, &err);
  152. g_assert(!err);
  153. str = string_output_get_string(data->sov);
  154. g_assert(str != NULL);
  155. if (data->human) {
  156. g_assert_cmpstr(str, ==, "<null>");
  157. } else {
  158. g_assert_cmpstr(str, ==, "");
  159. }
  160. g_free(str);
  161. }
  162. static void test_visitor_out_enum(TestOutputVisitorData *data,
  163. const void *unused)
  164. {
  165. Error *err = NULL;
  166. char *str;
  167. EnumOne i;
  168. for (i = 0; i < ENUM_ONE__MAX; i++) {
  169. char *str_human;
  170. visit_type_EnumOne(data->ov, &i, "unused", &err);
  171. g_assert(!err);
  172. str_human = g_strdup_printf("\"%s\"", EnumOne_lookup[i]);
  173. str = string_output_get_string(data->sov);
  174. g_assert(str != NULL);
  175. if (data->human) {
  176. g_assert_cmpstr(str, ==, str_human);
  177. } else {
  178. g_assert_cmpstr(str, ==, EnumOne_lookup[i]);
  179. }
  180. g_free(str_human);
  181. g_free(str);
  182. }
  183. }
  184. static void test_visitor_out_enum_errors(TestOutputVisitorData *data,
  185. const void *unused)
  186. {
  187. EnumOne i, bad_values[] = { ENUM_ONE__MAX, -1 };
  188. Error *err;
  189. for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) {
  190. err = NULL;
  191. visit_type_EnumOne(data->ov, &bad_values[i], "unused", &err);
  192. g_assert(err);
  193. error_free(err);
  194. }
  195. }
  196. static void
  197. output_visitor_test_add(const char *testpath,
  198. TestOutputVisitorData *data,
  199. void (*test_func)(TestOutputVisitorData *data,
  200. const void *user_data),
  201. bool human)
  202. {
  203. g_test_add(testpath, TestOutputVisitorData, data,
  204. human ? visitor_output_setup_human : visitor_output_setup,
  205. test_func, visitor_output_teardown);
  206. }
  207. int main(int argc, char **argv)
  208. {
  209. TestOutputVisitorData out_visitor_data;
  210. g_test_init(&argc, &argv, NULL);
  211. output_visitor_test_add("/string-visitor/output/int",
  212. &out_visitor_data, test_visitor_out_int, false);
  213. output_visitor_test_add("/string-visitor/output/int-human",
  214. &out_visitor_data, test_visitor_out_int, true);
  215. output_visitor_test_add("/string-visitor/output/bool",
  216. &out_visitor_data, test_visitor_out_bool, false);
  217. output_visitor_test_add("/string-visitor/output/bool-human",
  218. &out_visitor_data, test_visitor_out_bool, true);
  219. output_visitor_test_add("/string-visitor/output/number",
  220. &out_visitor_data, test_visitor_out_number, false);
  221. output_visitor_test_add("/string-visitor/output/number-human",
  222. &out_visitor_data, test_visitor_out_number, true);
  223. output_visitor_test_add("/string-visitor/output/string",
  224. &out_visitor_data, test_visitor_out_string, false);
  225. output_visitor_test_add("/string-visitor/output/string-human",
  226. &out_visitor_data, test_visitor_out_string, true);
  227. output_visitor_test_add("/string-visitor/output/no-string",
  228. &out_visitor_data, test_visitor_out_no_string,
  229. false);
  230. output_visitor_test_add("/string-visitor/output/no-string-human",
  231. &out_visitor_data, test_visitor_out_no_string,
  232. true);
  233. output_visitor_test_add("/string-visitor/output/enum",
  234. &out_visitor_data, test_visitor_out_enum, false);
  235. output_visitor_test_add("/string-visitor/output/enum-human",
  236. &out_visitor_data, test_visitor_out_enum, true);
  237. output_visitor_test_add("/string-visitor/output/enum-errors",
  238. &out_visitor_data, test_visitor_out_enum_errors,
  239. false);
  240. output_visitor_test_add("/string-visitor/output/enum-errors-human",
  241. &out_visitor_data, test_visitor_out_enum_errors,
  242. true);
  243. output_visitor_test_add("/string-visitor/output/intList",
  244. &out_visitor_data, test_visitor_out_intList, false);
  245. output_visitor_test_add("/string-visitor/output/intList-human",
  246. &out_visitor_data, test_visitor_out_intList, true);
  247. g_test_run();
  248. return 0;
  249. }