root / test-qmp-input-visitor.c @ f57a5160
History | View | Annotate | Download (7.6 kB)
1 | d88f5fd1 | Luiz Capitulino | /*
|
---|---|---|---|
2 | d88f5fd1 | Luiz Capitulino | * QMP Input Visitor unit-tests.
|
3 | d88f5fd1 | Luiz Capitulino | *
|
4 | d88f5fd1 | Luiz Capitulino | * Copyright (C) 2011 Red Hat Inc.
|
5 | d88f5fd1 | Luiz Capitulino | *
|
6 | d88f5fd1 | Luiz Capitulino | * Authors:
|
7 | d88f5fd1 | Luiz Capitulino | * Luiz Capitulino <lcapitulino@redhat.com>
|
8 | d88f5fd1 | Luiz Capitulino | *
|
9 | d88f5fd1 | Luiz Capitulino | * This work is licensed under the terms of the GNU GPL, version 2 or later.
|
10 | d88f5fd1 | Luiz Capitulino | * See the COPYING file in the top-level directory.
|
11 | d88f5fd1 | Luiz Capitulino | */
|
12 | d88f5fd1 | Luiz Capitulino | |
13 | d88f5fd1 | Luiz Capitulino | #include <glib.h> |
14 | d88f5fd1 | Luiz Capitulino | #include <stdarg.h> |
15 | d88f5fd1 | Luiz Capitulino | |
16 | d88f5fd1 | Luiz Capitulino | #include "qapi/qmp-input-visitor.h" |
17 | d88f5fd1 | Luiz Capitulino | #include "test-qapi-types.h" |
18 | d88f5fd1 | Luiz Capitulino | #include "test-qapi-visit.h" |
19 | d88f5fd1 | Luiz Capitulino | #include "qemu-objects.h" |
20 | d88f5fd1 | Luiz Capitulino | |
21 | d88f5fd1 | Luiz Capitulino | typedef struct TestInputVisitorData { |
22 | d88f5fd1 | Luiz Capitulino | QObject *obj; |
23 | d88f5fd1 | Luiz Capitulino | QmpInputVisitor *qiv; |
24 | d88f5fd1 | Luiz Capitulino | } TestInputVisitorData; |
25 | d88f5fd1 | Luiz Capitulino | |
26 | d88f5fd1 | Luiz Capitulino | static void visitor_input_teardown(TestInputVisitorData *data, |
27 | d88f5fd1 | Luiz Capitulino | const void *unused) |
28 | d88f5fd1 | Luiz Capitulino | { |
29 | d88f5fd1 | Luiz Capitulino | qobject_decref(data->obj); |
30 | d88f5fd1 | Luiz Capitulino | data->obj = NULL;
|
31 | d88f5fd1 | Luiz Capitulino | |
32 | d88f5fd1 | Luiz Capitulino | if (data->qiv) {
|
33 | d88f5fd1 | Luiz Capitulino | qmp_input_visitor_cleanup(data->qiv); |
34 | d88f5fd1 | Luiz Capitulino | data->qiv = NULL;
|
35 | d88f5fd1 | Luiz Capitulino | } |
36 | d88f5fd1 | Luiz Capitulino | } |
37 | d88f5fd1 | Luiz Capitulino | |
38 | d88f5fd1 | Luiz Capitulino | /* This is provided instead of a test setup function so that the JSON
|
39 | d88f5fd1 | Luiz Capitulino | string used by the tests are kept in the test functions (and not
|
40 | d88f5fd1 | Luiz Capitulino | int main()) */
|
41 | aba2107a | Stefan Weil | static GCC_FMT_ATTR(2, 3) |
42 | aba2107a | Stefan Weil | Visitor *visitor_input_test_init(TestInputVisitorData *data, |
43 | aba2107a | Stefan Weil | const char *json_string, ...) |
44 | d88f5fd1 | Luiz Capitulino | { |
45 | d88f5fd1 | Luiz Capitulino | Visitor *v; |
46 | d88f5fd1 | Luiz Capitulino | va_list ap; |
47 | d88f5fd1 | Luiz Capitulino | |
48 | d88f5fd1 | Luiz Capitulino | va_start(ap, json_string); |
49 | d88f5fd1 | Luiz Capitulino | data->obj = qobject_from_jsonv(json_string, &ap); |
50 | d88f5fd1 | Luiz Capitulino | va_end(ap); |
51 | d88f5fd1 | Luiz Capitulino | |
52 | d88f5fd1 | Luiz Capitulino | g_assert(data->obj != NULL);
|
53 | d88f5fd1 | Luiz Capitulino | |
54 | d88f5fd1 | Luiz Capitulino | data->qiv = qmp_input_visitor_new(data->obj); |
55 | d88f5fd1 | Luiz Capitulino | g_assert(data->qiv != NULL);
|
56 | d88f5fd1 | Luiz Capitulino | |
57 | d88f5fd1 | Luiz Capitulino | v = qmp_input_get_visitor(data->qiv); |
58 | d88f5fd1 | Luiz Capitulino | g_assert(v != NULL);
|
59 | d88f5fd1 | Luiz Capitulino | |
60 | d88f5fd1 | Luiz Capitulino | return v;
|
61 | d88f5fd1 | Luiz Capitulino | } |
62 | d88f5fd1 | Luiz Capitulino | |
63 | d88f5fd1 | Luiz Capitulino | static void test_visitor_in_int(TestInputVisitorData *data, |
64 | d88f5fd1 | Luiz Capitulino | const void *unused) |
65 | d88f5fd1 | Luiz Capitulino | { |
66 | d88f5fd1 | Luiz Capitulino | int64_t res = 0, value = -42; |
67 | d88f5fd1 | Luiz Capitulino | Error *errp = NULL;
|
68 | d88f5fd1 | Luiz Capitulino | Visitor *v; |
69 | d88f5fd1 | Luiz Capitulino | |
70 | aba2107a | Stefan Weil | v = visitor_input_test_init(data, "%" PRId64, value);
|
71 | d88f5fd1 | Luiz Capitulino | |
72 | d88f5fd1 | Luiz Capitulino | visit_type_int(v, &res, NULL, &errp);
|
73 | d88f5fd1 | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
74 | d88f5fd1 | Luiz Capitulino | g_assert_cmpint(res, ==, value); |
75 | d88f5fd1 | Luiz Capitulino | } |
76 | d88f5fd1 | Luiz Capitulino | |
77 | d88f5fd1 | Luiz Capitulino | static void test_visitor_in_bool(TestInputVisitorData *data, |
78 | d88f5fd1 | Luiz Capitulino | const void *unused) |
79 | d88f5fd1 | Luiz Capitulino | { |
80 | d88f5fd1 | Luiz Capitulino | Error *errp = NULL;
|
81 | d88f5fd1 | Luiz Capitulino | bool res = false; |
82 | d88f5fd1 | Luiz Capitulino | Visitor *v; |
83 | d88f5fd1 | Luiz Capitulino | |
84 | d88f5fd1 | Luiz Capitulino | v = visitor_input_test_init(data, "true");
|
85 | d88f5fd1 | Luiz Capitulino | |
86 | d88f5fd1 | Luiz Capitulino | visit_type_bool(v, &res, NULL, &errp);
|
87 | d88f5fd1 | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
88 | d88f5fd1 | Luiz Capitulino | g_assert_cmpint(res, ==, true);
|
89 | d88f5fd1 | Luiz Capitulino | } |
90 | d88f5fd1 | Luiz Capitulino | |
91 | d88f5fd1 | Luiz Capitulino | static void test_visitor_in_number(TestInputVisitorData *data, |
92 | d88f5fd1 | Luiz Capitulino | const void *unused) |
93 | d88f5fd1 | Luiz Capitulino | { |
94 | d88f5fd1 | Luiz Capitulino | double res = 0, value = 3.14; |
95 | d88f5fd1 | Luiz Capitulino | Error *errp = NULL;
|
96 | d88f5fd1 | Luiz Capitulino | Visitor *v; |
97 | d88f5fd1 | Luiz Capitulino | |
98 | d88f5fd1 | Luiz Capitulino | v = visitor_input_test_init(data, "%f", value);
|
99 | d88f5fd1 | Luiz Capitulino | |
100 | d88f5fd1 | Luiz Capitulino | visit_type_number(v, &res, NULL, &errp);
|
101 | d88f5fd1 | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
102 | d88f5fd1 | Luiz Capitulino | g_assert_cmpfloat(res, ==, value); |
103 | d88f5fd1 | Luiz Capitulino | } |
104 | d88f5fd1 | Luiz Capitulino | |
105 | d88f5fd1 | Luiz Capitulino | static void test_visitor_in_string(TestInputVisitorData *data, |
106 | d88f5fd1 | Luiz Capitulino | const void *unused) |
107 | d88f5fd1 | Luiz Capitulino | { |
108 | d88f5fd1 | Luiz Capitulino | char *res = NULL, *value = (char *) "Q E M U"; |
109 | d88f5fd1 | Luiz Capitulino | Error *errp = NULL;
|
110 | d88f5fd1 | Luiz Capitulino | Visitor *v; |
111 | d88f5fd1 | Luiz Capitulino | |
112 | d88f5fd1 | Luiz Capitulino | v = visitor_input_test_init(data, "%s", value);
|
113 | d88f5fd1 | Luiz Capitulino | |
114 | d88f5fd1 | Luiz Capitulino | visit_type_str(v, &res, NULL, &errp);
|
115 | d88f5fd1 | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
116 | d88f5fd1 | Luiz Capitulino | g_assert_cmpstr(res, ==, value); |
117 | d88f5fd1 | Luiz Capitulino | |
118 | d88f5fd1 | Luiz Capitulino | g_free(res); |
119 | d88f5fd1 | Luiz Capitulino | } |
120 | d88f5fd1 | Luiz Capitulino | |
121 | d88f5fd1 | Luiz Capitulino | static void test_visitor_in_enum(TestInputVisitorData *data, |
122 | d88f5fd1 | Luiz Capitulino | const void *unused) |
123 | d88f5fd1 | Luiz Capitulino | { |
124 | d88f5fd1 | Luiz Capitulino | Error *errp = NULL;
|
125 | d88f5fd1 | Luiz Capitulino | Visitor *v; |
126 | d88f5fd1 | Luiz Capitulino | EnumOne i; |
127 | d88f5fd1 | Luiz Capitulino | |
128 | d88f5fd1 | Luiz Capitulino | for (i = 0; EnumOne_lookup[i]; i++) { |
129 | d88f5fd1 | Luiz Capitulino | EnumOne res = -1;
|
130 | d88f5fd1 | Luiz Capitulino | |
131 | d88f5fd1 | Luiz Capitulino | v = visitor_input_test_init(data, "%s", EnumOne_lookup[i]);
|
132 | d88f5fd1 | Luiz Capitulino | |
133 | d88f5fd1 | Luiz Capitulino | visit_type_EnumOne(v, &res, NULL, &errp);
|
134 | d88f5fd1 | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
135 | d88f5fd1 | Luiz Capitulino | g_assert_cmpint(i, ==, res); |
136 | d88f5fd1 | Luiz Capitulino | |
137 | d88f5fd1 | Luiz Capitulino | visitor_input_teardown(data, NULL);
|
138 | d88f5fd1 | Luiz Capitulino | } |
139 | d88f5fd1 | Luiz Capitulino | |
140 | d88f5fd1 | Luiz Capitulino | data->obj = NULL;
|
141 | d88f5fd1 | Luiz Capitulino | data->qiv = NULL;
|
142 | d88f5fd1 | Luiz Capitulino | } |
143 | d88f5fd1 | Luiz Capitulino | |
144 | d88f5fd1 | Luiz Capitulino | typedef struct TestStruct |
145 | d88f5fd1 | Luiz Capitulino | { |
146 | d88f5fd1 | Luiz Capitulino | int64_t integer; |
147 | d88f5fd1 | Luiz Capitulino | bool boolean;
|
148 | d88f5fd1 | Luiz Capitulino | char *string;
|
149 | d88f5fd1 | Luiz Capitulino | } TestStruct; |
150 | d88f5fd1 | Luiz Capitulino | |
151 | d88f5fd1 | Luiz Capitulino | static void visit_type_TestStruct(Visitor *v, TestStruct **obj, |
152 | d88f5fd1 | Luiz Capitulino | const char *name, Error **errp) |
153 | d88f5fd1 | Luiz Capitulino | { |
154 | d88f5fd1 | Luiz Capitulino | visit_start_struct(v, (void **)obj, "TestStruct", name, sizeof(TestStruct), |
155 | d88f5fd1 | Luiz Capitulino | errp); |
156 | d88f5fd1 | Luiz Capitulino | |
157 | d88f5fd1 | Luiz Capitulino | visit_type_int(v, &(*obj)->integer, "integer", errp);
|
158 | d88f5fd1 | Luiz Capitulino | visit_type_bool(v, &(*obj)->boolean, "boolean", errp);
|
159 | d88f5fd1 | Luiz Capitulino | visit_type_str(v, &(*obj)->string, "string", errp);
|
160 | d88f5fd1 | Luiz Capitulino | |
161 | d88f5fd1 | Luiz Capitulino | visit_end_struct(v, errp); |
162 | d88f5fd1 | Luiz Capitulino | } |
163 | d88f5fd1 | Luiz Capitulino | |
164 | d88f5fd1 | Luiz Capitulino | static void test_visitor_in_struct(TestInputVisitorData *data, |
165 | d88f5fd1 | Luiz Capitulino | const void *unused) |
166 | d88f5fd1 | Luiz Capitulino | { |
167 | d88f5fd1 | Luiz Capitulino | TestStruct *p = NULL;
|
168 | d88f5fd1 | Luiz Capitulino | Error *errp = NULL;
|
169 | d88f5fd1 | Luiz Capitulino | Visitor *v; |
170 | d88f5fd1 | Luiz Capitulino | |
171 | d88f5fd1 | Luiz Capitulino | v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }");
|
172 | d88f5fd1 | Luiz Capitulino | |
173 | d88f5fd1 | Luiz Capitulino | visit_type_TestStruct(v, &p, NULL, &errp);
|
174 | d88f5fd1 | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
175 | d88f5fd1 | Luiz Capitulino | g_assert_cmpint(p->integer, ==, -42);
|
176 | d88f5fd1 | Luiz Capitulino | g_assert(p->boolean == true);
|
177 | d88f5fd1 | Luiz Capitulino | g_assert_cmpstr(p->string, ==, "foo");
|
178 | d88f5fd1 | Luiz Capitulino | |
179 | d88f5fd1 | Luiz Capitulino | g_free(p->string); |
180 | d88f5fd1 | Luiz Capitulino | g_free(p); |
181 | d88f5fd1 | Luiz Capitulino | } |
182 | d88f5fd1 | Luiz Capitulino | |
183 | d88f5fd1 | Luiz Capitulino | static void check_and_free_str(char *str, const char *cmp) |
184 | d88f5fd1 | Luiz Capitulino | { |
185 | d88f5fd1 | Luiz Capitulino | g_assert_cmpstr(str, ==, cmp); |
186 | d88f5fd1 | Luiz Capitulino | g_free(str); |
187 | d88f5fd1 | Luiz Capitulino | } |
188 | d88f5fd1 | Luiz Capitulino | |
189 | d88f5fd1 | Luiz Capitulino | static void test_visitor_in_struct_nested(TestInputVisitorData *data, |
190 | d88f5fd1 | Luiz Capitulino | const void *unused) |
191 | d88f5fd1 | Luiz Capitulino | { |
192 | d88f5fd1 | Luiz Capitulino | UserDefNested *udp = NULL;
|
193 | d88f5fd1 | Luiz Capitulino | Error *errp = NULL;
|
194 | d88f5fd1 | Luiz Capitulino | Visitor *v; |
195 | d88f5fd1 | Luiz Capitulino | |
196 | d88f5fd1 | Luiz Capitulino | v = visitor_input_test_init(data, "{ 'string0': 'string0', 'dict1': { 'string1': 'string1', 'dict2': { 'userdef1': { 'integer': 42, 'string': 'string' }, 'string2': 'string2'}}}");
|
197 | d88f5fd1 | Luiz Capitulino | |
198 | d88f5fd1 | Luiz Capitulino | visit_type_UserDefNested(v, &udp, NULL, &errp);
|
199 | d88f5fd1 | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
200 | d88f5fd1 | Luiz Capitulino | |
201 | d88f5fd1 | Luiz Capitulino | check_and_free_str(udp->string0, "string0");
|
202 | d88f5fd1 | Luiz Capitulino | check_and_free_str(udp->dict1.string1, "string1");
|
203 | d88f5fd1 | Luiz Capitulino | g_assert_cmpint(udp->dict1.dict2.userdef1->integer, ==, 42);
|
204 | d88f5fd1 | Luiz Capitulino | check_and_free_str(udp->dict1.dict2.userdef1->string, "string");
|
205 | d88f5fd1 | Luiz Capitulino | check_and_free_str(udp->dict1.dict2.string2, "string2");
|
206 | d88f5fd1 | Luiz Capitulino | g_assert(udp->dict1.has_dict3 == false);
|
207 | d88f5fd1 | Luiz Capitulino | |
208 | d88f5fd1 | Luiz Capitulino | g_free(udp->dict1.dict2.userdef1); |
209 | d88f5fd1 | Luiz Capitulino | g_free(udp); |
210 | d88f5fd1 | Luiz Capitulino | } |
211 | d88f5fd1 | Luiz Capitulino | |
212 | d88f5fd1 | Luiz Capitulino | static void test_visitor_in_list(TestInputVisitorData *data, |
213 | d88f5fd1 | Luiz Capitulino | const void *unused) |
214 | d88f5fd1 | Luiz Capitulino | { |
215 | d88f5fd1 | Luiz Capitulino | UserDefOneList *item, *head = NULL;
|
216 | d88f5fd1 | Luiz Capitulino | Error *errp = NULL;
|
217 | d88f5fd1 | Luiz Capitulino | Visitor *v; |
218 | d88f5fd1 | Luiz Capitulino | int i;
|
219 | d88f5fd1 | Luiz Capitulino | |
220 | d88f5fd1 | Luiz Capitulino | v = visitor_input_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44 } ]");
|
221 | d88f5fd1 | Luiz Capitulino | |
222 | d88f5fd1 | Luiz Capitulino | visit_type_UserDefOneList(v, &head, NULL, &errp);
|
223 | d88f5fd1 | Luiz Capitulino | g_assert(!error_is_set(&errp)); |
224 | d88f5fd1 | Luiz Capitulino | g_assert(head != NULL);
|
225 | d88f5fd1 | Luiz Capitulino | |
226 | d88f5fd1 | Luiz Capitulino | for (i = 0, item = head; item; item = item->next, i++) { |
227 | d88f5fd1 | Luiz Capitulino | char string[12]; |
228 | d88f5fd1 | Luiz Capitulino | |
229 | d88f5fd1 | Luiz Capitulino | snprintf(string, sizeof(string), "string%d", i); |
230 | d88f5fd1 | Luiz Capitulino | g_assert_cmpstr(item->value->string, ==, string); |
231 | d88f5fd1 | Luiz Capitulino | g_assert_cmpint(item->value->integer, ==, 42 + i);
|
232 | d88f5fd1 | Luiz Capitulino | } |
233 | d88f5fd1 | Luiz Capitulino | |
234 | d88f5fd1 | Luiz Capitulino | qapi_free_UserDefOneList(head); |
235 | d88f5fd1 | Luiz Capitulino | } |
236 | d88f5fd1 | Luiz Capitulino | |
237 | d88f5fd1 | Luiz Capitulino | static void input_visitor_test_add(const char *testpath, |
238 | d88f5fd1 | Luiz Capitulino | TestInputVisitorData *data, |
239 | d88f5fd1 | Luiz Capitulino | void (*test_func)(TestInputVisitorData *data, const void *user_data)) |
240 | d88f5fd1 | Luiz Capitulino | { |
241 | d88f5fd1 | Luiz Capitulino | g_test_add(testpath, TestInputVisitorData, data, NULL, test_func,
|
242 | d88f5fd1 | Luiz Capitulino | visitor_input_teardown); |
243 | d88f5fd1 | Luiz Capitulino | } |
244 | d88f5fd1 | Luiz Capitulino | |
245 | d88f5fd1 | Luiz Capitulino | int main(int argc, char **argv) |
246 | d88f5fd1 | Luiz Capitulino | { |
247 | d88f5fd1 | Luiz Capitulino | TestInputVisitorData in_visitor_data; |
248 | d88f5fd1 | Luiz Capitulino | |
249 | d88f5fd1 | Luiz Capitulino | g_test_init(&argc, &argv, NULL);
|
250 | d88f5fd1 | Luiz Capitulino | |
251 | d88f5fd1 | Luiz Capitulino | input_visitor_test_add("/visitor/input/int",
|
252 | d88f5fd1 | Luiz Capitulino | &in_visitor_data, test_visitor_in_int); |
253 | d88f5fd1 | Luiz Capitulino | input_visitor_test_add("/visitor/input/bool",
|
254 | d88f5fd1 | Luiz Capitulino | &in_visitor_data, test_visitor_in_bool); |
255 | d88f5fd1 | Luiz Capitulino | input_visitor_test_add("/visitor/input/number",
|
256 | d88f5fd1 | Luiz Capitulino | &in_visitor_data, test_visitor_in_number); |
257 | d88f5fd1 | Luiz Capitulino | input_visitor_test_add("/visitor/input/string",
|
258 | d88f5fd1 | Luiz Capitulino | &in_visitor_data, test_visitor_in_string); |
259 | d88f5fd1 | Luiz Capitulino | input_visitor_test_add("/visitor/input/enum",
|
260 | d88f5fd1 | Luiz Capitulino | &in_visitor_data, test_visitor_in_enum); |
261 | d88f5fd1 | Luiz Capitulino | input_visitor_test_add("/visitor/input/struct",
|
262 | d88f5fd1 | Luiz Capitulino | &in_visitor_data, test_visitor_in_struct); |
263 | d88f5fd1 | Luiz Capitulino | input_visitor_test_add("/visitor/input/struct-nested",
|
264 | d88f5fd1 | Luiz Capitulino | &in_visitor_data, test_visitor_in_struct_nested); |
265 | d88f5fd1 | Luiz Capitulino | input_visitor_test_add("/visitor/input/list",
|
266 | d88f5fd1 | Luiz Capitulino | &in_visitor_data, test_visitor_in_list); |
267 | d88f5fd1 | Luiz Capitulino | |
268 | d88f5fd1 | Luiz Capitulino | g_test_run(); |
269 | d88f5fd1 | Luiz Capitulino | |
270 | d88f5fd1 | Luiz Capitulino | return 0; |
271 | d88f5fd1 | Luiz Capitulino | } |