xref: /qemu/tests/unit/test-string-output-visitor.c (revision e940f543ae7606819c9083fdb524e5b85914f032)
12d7799f2SPaolo Bonzini /*
22d7799f2SPaolo Bonzini  * String Output Visitor unit-tests.
32d7799f2SPaolo Bonzini  *
42d7799f2SPaolo Bonzini  * Copyright (C) 2012 Red Hat Inc.
52d7799f2SPaolo Bonzini  *
62d7799f2SPaolo Bonzini  * Authors:
72d7799f2SPaolo Bonzini  *  Paolo Bonzini <pbonzini@redhat.com> (based on test-qmp-output-visitor)
82d7799f2SPaolo Bonzini  *
92d7799f2SPaolo Bonzini  * This work is licensed under the terms of the GNU GPL, version 2 or later.
102d7799f2SPaolo Bonzini  * See the COPYING file in the top-level directory.
112d7799f2SPaolo Bonzini  */
122d7799f2SPaolo Bonzini 
132d7799f2SPaolo Bonzini #include <glib.h>
142d7799f2SPaolo Bonzini 
1579ee7df8SPaolo Bonzini #include "qemu-common.h"
162d7799f2SPaolo Bonzini #include "qapi/string-output-visitor.h"
172d7799f2SPaolo Bonzini #include "test-qapi-types.h"
182d7799f2SPaolo Bonzini #include "test-qapi-visit.h"
197b1b5d19SPaolo Bonzini #include "qapi/qmp/types.h"
202d7799f2SPaolo Bonzini 
212d7799f2SPaolo Bonzini typedef struct TestOutputVisitorData {
222d7799f2SPaolo Bonzini     StringOutputVisitor *sov;
232d7799f2SPaolo Bonzini     Visitor *ov;
242d7799f2SPaolo Bonzini } TestOutputVisitorData;
252d7799f2SPaolo Bonzini 
262d7799f2SPaolo Bonzini static void visitor_output_setup(TestOutputVisitorData *data,
272d7799f2SPaolo Bonzini                                  const void *unused)
282d7799f2SPaolo Bonzini {
290b7593e0SPaolo Bonzini     data->sov = string_output_visitor_new(false);
302d7799f2SPaolo Bonzini     g_assert(data->sov != NULL);
312d7799f2SPaolo Bonzini 
322d7799f2SPaolo Bonzini     data->ov = string_output_get_visitor(data->sov);
332d7799f2SPaolo Bonzini     g_assert(data->ov != NULL);
342d7799f2SPaolo Bonzini }
352d7799f2SPaolo Bonzini 
362d7799f2SPaolo Bonzini static void visitor_output_teardown(TestOutputVisitorData *data,
372d7799f2SPaolo Bonzini                                     const void *unused)
382d7799f2SPaolo Bonzini {
392d7799f2SPaolo Bonzini     string_output_visitor_cleanup(data->sov);
402d7799f2SPaolo Bonzini     data->sov = NULL;
412d7799f2SPaolo Bonzini     data->ov = NULL;
422d7799f2SPaolo Bonzini }
432d7799f2SPaolo Bonzini 
442d7799f2SPaolo Bonzini static void test_visitor_out_int(TestOutputVisitorData *data,
452d7799f2SPaolo Bonzini                                  const void *unused)
462d7799f2SPaolo Bonzini {
472d7799f2SPaolo Bonzini     int64_t value = -42;
48*e940f543SMarkus Armbruster     Error *err = NULL;
492d7799f2SPaolo Bonzini     char *str;
502d7799f2SPaolo Bonzini 
51*e940f543SMarkus Armbruster     visit_type_int(data->ov, &value, NULL, &err);
52*e940f543SMarkus Armbruster     g_assert(!err);
532d7799f2SPaolo Bonzini 
542d7799f2SPaolo Bonzini     str = string_output_get_string(data->sov);
552d7799f2SPaolo Bonzini     g_assert(str != NULL);
562d7799f2SPaolo Bonzini     g_assert_cmpstr(str, ==, "-42");
572d7799f2SPaolo Bonzini     g_free(str);
582d7799f2SPaolo Bonzini }
592d7799f2SPaolo Bonzini 
602d7799f2SPaolo Bonzini static void test_visitor_out_bool(TestOutputVisitorData *data,
612d7799f2SPaolo Bonzini                                   const void *unused)
622d7799f2SPaolo Bonzini {
63*e940f543SMarkus Armbruster     Error *err = NULL;
642d7799f2SPaolo Bonzini     bool value = true;
652d7799f2SPaolo Bonzini     char *str;
662d7799f2SPaolo Bonzini 
67*e940f543SMarkus Armbruster     visit_type_bool(data->ov, &value, NULL, &err);
68*e940f543SMarkus Armbruster     g_assert(!err);
692d7799f2SPaolo Bonzini 
702d7799f2SPaolo Bonzini     str = string_output_get_string(data->sov);
712d7799f2SPaolo Bonzini     g_assert(str != NULL);
722d7799f2SPaolo Bonzini     g_assert_cmpstr(str, ==, "true");
732d7799f2SPaolo Bonzini     g_free(str);
742d7799f2SPaolo Bonzini }
752d7799f2SPaolo Bonzini 
762d7799f2SPaolo Bonzini static void test_visitor_out_number(TestOutputVisitorData *data,
772d7799f2SPaolo Bonzini                                     const void *unused)
782d7799f2SPaolo Bonzini {
792d7799f2SPaolo Bonzini     double value = 3.14;
80*e940f543SMarkus Armbruster     Error *err = NULL;
812d7799f2SPaolo Bonzini     char *str;
822d7799f2SPaolo Bonzini 
83*e940f543SMarkus Armbruster     visit_type_number(data->ov, &value, NULL, &err);
84*e940f543SMarkus Armbruster     g_assert(!err);
852d7799f2SPaolo Bonzini 
862d7799f2SPaolo Bonzini     str = string_output_get_string(data->sov);
872d7799f2SPaolo Bonzini     g_assert(str != NULL);
88173bbb75SMichael Roth     g_assert_cmpstr(str, ==, "3.140000");
892d7799f2SPaolo Bonzini     g_free(str);
902d7799f2SPaolo Bonzini }
912d7799f2SPaolo Bonzini 
922d7799f2SPaolo Bonzini static void test_visitor_out_string(TestOutputVisitorData *data,
932d7799f2SPaolo Bonzini                                     const void *unused)
942d7799f2SPaolo Bonzini {
952d7799f2SPaolo Bonzini     char *string = (char *) "Q E M U";
96*e940f543SMarkus Armbruster     Error *err = NULL;
972d7799f2SPaolo Bonzini     char *str;
982d7799f2SPaolo Bonzini 
99*e940f543SMarkus Armbruster     visit_type_str(data->ov, &string, NULL, &err);
100*e940f543SMarkus Armbruster     g_assert(!err);
1012d7799f2SPaolo Bonzini 
1022d7799f2SPaolo Bonzini     str = string_output_get_string(data->sov);
1032d7799f2SPaolo Bonzini     g_assert(str != NULL);
1042d7799f2SPaolo Bonzini     g_assert_cmpstr(str, ==, string);
1052d7799f2SPaolo Bonzini     g_free(str);
1062d7799f2SPaolo Bonzini }
1072d7799f2SPaolo Bonzini 
1082d7799f2SPaolo Bonzini static void test_visitor_out_no_string(TestOutputVisitorData *data,
1092d7799f2SPaolo Bonzini                                        const void *unused)
1102d7799f2SPaolo Bonzini {
1112d7799f2SPaolo Bonzini     char *string = NULL;
112*e940f543SMarkus Armbruster     Error *err = NULL;
1132d7799f2SPaolo Bonzini     char *str;
1142d7799f2SPaolo Bonzini 
1152d7799f2SPaolo Bonzini     /* A null string should return "" */
116*e940f543SMarkus Armbruster     visit_type_str(data->ov, &string, NULL, &err);
117*e940f543SMarkus Armbruster     g_assert(!err);
1182d7799f2SPaolo Bonzini 
1192d7799f2SPaolo Bonzini     str = string_output_get_string(data->sov);
1202d7799f2SPaolo Bonzini     g_assert(str != NULL);
1212d7799f2SPaolo Bonzini     g_assert_cmpstr(str, ==, "");
1222d7799f2SPaolo Bonzini     g_free(str);
1232d7799f2SPaolo Bonzini }
1242d7799f2SPaolo Bonzini 
1252d7799f2SPaolo Bonzini static void test_visitor_out_enum(TestOutputVisitorData *data,
1262d7799f2SPaolo Bonzini                                   const void *unused)
1272d7799f2SPaolo Bonzini {
128*e940f543SMarkus Armbruster     Error *err = NULL;
1292d7799f2SPaolo Bonzini     char *str;
1302d7799f2SPaolo Bonzini     EnumOne i;
1312d7799f2SPaolo Bonzini 
1322d7799f2SPaolo Bonzini     for (i = 0; i < ENUM_ONE_MAX; i++) {
133*e940f543SMarkus Armbruster         visit_type_EnumOne(data->ov, &i, "unused", &err);
134*e940f543SMarkus Armbruster         g_assert(!err);
1352d7799f2SPaolo Bonzini 
1362d7799f2SPaolo Bonzini         str = string_output_get_string(data->sov);
1372d7799f2SPaolo Bonzini         g_assert(str != NULL);
1382d7799f2SPaolo Bonzini         g_assert_cmpstr(str, ==, EnumOne_lookup[i]);
1392d7799f2SPaolo Bonzini 	g_free(str);
1402d7799f2SPaolo Bonzini     }
1412d7799f2SPaolo Bonzini }
1422d7799f2SPaolo Bonzini 
1432d7799f2SPaolo Bonzini static void test_visitor_out_enum_errors(TestOutputVisitorData *data,
1442d7799f2SPaolo Bonzini                                          const void *unused)
1452d7799f2SPaolo Bonzini {
1462d7799f2SPaolo Bonzini     EnumOne i, bad_values[] = { ENUM_ONE_MAX, -1 };
147*e940f543SMarkus Armbruster     Error *err;
1482d7799f2SPaolo Bonzini 
1492d7799f2SPaolo Bonzini     for (i = 0; i < ARRAY_SIZE(bad_values) ; i++) {
150*e940f543SMarkus Armbruster         err = NULL;
151*e940f543SMarkus Armbruster         visit_type_EnumOne(data->ov, &bad_values[i], "unused", &err);
152*e940f543SMarkus Armbruster         g_assert(err);
153*e940f543SMarkus Armbruster         error_free(err);
1542d7799f2SPaolo Bonzini     }
1552d7799f2SPaolo Bonzini }
1562d7799f2SPaolo Bonzini 
1572d7799f2SPaolo Bonzini static void output_visitor_test_add(const char *testpath,
1582d7799f2SPaolo Bonzini                                     TestOutputVisitorData *data,
1592d7799f2SPaolo Bonzini                                     void (*test_func)(TestOutputVisitorData *data, const void *user_data))
1602d7799f2SPaolo Bonzini {
1612d7799f2SPaolo Bonzini     g_test_add(testpath, TestOutputVisitorData, data, visitor_output_setup,
1622d7799f2SPaolo Bonzini                test_func, visitor_output_teardown);
1632d7799f2SPaolo Bonzini }
1642d7799f2SPaolo Bonzini 
1652d7799f2SPaolo Bonzini int main(int argc, char **argv)
1662d7799f2SPaolo Bonzini {
1672d7799f2SPaolo Bonzini     TestOutputVisitorData out_visitor_data;
1682d7799f2SPaolo Bonzini 
1692d7799f2SPaolo Bonzini     g_test_init(&argc, &argv, NULL);
1702d7799f2SPaolo Bonzini 
1712d7799f2SPaolo Bonzini     output_visitor_test_add("/string-visitor/output/int",
1722d7799f2SPaolo Bonzini                             &out_visitor_data, test_visitor_out_int);
1732d7799f2SPaolo Bonzini     output_visitor_test_add("/string-visitor/output/bool",
1742d7799f2SPaolo Bonzini                             &out_visitor_data, test_visitor_out_bool);
1752d7799f2SPaolo Bonzini     output_visitor_test_add("/string-visitor/output/number",
1762d7799f2SPaolo Bonzini                             &out_visitor_data, test_visitor_out_number);
1772d7799f2SPaolo Bonzini     output_visitor_test_add("/string-visitor/output/string",
1782d7799f2SPaolo Bonzini                             &out_visitor_data, test_visitor_out_string);
1792d7799f2SPaolo Bonzini     output_visitor_test_add("/string-visitor/output/no-string",
1802d7799f2SPaolo Bonzini                             &out_visitor_data, test_visitor_out_no_string);
1812d7799f2SPaolo Bonzini     output_visitor_test_add("/string-visitor/output/enum",
1822d7799f2SPaolo Bonzini                             &out_visitor_data, test_visitor_out_enum);
1832d7799f2SPaolo Bonzini     output_visitor_test_add("/string-visitor/output/enum-errors",
1842d7799f2SPaolo Bonzini                             &out_visitor_data, test_visitor_out_enum_errors);
1852d7799f2SPaolo Bonzini 
1862d7799f2SPaolo Bonzini     g_test_run();
1872d7799f2SPaolo Bonzini 
1882d7799f2SPaolo Bonzini     return 0;
1892d7799f2SPaolo Bonzini }
190