blob: 444844a15a52fdada0466a471579f8af97912e8b [file] [log] [blame]
Paolo Bonzini2d7799f2012-02-09 11:21:03 +01001/*
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
Peter Maydell681c28a2016-02-08 18:08:51 +000013#include "qemu/osdep.h"
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010014
Paolo Bonzini79ee7df2012-12-06 11:22:34 +010015#include "qemu-common.h"
Markus Armbrusterda34e652016-03-14 09:01:28 +010016#include "qapi/error.h"
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010017#include "qapi/string-output-visitor.h"
18#include "test-qapi-types.h"
19#include "test-qapi-visit.h"
Paolo Bonzini7b1b5d12012-12-17 18:19:43 +010020#include "qapi/qmp/types.h"
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010021
22typedef struct TestOutputVisitorData {
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010023 Visitor *ov;
Eric Blake23d17052016-06-09 10:48:42 -060024 char *str;
Hu Taob4900c02014-06-20 13:55:43 +080025 bool human;
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010026} TestOutputVisitorData;
27
Eric Blakea8fff942016-06-09 10:48:41 -060028static void visitor_output_setup_internal(TestOutputVisitorData *data,
29 bool human)
30{
31 data->human = human;
Eric Blake3b098d52016-06-09 10:48:43 -060032 data->ov = string_output_visitor_new(human, &data->str);
Eric Blakea8fff942016-06-09 10:48:41 -060033 g_assert(data->ov);
34}
35
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010036static void visitor_output_setup(TestOutputVisitorData *data,
37 const void *unused)
38{
Eric Blakea8fff942016-06-09 10:48:41 -060039 return visitor_output_setup_internal(data, false);
Hu Taob4900c02014-06-20 13:55:43 +080040}
41
42static void visitor_output_setup_human(TestOutputVisitorData *data,
43 const void *unused)
44{
Eric Blakea8fff942016-06-09 10:48:41 -060045 return visitor_output_setup_internal(data, true);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010046}
47
48static void visitor_output_teardown(TestOutputVisitorData *data,
49 const void *unused)
50{
Eric Blakee7ca5652016-06-09 10:48:39 -060051 visit_free(data->ov);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010052 data->ov = NULL;
Eric Blake23d17052016-06-09 10:48:42 -060053 g_free(data->str);
54 data->str = NULL;
55}
56
57static char *visitor_get(TestOutputVisitorData *data)
58{
Eric Blake3b098d52016-06-09 10:48:43 -060059 visit_complete(data->ov, &data->str);
Eric Blake23d17052016-06-09 10:48:42 -060060 g_assert(data->str);
61 return data->str;
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010062}
63
Eric Blakea8fff942016-06-09 10:48:41 -060064static void visitor_reset(TestOutputVisitorData *data)
65{
66 bool human = data->human;
67
68 visitor_output_teardown(data, NULL);
69 visitor_output_setup_internal(data, human);
70}
71
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010072static void test_visitor_out_int(TestOutputVisitorData *data,
73 const void *unused)
74{
Hu Tao69e25562014-06-10 19:15:28 +080075 int64_t value = 42;
Markus Armbrustere940f542014-05-02 13:26:29 +020076 Error *err = NULL;
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010077 char *str;
78
Eric Blake51e72bc2016-01-29 06:48:54 -070079 visit_type_int(data->ov, NULL, &value, &err);
Markus Armbrustere940f542014-05-02 13:26:29 +020080 g_assert(!err);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010081
Eric Blake23d17052016-06-09 10:48:42 -060082 str = visitor_get(data);
Hu Taob4900c02014-06-20 13:55:43 +080083 if (data->human) {
84 g_assert_cmpstr(str, ==, "42 (0x2a)");
85 } else {
86 g_assert_cmpstr(str, ==, "42");
87 }
Paolo Bonzini2d7799f2012-02-09 11:21:03 +010088}
89
Hu Tao69e25562014-06-10 19:15:28 +080090static void test_visitor_out_intList(TestOutputVisitorData *data,
91 const void *unused)
92{
93 int64_t value[] = {0, 1, 9, 10, 16, 15, 14,
94 3, 4, 5, 6, 11, 12, 13, 21, 22, INT64_MAX - 1, INT64_MAX};
95 intList *list = NULL, **tmp = &list;
96 int i;
Markus Armbruster533fdae2015-12-18 16:35:27 +010097 Error *err = NULL;
Hu Tao69e25562014-06-10 19:15:28 +080098 char *str;
99
100 for (i = 0; i < sizeof(value) / sizeof(value[0]); i++) {
101 *tmp = g_malloc0(sizeof(**tmp));
102 (*tmp)->value = value[i];
103 tmp = &(*tmp)->next;
104 }
105
Eric Blake51e72bc2016-01-29 06:48:54 -0700106 visit_type_intList(data->ov, NULL, &list, &err);
Markus Armbruster533fdae2015-12-18 16:35:27 +0100107 g_assert(err == NULL);
Hu Tao69e25562014-06-10 19:15:28 +0800108
Eric Blake23d17052016-06-09 10:48:42 -0600109 str = visitor_get(data);
Hu Taob4900c02014-06-20 13:55:43 +0800110 if (data->human) {
111 g_assert_cmpstr(str, ==,
112 "0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807 "
113 "(0x0-0x1,0x3-0x6,0x9-0x10,0x15-0x16,"
114 "0x7ffffffffffffffe-0x7fffffffffffffff)");
115 } else {
116 g_assert_cmpstr(str, ==,
117 "0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807");
118 }
Eric Blakea8fff942016-06-09 10:48:41 -0600119 qapi_free_intList(list);
Hu Tao69e25562014-06-10 19:15:28 +0800120}
121
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100122static void test_visitor_out_bool(TestOutputVisitorData *data,
123 const void *unused)
124{
Markus Armbrustere940f542014-05-02 13:26:29 +0200125 Error *err = NULL;
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100126 bool value = true;
127 char *str;
128
Eric Blake51e72bc2016-01-29 06:48:54 -0700129 visit_type_bool(data->ov, NULL, &value, &err);
Markus Armbrustere940f542014-05-02 13:26:29 +0200130 g_assert(!err);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100131
Eric Blake23d17052016-06-09 10:48:42 -0600132 str = visitor_get(data);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100133 g_assert_cmpstr(str, ==, "true");
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100134}
135
136static void test_visitor_out_number(TestOutputVisitorData *data,
137 const void *unused)
138{
139 double value = 3.14;
Markus Armbrustere940f542014-05-02 13:26:29 +0200140 Error *err = NULL;
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100141 char *str;
142
Eric Blake51e72bc2016-01-29 06:48:54 -0700143 visit_type_number(data->ov, NULL, &value, &err);
Markus Armbrustere940f542014-05-02 13:26:29 +0200144 g_assert(!err);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100145
Eric Blake23d17052016-06-09 10:48:42 -0600146 str = visitor_get(data);
Michael Roth173bbb72012-04-30 09:33:30 -0500147 g_assert_cmpstr(str, ==, "3.140000");
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100148}
149
150static void test_visitor_out_string(TestOutputVisitorData *data,
151 const void *unused)
152{
153 char *string = (char *) "Q E M U";
Hu Taob4900c02014-06-20 13:55:43 +0800154 const char *string_human = "\"Q E M U\"";
Markus Armbrustere940f542014-05-02 13:26:29 +0200155 Error *err = NULL;
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100156 char *str;
157
Eric Blake51e72bc2016-01-29 06:48:54 -0700158 visit_type_str(data->ov, NULL, &string, &err);
Markus Armbrustere940f542014-05-02 13:26:29 +0200159 g_assert(!err);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100160
Eric Blake23d17052016-06-09 10:48:42 -0600161 str = visitor_get(data);
Hu Taob4900c02014-06-20 13:55:43 +0800162 if (data->human) {
163 g_assert_cmpstr(str, ==, string_human);
164 } else {
165 g_assert_cmpstr(str, ==, string);
166 }
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100167}
168
169static void test_visitor_out_no_string(TestOutputVisitorData *data,
170 const void *unused)
171{
172 char *string = NULL;
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100173 char *str;
174
175 /* A null string should return "" */
Eric Blakea8fff942016-06-09 10:48:41 -0600176 visit_type_str(data->ov, NULL, &string, &error_abort);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100177
Eric Blake23d17052016-06-09 10:48:42 -0600178 str = visitor_get(data);
Hu Taob4900c02014-06-20 13:55:43 +0800179 if (data->human) {
180 g_assert_cmpstr(str, ==, "<null>");
181 } else {
182 g_assert_cmpstr(str, ==, "");
183 }
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100184}
185
186static void test_visitor_out_enum(TestOutputVisitorData *data,
187 const void *unused)
188{
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100189 char *str;
190 EnumOne i;
191
Eric Blake7fb1cf12015-11-18 01:52:57 -0700192 for (i = 0; i < ENUM_ONE__MAX; i++) {
Eric Blakea8fff942016-06-09 10:48:41 -0600193 visit_type_EnumOne(data->ov, "unused", &i, &error_abort);
Hu Taob4900c02014-06-20 13:55:43 +0800194
Eric Blake23d17052016-06-09 10:48:42 -0600195 str = visitor_get(data);
Hu Taob4900c02014-06-20 13:55:43 +0800196 if (data->human) {
Eric Blakea8fff942016-06-09 10:48:41 -0600197 char *str_human = g_strdup_printf("\"%s\"", EnumOne_lookup[i]);
198
Hu Taob4900c02014-06-20 13:55:43 +0800199 g_assert_cmpstr(str, ==, str_human);
Eric Blakea8fff942016-06-09 10:48:41 -0600200 g_free(str_human);
Hu Taob4900c02014-06-20 13:55:43 +0800201 } else {
202 g_assert_cmpstr(str, ==, EnumOne_lookup[i]);
203 }
Eric Blakea8fff942016-06-09 10:48:41 -0600204 visitor_reset(data);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100205 }
206}
207
208static void test_visitor_out_enum_errors(TestOutputVisitorData *data,
209 const void *unused)
210{
Eric Blake7fb1cf12015-11-18 01:52:57 -0700211 EnumOne i, bad_values[] = { ENUM_ONE__MAX, -1 };
Markus Armbrustere940f542014-05-02 13:26:29 +0200212 Error *err;
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100213
214 for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) {
Markus Armbrustere940f542014-05-02 13:26:29 +0200215 err = NULL;
Eric Blake51e72bc2016-01-29 06:48:54 -0700216 visit_type_EnumOne(data->ov, "unused", &bad_values[i], &err);
Eric Blakea8fff942016-06-09 10:48:41 -0600217 error_free_or_abort(&err);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100218 }
219}
220
Hu Taob4900c02014-06-20 13:55:43 +0800221static void
222output_visitor_test_add(const char *testpath,
223 TestOutputVisitorData *data,
224 void (*test_func)(TestOutputVisitorData *data,
225 const void *user_data),
226 bool human)
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100227{
Hu Taob4900c02014-06-20 13:55:43 +0800228 g_test_add(testpath, TestOutputVisitorData, data,
229 human ? visitor_output_setup_human : visitor_output_setup,
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100230 test_func, visitor_output_teardown);
231}
232
233int main(int argc, char **argv)
234{
235 TestOutputVisitorData out_visitor_data;
236
237 g_test_init(&argc, &argv, NULL);
238
239 output_visitor_test_add("/string-visitor/output/int",
Hu Taob4900c02014-06-20 13:55:43 +0800240 &out_visitor_data, test_visitor_out_int, false);
Dr. David Alan Gilbertdeb847b2015-10-05 12:04:20 +0100241 output_visitor_test_add("/string-visitor/output/int-human",
Hu Taob4900c02014-06-20 13:55:43 +0800242 &out_visitor_data, test_visitor_out_int, true);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100243 output_visitor_test_add("/string-visitor/output/bool",
Hu Taob4900c02014-06-20 13:55:43 +0800244 &out_visitor_data, test_visitor_out_bool, false);
Dr. David Alan Gilbertdeb847b2015-10-05 12:04:20 +0100245 output_visitor_test_add("/string-visitor/output/bool-human",
Hu Taob4900c02014-06-20 13:55:43 +0800246 &out_visitor_data, test_visitor_out_bool, true);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100247 output_visitor_test_add("/string-visitor/output/number",
Hu Taob4900c02014-06-20 13:55:43 +0800248 &out_visitor_data, test_visitor_out_number, false);
Dr. David Alan Gilbertdeb847b2015-10-05 12:04:20 +0100249 output_visitor_test_add("/string-visitor/output/number-human",
Hu Taob4900c02014-06-20 13:55:43 +0800250 &out_visitor_data, test_visitor_out_number, true);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100251 output_visitor_test_add("/string-visitor/output/string",
Hu Taob4900c02014-06-20 13:55:43 +0800252 &out_visitor_data, test_visitor_out_string, false);
Dr. David Alan Gilbertdeb847b2015-10-05 12:04:20 +0100253 output_visitor_test_add("/string-visitor/output/string-human",
Hu Taob4900c02014-06-20 13:55:43 +0800254 &out_visitor_data, test_visitor_out_string, true);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100255 output_visitor_test_add("/string-visitor/output/no-string",
Hu Taob4900c02014-06-20 13:55:43 +0800256 &out_visitor_data, test_visitor_out_no_string,
257 false);
Dr. David Alan Gilbertdeb847b2015-10-05 12:04:20 +0100258 output_visitor_test_add("/string-visitor/output/no-string-human",
Hu Taob4900c02014-06-20 13:55:43 +0800259 &out_visitor_data, test_visitor_out_no_string,
260 true);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100261 output_visitor_test_add("/string-visitor/output/enum",
Hu Taob4900c02014-06-20 13:55:43 +0800262 &out_visitor_data, test_visitor_out_enum, false);
Dr. David Alan Gilbertdeb847b2015-10-05 12:04:20 +0100263 output_visitor_test_add("/string-visitor/output/enum-human",
Hu Taob4900c02014-06-20 13:55:43 +0800264 &out_visitor_data, test_visitor_out_enum, true);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100265 output_visitor_test_add("/string-visitor/output/enum-errors",
Hu Taob4900c02014-06-20 13:55:43 +0800266 &out_visitor_data, test_visitor_out_enum_errors,
267 false);
Dr. David Alan Gilbertdeb847b2015-10-05 12:04:20 +0100268 output_visitor_test_add("/string-visitor/output/enum-errors-human",
Hu Taob4900c02014-06-20 13:55:43 +0800269 &out_visitor_data, test_visitor_out_enum_errors,
270 true);
Hu Tao69e25562014-06-10 19:15:28 +0800271 output_visitor_test_add("/string-visitor/output/intList",
Hu Taob4900c02014-06-20 13:55:43 +0800272 &out_visitor_data, test_visitor_out_intList, false);
Dr. David Alan Gilbertdeb847b2015-10-05 12:04:20 +0100273 output_visitor_test_add("/string-visitor/output/intList-human",
Hu Taob4900c02014-06-20 13:55:43 +0800274 &out_visitor_data, test_visitor_out_intList, true);
Paolo Bonzini2d7799f2012-02-09 11:21:03 +0100275
276 g_test_run();
277
278 return 0;
279}