test-string-output-visitor.c 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277
  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-qobject-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 "qemu/osdep.h"
  13. #include "qemu-common.h"
  14. #include "qapi/error.h"
  15. #include "qapi/string-output-visitor.h"
  16. #include "test-qapi-visit.h"
  17. typedef struct TestOutputVisitorData {
  18. Visitor *ov;
  19. char *str;
  20. bool human;
  21. } TestOutputVisitorData;
  22. static void visitor_output_setup_internal(TestOutputVisitorData *data,
  23. bool human)
  24. {
  25. data->human = human;
  26. data->ov = string_output_visitor_new(human, &data->str);
  27. g_assert(data->ov);
  28. }
  29. static void visitor_output_setup(TestOutputVisitorData *data,
  30. const void *unused)
  31. {
  32. return visitor_output_setup_internal(data, false);
  33. }
  34. static void visitor_output_setup_human(TestOutputVisitorData *data,
  35. const void *unused)
  36. {
  37. return visitor_output_setup_internal(data, true);
  38. }
  39. static void visitor_output_teardown(TestOutputVisitorData *data,
  40. const void *unused)
  41. {
  42. visit_free(data->ov);
  43. data->ov = NULL;
  44. g_free(data->str);
  45. data->str = NULL;
  46. }
  47. static char *visitor_get(TestOutputVisitorData *data)
  48. {
  49. visit_complete(data->ov, &data->str);
  50. g_assert(data->str);
  51. return data->str;
  52. }
  53. static void visitor_reset(TestOutputVisitorData *data)
  54. {
  55. bool human = data->human;
  56. visitor_output_teardown(data, NULL);
  57. visitor_output_setup_internal(data, human);
  58. }
  59. static void test_visitor_out_int(TestOutputVisitorData *data,
  60. const void *unused)
  61. {
  62. int64_t value = 42;
  63. Error *err = NULL;
  64. char *str;
  65. visit_type_int(data->ov, NULL, &value, &err);
  66. g_assert(!err);
  67. str = visitor_get(data);
  68. if (data->human) {
  69. g_assert_cmpstr(str, ==, "42 (0x2a)");
  70. } else {
  71. g_assert_cmpstr(str, ==, "42");
  72. }
  73. }
  74. static void test_visitor_out_intList(TestOutputVisitorData *data,
  75. const void *unused)
  76. {
  77. int64_t value[] = {0, 1, 9, 10, 16, 15, 14,
  78. 3, 4, 5, 6, 11, 12, 13, 21, 22, INT64_MAX - 1, INT64_MAX};
  79. intList *list = NULL, **tmp = &list;
  80. int i;
  81. Error *err = NULL;
  82. char *str;
  83. for (i = 0; i < ARRAY_SIZE(value); i++) {
  84. *tmp = g_malloc0(sizeof(**tmp));
  85. (*tmp)->value = value[i];
  86. tmp = &(*tmp)->next;
  87. }
  88. visit_type_intList(data->ov, NULL, &list, &err);
  89. g_assert(err == NULL);
  90. str = visitor_get(data);
  91. if (data->human) {
  92. g_assert_cmpstr(str, ==,
  93. "0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807 "
  94. "(0x0-0x1,0x3-0x6,0x9-0x10,0x15-0x16,"
  95. "0x7ffffffffffffffe-0x7fffffffffffffff)");
  96. } else {
  97. g_assert_cmpstr(str, ==,
  98. "0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807");
  99. }
  100. qapi_free_intList(list);
  101. }
  102. static void test_visitor_out_bool(TestOutputVisitorData *data,
  103. const void *unused)
  104. {
  105. Error *err = NULL;
  106. bool value = true;
  107. char *str;
  108. visit_type_bool(data->ov, NULL, &value, &err);
  109. g_assert(!err);
  110. str = visitor_get(data);
  111. g_assert_cmpstr(str, ==, "true");
  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, NULL, &value, &err);
  120. g_assert(!err);
  121. str = visitor_get(data);
  122. g_assert_cmpstr(str, ==, "3.140000");
  123. }
  124. static void test_visitor_out_string(TestOutputVisitorData *data,
  125. const void *unused)
  126. {
  127. char *string = (char *) "Q E M U";
  128. const char *string_human = "\"Q E M U\"";
  129. Error *err = NULL;
  130. char *str;
  131. visit_type_str(data->ov, NULL, &string, &err);
  132. g_assert(!err);
  133. str = visitor_get(data);
  134. if (data->human) {
  135. g_assert_cmpstr(str, ==, string_human);
  136. } else {
  137. g_assert_cmpstr(str, ==, string);
  138. }
  139. }
  140. static void test_visitor_out_no_string(TestOutputVisitorData *data,
  141. const void *unused)
  142. {
  143. char *string = NULL;
  144. char *str;
  145. /* A null string should return "" */
  146. visit_type_str(data->ov, NULL, &string, &error_abort);
  147. str = visitor_get(data);
  148. if (data->human) {
  149. g_assert_cmpstr(str, ==, "<null>");
  150. } else {
  151. g_assert_cmpstr(str, ==, "");
  152. }
  153. }
  154. static void test_visitor_out_enum(TestOutputVisitorData *data,
  155. const void *unused)
  156. {
  157. char *str;
  158. EnumOne i;
  159. for (i = 0; i < ENUM_ONE__MAX; i++) {
  160. visit_type_EnumOne(data->ov, "unused", &i, &error_abort);
  161. str = visitor_get(data);
  162. if (data->human) {
  163. char *str_human = g_strdup_printf("\"%s\"", EnumOne_str(i));
  164. g_assert_cmpstr(str, ==, str_human);
  165. g_free(str_human);
  166. } else {
  167. g_assert_cmpstr(str, ==, EnumOne_str(i));
  168. }
  169. visitor_reset(data);
  170. }
  171. }
  172. static void test_visitor_out_enum_errors(TestOutputVisitorData *data,
  173. const void *unused)
  174. {
  175. EnumOne i, bad_values[] = { ENUM_ONE__MAX, -1 };
  176. Error *err;
  177. for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) {
  178. err = NULL;
  179. visit_type_EnumOne(data->ov, "unused", &bad_values[i], &err);
  180. error_free_or_abort(&err);
  181. }
  182. }
  183. static void
  184. output_visitor_test_add(const char *testpath,
  185. TestOutputVisitorData *data,
  186. void (*test_func)(TestOutputVisitorData *data,
  187. const void *user_data),
  188. bool human)
  189. {
  190. g_test_add(testpath, TestOutputVisitorData, data,
  191. human ? visitor_output_setup_human : visitor_output_setup,
  192. test_func, visitor_output_teardown);
  193. }
  194. int main(int argc, char **argv)
  195. {
  196. TestOutputVisitorData out_visitor_data;
  197. g_test_init(&argc, &argv, NULL);
  198. output_visitor_test_add("/string-visitor/output/int",
  199. &out_visitor_data, test_visitor_out_int, false);
  200. output_visitor_test_add("/string-visitor/output/int-human",
  201. &out_visitor_data, test_visitor_out_int, true);
  202. output_visitor_test_add("/string-visitor/output/bool",
  203. &out_visitor_data, test_visitor_out_bool, false);
  204. output_visitor_test_add("/string-visitor/output/bool-human",
  205. &out_visitor_data, test_visitor_out_bool, true);
  206. output_visitor_test_add("/string-visitor/output/number",
  207. &out_visitor_data, test_visitor_out_number, false);
  208. output_visitor_test_add("/string-visitor/output/number-human",
  209. &out_visitor_data, test_visitor_out_number, true);
  210. output_visitor_test_add("/string-visitor/output/string",
  211. &out_visitor_data, test_visitor_out_string, false);
  212. output_visitor_test_add("/string-visitor/output/string-human",
  213. &out_visitor_data, test_visitor_out_string, true);
  214. output_visitor_test_add("/string-visitor/output/no-string",
  215. &out_visitor_data, test_visitor_out_no_string,
  216. false);
  217. output_visitor_test_add("/string-visitor/output/no-string-human",
  218. &out_visitor_data, test_visitor_out_no_string,
  219. true);
  220. output_visitor_test_add("/string-visitor/output/enum",
  221. &out_visitor_data, test_visitor_out_enum, false);
  222. output_visitor_test_add("/string-visitor/output/enum-human",
  223. &out_visitor_data, test_visitor_out_enum, true);
  224. output_visitor_test_add("/string-visitor/output/enum-errors",
  225. &out_visitor_data, test_visitor_out_enum_errors,
  226. false);
  227. output_visitor_test_add("/string-visitor/output/enum-errors-human",
  228. &out_visitor_data, test_visitor_out_enum_errors,
  229. true);
  230. output_visitor_test_add("/string-visitor/output/intList",
  231. &out_visitor_data, test_visitor_out_intList, false);
  232. output_visitor_test_add("/string-visitor/output/intList-human",
  233. &out_visitor_data, test_visitor_out_intList, true);
  234. g_test_run();
  235. return 0;
  236. }