]> git.proxmox.com Git - mirror_qemu.git/blame - tests/unit/test-string-output-visitor.c
Remove qemu-common.h include from most units
[mirror_qemu.git] / tests / unit / test-string-output-visitor.c
CommitLineData
2d7799f2
PB
1/*
2 * String Output Visitor unit-tests.
3 *
4 * Copyright (C) 2012 Red Hat Inc.
5 *
6 * Authors:
b3db211f 7 * Paolo Bonzini <pbonzini@redhat.com> (based on test-qobject-output-visitor)
2d7799f2
PB
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
681c28a3 13#include "qemu/osdep.h"
2d7799f2 14
da34e65c 15#include "qapi/error.h"
2d7799f2 16#include "qapi/string-output-visitor.h"
2d7799f2 17#include "test-qapi-visit.h"
2d7799f2
PB
18
19typedef struct TestOutputVisitorData {
2d7799f2 20 Visitor *ov;
23d1705f 21 char *str;
b4900c0e 22 bool human;
2d7799f2
PB
23} TestOutputVisitorData;
24
a8fff94d
EB
25static void visitor_output_setup_internal(TestOutputVisitorData *data,
26 bool human)
27{
28 data->human = human;
3b098d56 29 data->ov = string_output_visitor_new(human, &data->str);
a8fff94d
EB
30 g_assert(data->ov);
31}
32
2d7799f2
PB
33static void visitor_output_setup(TestOutputVisitorData *data,
34 const void *unused)
35{
a8fff94d 36 return visitor_output_setup_internal(data, false);
b4900c0e
HT
37}
38
39static void visitor_output_setup_human(TestOutputVisitorData *data,
40 const void *unused)
41{
a8fff94d 42 return visitor_output_setup_internal(data, true);
2d7799f2
PB
43}
44
45static void visitor_output_teardown(TestOutputVisitorData *data,
46 const void *unused)
47{
e7ca5656 48 visit_free(data->ov);
2d7799f2 49 data->ov = NULL;
23d1705f
EB
50 g_free(data->str);
51 data->str = NULL;
52}
53
54static char *visitor_get(TestOutputVisitorData *data)
55{
3b098d56 56 visit_complete(data->ov, &data->str);
23d1705f
EB
57 g_assert(data->str);
58 return data->str;
2d7799f2
PB
59}
60
a8fff94d
EB
61static void visitor_reset(TestOutputVisitorData *data)
62{
63 bool human = data->human;
64
65 visitor_output_teardown(data, NULL);
66 visitor_output_setup_internal(data, human);
67}
68
2d7799f2
PB
69static void test_visitor_out_int(TestOutputVisitorData *data,
70 const void *unused)
71{
69e25563 72 int64_t value = 42;
2d7799f2
PB
73 char *str;
74
d8da9e71 75 visit_type_int(data->ov, NULL, &value, &error_abort);
2d7799f2 76
23d1705f 77 str = visitor_get(data);
b4900c0e
HT
78 if (data->human) {
79 g_assert_cmpstr(str, ==, "42 (0x2a)");
80 } else {
81 g_assert_cmpstr(str, ==, "42");
82 }
2d7799f2
PB
83}
84
69e25563
HT
85static void test_visitor_out_intList(TestOutputVisitorData *data,
86 const void *unused)
87{
88 int64_t value[] = {0, 1, 9, 10, 16, 15, 14,
89 3, 4, 5, 6, 11, 12, 13, 21, 22, INT64_MAX - 1, INT64_MAX};
c3033fd3 90 intList *list = NULL, **tail = &list;
69e25563 91 int i;
533fdaed 92 Error *err = NULL;
69e25563
HT
93 char *str;
94
d40d74a6 95 for (i = 0; i < ARRAY_SIZE(value); i++) {
c3033fd3 96 QAPI_LIST_APPEND(tail, value[i]);
69e25563
HT
97 }
98
51e72bc1 99 visit_type_intList(data->ov, NULL, &list, &err);
533fdaed 100 g_assert(err == NULL);
69e25563 101
23d1705f 102 str = visitor_get(data);
b4900c0e
HT
103 if (data->human) {
104 g_assert_cmpstr(str, ==,
105 "0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807 "
106 "(0x0-0x1,0x3-0x6,0x9-0x10,0x15-0x16,"
107 "0x7ffffffffffffffe-0x7fffffffffffffff)");
108 } else {
109 g_assert_cmpstr(str, ==,
110 "0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807");
111 }
a8fff94d 112 qapi_free_intList(list);
69e25563
HT
113}
114
2d7799f2
PB
115static void test_visitor_out_bool(TestOutputVisitorData *data,
116 const void *unused)
117{
2d7799f2
PB
118 bool value = true;
119 char *str;
120
d8da9e71 121 visit_type_bool(data->ov, NULL, &value, &error_abort);
2d7799f2 122
23d1705f 123 str = visitor_get(data);
2d7799f2 124 g_assert_cmpstr(str, ==, "true");
2d7799f2
PB
125}
126
127static void test_visitor_out_number(TestOutputVisitorData *data,
128 const void *unused)
129{
7b205a73 130 double value = 3.1415926535897932;
2d7799f2
PB
131 char *str;
132
d8da9e71 133 visit_type_number(data->ov, NULL, &value, &error_abort);
2d7799f2 134
23d1705f 135 str = visitor_get(data);
54addb01 136 g_assert_cmpstr(str, ==, "3.1415926535897931");
2d7799f2
PB
137}
138
139static void test_visitor_out_string(TestOutputVisitorData *data,
140 const void *unused)
141{
142 char *string = (char *) "Q E M U";
b4900c0e 143 const char *string_human = "\"Q E M U\"";
2d7799f2
PB
144 char *str;
145
d8da9e71 146 visit_type_str(data->ov, NULL, &string, &error_abort);
2d7799f2 147
23d1705f 148 str = visitor_get(data);
b4900c0e
HT
149 if (data->human) {
150 g_assert_cmpstr(str, ==, string_human);
151 } else {
152 g_assert_cmpstr(str, ==, string);
153 }
2d7799f2
PB
154}
155
156static void test_visitor_out_no_string(TestOutputVisitorData *data,
157 const void *unused)
158{
159 char *string = NULL;
2d7799f2
PB
160 char *str;
161
162 /* A null string should return "" */
a8fff94d 163 visit_type_str(data->ov, NULL, &string, &error_abort);
2d7799f2 164
23d1705f 165 str = visitor_get(data);
b4900c0e
HT
166 if (data->human) {
167 g_assert_cmpstr(str, ==, "<null>");
168 } else {
169 g_assert_cmpstr(str, ==, "");
170 }
2d7799f2
PB
171}
172
173static void test_visitor_out_enum(TestOutputVisitorData *data,
174 const void *unused)
175{
2d7799f2
PB
176 char *str;
177 EnumOne i;
178
7fb1cf16 179 for (i = 0; i < ENUM_ONE__MAX; i++) {
a8fff94d 180 visit_type_EnumOne(data->ov, "unused", &i, &error_abort);
b4900c0e 181
23d1705f 182 str = visitor_get(data);
b4900c0e 183 if (data->human) {
977c736f 184 char *str_human = g_strdup_printf("\"%s\"", EnumOne_str(i));
a8fff94d 185
b4900c0e 186 g_assert_cmpstr(str, ==, str_human);
a8fff94d 187 g_free(str_human);
b4900c0e 188 } else {
977c736f 189 g_assert_cmpstr(str, ==, EnumOne_str(i));
b4900c0e 190 }
a8fff94d 191 visitor_reset(data);
2d7799f2
PB
192 }
193}
194
b4900c0e
HT
195static void
196output_visitor_test_add(const char *testpath,
197 TestOutputVisitorData *data,
198 void (*test_func)(TestOutputVisitorData *data,
199 const void *user_data),
200 bool human)
2d7799f2 201{
b4900c0e
HT
202 g_test_add(testpath, TestOutputVisitorData, data,
203 human ? visitor_output_setup_human : visitor_output_setup,
2d7799f2
PB
204 test_func, visitor_output_teardown);
205}
206
207int main(int argc, char **argv)
208{
209 TestOutputVisitorData out_visitor_data;
210
211 g_test_init(&argc, &argv, NULL);
212
213 output_visitor_test_add("/string-visitor/output/int",
b4900c0e 214 &out_visitor_data, test_visitor_out_int, false);
deb847bf 215 output_visitor_test_add("/string-visitor/output/int-human",
b4900c0e
HT
216 &out_visitor_data, test_visitor_out_int, true);
217 output_visitor_test_add("/string-visitor/output/bool",
218 &out_visitor_data, test_visitor_out_bool, false);
deb847bf 219 output_visitor_test_add("/string-visitor/output/bool-human",
b4900c0e
HT
220 &out_visitor_data, test_visitor_out_bool, true);
221 output_visitor_test_add("/string-visitor/output/number",
222 &out_visitor_data, test_visitor_out_number, false);
deb847bf 223 output_visitor_test_add("/string-visitor/output/number-human",
b4900c0e 224 &out_visitor_data, test_visitor_out_number, true);
2d7799f2 225 output_visitor_test_add("/string-visitor/output/string",
b4900c0e 226 &out_visitor_data, test_visitor_out_string, false);
deb847bf 227 output_visitor_test_add("/string-visitor/output/string-human",
b4900c0e
HT
228 &out_visitor_data, test_visitor_out_string, true);
229 output_visitor_test_add("/string-visitor/output/no-string",
230 &out_visitor_data, test_visitor_out_no_string,
231 false);
deb847bf 232 output_visitor_test_add("/string-visitor/output/no-string-human",
b4900c0e
HT
233 &out_visitor_data, test_visitor_out_no_string,
234 true);
235 output_visitor_test_add("/string-visitor/output/enum",
236 &out_visitor_data, test_visitor_out_enum, false);
deb847bf 237 output_visitor_test_add("/string-visitor/output/enum-human",
b4900c0e 238 &out_visitor_data, test_visitor_out_enum, true);
b4900c0e
HT
239 output_visitor_test_add("/string-visitor/output/intList",
240 &out_visitor_data, test_visitor_out_intList, false);
deb847bf 241 output_visitor_test_add("/string-visitor/output/intList-human",
b4900c0e 242 &out_visitor_data, test_visitor_out_intList, true);
2d7799f2
PB
243
244 g_test_run();
245
246 return 0;
247}