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