test-string-output-visitor.c 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. } TestOutputVisitorData;
  22. static void visitor_output_setup(TestOutputVisitorData *data,
  23. const void *unused)
  24. {
  25. data->sov = string_output_visitor_new();
  26. g_assert(data->sov != NULL);
  27. data->ov = string_output_get_visitor(data->sov);
  28. g_assert(data->ov != NULL);
  29. }
  30. static void visitor_output_teardown(TestOutputVisitorData *data,
  31. const void *unused)
  32. {
  33. string_output_visitor_cleanup(data->sov);
  34. data->sov = NULL;
  35. data->ov = NULL;
  36. }
  37. static void test_visitor_out_int(TestOutputVisitorData *data,
  38. const void *unused)
  39. {
  40. int64_t value = -42;
  41. Error *errp = NULL;
  42. char *str;
  43. visit_type_int(data->ov, &value, NULL, &errp);
  44. g_assert(!errp);
  45. str = string_output_get_string(data->sov);
  46. g_assert(str != NULL);
  47. g_assert_cmpstr(str, ==, "-42");
  48. g_free(str);
  49. }
  50. static void test_visitor_out_bool(TestOutputVisitorData *data,
  51. const void *unused)
  52. {
  53. Error *errp = NULL;
  54. bool value = true;
  55. char *str;
  56. visit_type_bool(data->ov, &value, NULL, &errp);
  57. g_assert(!errp);
  58. str = string_output_get_string(data->sov);
  59. g_assert(str != NULL);
  60. g_assert_cmpstr(str, ==, "true");
  61. g_free(str);
  62. }
  63. static void test_visitor_out_number(TestOutputVisitorData *data,
  64. const void *unused)
  65. {
  66. double value = 3.14;
  67. Error *errp = NULL;
  68. char *str;
  69. visit_type_number(data->ov, &value, NULL, &errp);
  70. g_assert(!errp);
  71. str = string_output_get_string(data->sov);
  72. g_assert(str != NULL);
  73. g_assert_cmpstr(str, ==, "3.140000");
  74. g_free(str);
  75. }
  76. static void test_visitor_out_string(TestOutputVisitorData *data,
  77. const void *unused)
  78. {
  79. char *string = (char *) "Q E M U";
  80. Error *errp = NULL;
  81. char *str;
  82. visit_type_str(data->ov, &string, NULL, &errp);
  83. g_assert(!errp);
  84. str = string_output_get_string(data->sov);
  85. g_assert(str != NULL);
  86. g_assert_cmpstr(str, ==, string);
  87. g_free(str);
  88. }
  89. static void test_visitor_out_no_string(TestOutputVisitorData *data,
  90. const void *unused)
  91. {
  92. char *string = NULL;
  93. Error *errp = NULL;
  94. char *str;
  95. /* A null string should return "" */
  96. visit_type_str(data->ov, &string, NULL, &errp);
  97. g_assert(!errp);
  98. str = string_output_get_string(data->sov);
  99. g_assert(str != NULL);
  100. g_assert_cmpstr(str, ==, "");
  101. g_free(str);
  102. }
  103. static void test_visitor_out_enum(TestOutputVisitorData *data,
  104. const void *unused)
  105. {
  106. Error *errp = NULL;
  107. char *str;
  108. EnumOne i;
  109. for (i = 0; i < ENUM_ONE_MAX; i++) {
  110. visit_type_EnumOne(data->ov, &i, "unused", &errp);
  111. g_assert(!errp);
  112. str = string_output_get_string(data->sov);
  113. g_assert(str != NULL);
  114. g_assert_cmpstr(str, ==, EnumOne_lookup[i]);
  115. g_free(str);
  116. }
  117. }
  118. static void test_visitor_out_enum_errors(TestOutputVisitorData *data,
  119. const void *unused)
  120. {
  121. EnumOne i, bad_values[] = { ENUM_ONE_MAX, -1 };
  122. Error *errp;
  123. for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) {
  124. errp = NULL;
  125. visit_type_EnumOne(data->ov, &bad_values[i], "unused", &errp);
  126. g_assert(errp);
  127. error_free(errp);
  128. }
  129. }
  130. static void output_visitor_test_add(const char *testpath,
  131. TestOutputVisitorData *data,
  132. void (*test_func)(TestOutputVisitorData *data, const void *user_data))
  133. {
  134. g_test_add(testpath, TestOutputVisitorData, data, visitor_output_setup,
  135. test_func, visitor_output_teardown);
  136. }
  137. int main(int argc, char **argv)
  138. {
  139. TestOutputVisitorData out_visitor_data;
  140. g_test_init(&argc, &argv, NULL);
  141. output_visitor_test_add("/string-visitor/output/int",
  142. &out_visitor_data, test_visitor_out_int);
  143. output_visitor_test_add("/string-visitor/output/bool",
  144. &out_visitor_data, test_visitor_out_bool);
  145. output_visitor_test_add("/string-visitor/output/number",
  146. &out_visitor_data, test_visitor_out_number);
  147. output_visitor_test_add("/string-visitor/output/string",
  148. &out_visitor_data, test_visitor_out_string);
  149. output_visitor_test_add("/string-visitor/output/no-string",
  150. &out_visitor_data, test_visitor_out_no_string);
  151. output_visitor_test_add("/string-visitor/output/enum",
  152. &out_visitor_data, test_visitor_out_enum);
  153. output_visitor_test_add("/string-visitor/output/enum-errors",
  154. &out_visitor_data, test_visitor_out_enum_errors);
  155. g_test_run();
  156. return 0;
  157. }