12d7799f2SPaolo Bonzini /* 22d7799f2SPaolo Bonzini * String Output Visitor unit-tests. 32d7799f2SPaolo Bonzini * 42d7799f2SPaolo Bonzini * Copyright (C) 2012 Red Hat Inc. 52d7799f2SPaolo Bonzini * 62d7799f2SPaolo Bonzini * Authors: 7b3db211fSDaniel P. Berrange * Paolo Bonzini <pbonzini@redhat.com> (based on test-qobject-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 13681c28a3SPeter Maydell #include "qemu/osdep.h" 142d7799f2SPaolo Bonzini 1579ee7df8SPaolo Bonzini #include "qemu-common.h" 16da34e65cSMarkus Armbruster #include "qapi/error.h" 172d7799f2SPaolo Bonzini #include "qapi/string-output-visitor.h" 182d7799f2SPaolo Bonzini #include "test-qapi-visit.h" 192d7799f2SPaolo Bonzini 202d7799f2SPaolo Bonzini typedef struct TestOutputVisitorData { 212d7799f2SPaolo Bonzini Visitor *ov; 2223d1705fSEric Blake char *str; 23b4900c0eSHu Tao bool human; 242d7799f2SPaolo Bonzini } TestOutputVisitorData; 252d7799f2SPaolo Bonzini 26a8fff94dSEric Blake static void visitor_output_setup_internal(TestOutputVisitorData *data, 27a8fff94dSEric Blake bool human) 28a8fff94dSEric Blake { 29a8fff94dSEric Blake data->human = human; 303b098d56SEric Blake data->ov = string_output_visitor_new(human, &data->str); 31a8fff94dSEric Blake g_assert(data->ov); 32a8fff94dSEric Blake } 33a8fff94dSEric Blake 342d7799f2SPaolo Bonzini static void visitor_output_setup(TestOutputVisitorData *data, 352d7799f2SPaolo Bonzini const void *unused) 362d7799f2SPaolo Bonzini { 37a8fff94dSEric Blake return visitor_output_setup_internal(data, false); 38b4900c0eSHu Tao } 39b4900c0eSHu Tao 40b4900c0eSHu Tao static void visitor_output_setup_human(TestOutputVisitorData *data, 41b4900c0eSHu Tao const void *unused) 42b4900c0eSHu Tao { 43a8fff94dSEric Blake return visitor_output_setup_internal(data, true); 442d7799f2SPaolo Bonzini } 452d7799f2SPaolo Bonzini 462d7799f2SPaolo Bonzini static void visitor_output_teardown(TestOutputVisitorData *data, 472d7799f2SPaolo Bonzini const void *unused) 482d7799f2SPaolo Bonzini { 49e7ca5656SEric Blake visit_free(data->ov); 502d7799f2SPaolo Bonzini data->ov = NULL; 5123d1705fSEric Blake g_free(data->str); 5223d1705fSEric Blake data->str = NULL; 5323d1705fSEric Blake } 5423d1705fSEric Blake 5523d1705fSEric Blake static char *visitor_get(TestOutputVisitorData *data) 5623d1705fSEric Blake { 573b098d56SEric Blake visit_complete(data->ov, &data->str); 5823d1705fSEric Blake g_assert(data->str); 5923d1705fSEric Blake return data->str; 602d7799f2SPaolo Bonzini } 612d7799f2SPaolo Bonzini 62a8fff94dSEric Blake static void visitor_reset(TestOutputVisitorData *data) 63a8fff94dSEric Blake { 64a8fff94dSEric Blake bool human = data->human; 65a8fff94dSEric Blake 66a8fff94dSEric Blake visitor_output_teardown(data, NULL); 67a8fff94dSEric Blake visitor_output_setup_internal(data, human); 68a8fff94dSEric Blake } 69a8fff94dSEric Blake 702d7799f2SPaolo Bonzini static void test_visitor_out_int(TestOutputVisitorData *data, 712d7799f2SPaolo Bonzini const void *unused) 722d7799f2SPaolo Bonzini { 7369e25563SHu Tao int64_t value = 42; 742d7799f2SPaolo Bonzini char *str; 752d7799f2SPaolo Bonzini 76d8da9e71SMarkus Armbruster visit_type_int(data->ov, NULL, &value, &error_abort); 772d7799f2SPaolo Bonzini 7823d1705fSEric Blake str = visitor_get(data); 79b4900c0eSHu Tao if (data->human) { 80b4900c0eSHu Tao g_assert_cmpstr(str, ==, "42 (0x2a)"); 81b4900c0eSHu Tao } else { 8269e25563SHu Tao g_assert_cmpstr(str, ==, "42"); 83b4900c0eSHu Tao } 842d7799f2SPaolo Bonzini } 852d7799f2SPaolo Bonzini 8669e25563SHu Tao static void test_visitor_out_intList(TestOutputVisitorData *data, 8769e25563SHu Tao const void *unused) 8869e25563SHu Tao { 8969e25563SHu Tao int64_t value[] = {0, 1, 9, 10, 16, 15, 14, 9069e25563SHu Tao 3, 4, 5, 6, 11, 12, 13, 21, 22, INT64_MAX - 1, INT64_MAX}; 9169e25563SHu Tao intList *list = NULL, **tmp = &list; 9269e25563SHu Tao int i; 93533fdaedSMarkus Armbruster Error *err = NULL; 9469e25563SHu Tao char *str; 9569e25563SHu Tao 96d40d74a6SPhilippe Mathieu-Daudé for (i = 0; i < ARRAY_SIZE(value); i++) { 9769e25563SHu Tao *tmp = g_malloc0(sizeof(**tmp)); 9869e25563SHu Tao (*tmp)->value = value[i]; 9969e25563SHu Tao tmp = &(*tmp)->next; 10069e25563SHu Tao } 10169e25563SHu Tao 10251e72bc1SEric Blake visit_type_intList(data->ov, NULL, &list, &err); 103533fdaedSMarkus Armbruster g_assert(err == NULL); 10469e25563SHu Tao 10523d1705fSEric Blake str = visitor_get(data); 106b4900c0eSHu Tao if (data->human) { 107b4900c0eSHu Tao g_assert_cmpstr(str, ==, 108b4900c0eSHu Tao "0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807 " 109b4900c0eSHu Tao "(0x0-0x1,0x3-0x6,0x9-0x10,0x15-0x16," 110b4900c0eSHu Tao "0x7ffffffffffffffe-0x7fffffffffffffff)"); 111b4900c0eSHu Tao } else { 11269e25563SHu Tao g_assert_cmpstr(str, ==, 11369e25563SHu Tao "0-1,3-6,9-16,21-22,9223372036854775806-9223372036854775807"); 114b4900c0eSHu Tao } 115a8fff94dSEric Blake qapi_free_intList(list); 11669e25563SHu Tao } 11769e25563SHu Tao 1182d7799f2SPaolo Bonzini static void test_visitor_out_bool(TestOutputVisitorData *data, 1192d7799f2SPaolo Bonzini const void *unused) 1202d7799f2SPaolo Bonzini { 1212d7799f2SPaolo Bonzini bool value = true; 1222d7799f2SPaolo Bonzini char *str; 1232d7799f2SPaolo Bonzini 124d8da9e71SMarkus Armbruster visit_type_bool(data->ov, NULL, &value, &error_abort); 1252d7799f2SPaolo Bonzini 12623d1705fSEric Blake str = visitor_get(data); 1272d7799f2SPaolo Bonzini g_assert_cmpstr(str, ==, "true"); 1282d7799f2SPaolo Bonzini } 1292d7799f2SPaolo Bonzini 1302d7799f2SPaolo Bonzini static void test_visitor_out_number(TestOutputVisitorData *data, 1312d7799f2SPaolo Bonzini const void *unused) 1322d7799f2SPaolo Bonzini { 133*7b205a73SMarkus Armbruster double value = 3.1415926535897932; 1342d7799f2SPaolo Bonzini char *str; 1352d7799f2SPaolo Bonzini 136d8da9e71SMarkus Armbruster visit_type_number(data->ov, NULL, &value, &error_abort); 1372d7799f2SPaolo Bonzini 13823d1705fSEric Blake str = visitor_get(data); 139*7b205a73SMarkus Armbruster g_assert_cmpstr(str, ==, "3.141593"); 1402d7799f2SPaolo Bonzini } 1412d7799f2SPaolo Bonzini 1422d7799f2SPaolo Bonzini static void test_visitor_out_string(TestOutputVisitorData *data, 1432d7799f2SPaolo Bonzini const void *unused) 1442d7799f2SPaolo Bonzini { 1452d7799f2SPaolo Bonzini char *string = (char *) "Q E M U"; 146b4900c0eSHu Tao const char *string_human = "\"Q E M U\""; 1472d7799f2SPaolo Bonzini char *str; 1482d7799f2SPaolo Bonzini 149d8da9e71SMarkus Armbruster visit_type_str(data->ov, NULL, &string, &error_abort); 1502d7799f2SPaolo Bonzini 15123d1705fSEric Blake str = visitor_get(data); 152b4900c0eSHu Tao if (data->human) { 153b4900c0eSHu Tao g_assert_cmpstr(str, ==, string_human); 154b4900c0eSHu Tao } else { 1552d7799f2SPaolo Bonzini g_assert_cmpstr(str, ==, string); 156b4900c0eSHu Tao } 1572d7799f2SPaolo Bonzini } 1582d7799f2SPaolo Bonzini 1592d7799f2SPaolo Bonzini static void test_visitor_out_no_string(TestOutputVisitorData *data, 1602d7799f2SPaolo Bonzini const void *unused) 1612d7799f2SPaolo Bonzini { 1622d7799f2SPaolo Bonzini char *string = NULL; 1632d7799f2SPaolo Bonzini char *str; 1642d7799f2SPaolo Bonzini 1652d7799f2SPaolo Bonzini /* A null string should return "" */ 166a8fff94dSEric Blake visit_type_str(data->ov, NULL, &string, &error_abort); 1672d7799f2SPaolo Bonzini 16823d1705fSEric Blake str = visitor_get(data); 169b4900c0eSHu Tao if (data->human) { 170b4900c0eSHu Tao g_assert_cmpstr(str, ==, "<null>"); 171b4900c0eSHu Tao } else { 1722d7799f2SPaolo Bonzini g_assert_cmpstr(str, ==, ""); 173b4900c0eSHu Tao } 1742d7799f2SPaolo Bonzini } 1752d7799f2SPaolo Bonzini 1762d7799f2SPaolo Bonzini static void test_visitor_out_enum(TestOutputVisitorData *data, 1772d7799f2SPaolo Bonzini const void *unused) 1782d7799f2SPaolo Bonzini { 1792d7799f2SPaolo Bonzini char *str; 1802d7799f2SPaolo Bonzini EnumOne i; 1812d7799f2SPaolo Bonzini 1827fb1cf16SEric Blake for (i = 0; i < ENUM_ONE__MAX; i++) { 183a8fff94dSEric Blake visit_type_EnumOne(data->ov, "unused", &i, &error_abort); 184b4900c0eSHu Tao 18523d1705fSEric Blake str = visitor_get(data); 186b4900c0eSHu Tao if (data->human) { 187977c736fSMarkus Armbruster char *str_human = g_strdup_printf("\"%s\"", EnumOne_str(i)); 188a8fff94dSEric Blake 189b4900c0eSHu Tao g_assert_cmpstr(str, ==, str_human); 190a8fff94dSEric Blake g_free(str_human); 191b4900c0eSHu Tao } else { 192977c736fSMarkus Armbruster g_assert_cmpstr(str, ==, EnumOne_str(i)); 193b4900c0eSHu Tao } 194a8fff94dSEric Blake visitor_reset(data); 1952d7799f2SPaolo Bonzini } 1962d7799f2SPaolo Bonzini } 1972d7799f2SPaolo Bonzini 198b4900c0eSHu Tao static void 199b4900c0eSHu Tao output_visitor_test_add(const char *testpath, 2002d7799f2SPaolo Bonzini TestOutputVisitorData *data, 201b4900c0eSHu Tao void (*test_func)(TestOutputVisitorData *data, 202b4900c0eSHu Tao const void *user_data), 203b4900c0eSHu Tao bool human) 2042d7799f2SPaolo Bonzini { 205b4900c0eSHu Tao g_test_add(testpath, TestOutputVisitorData, data, 206b4900c0eSHu Tao human ? visitor_output_setup_human : visitor_output_setup, 2072d7799f2SPaolo Bonzini test_func, visitor_output_teardown); 2082d7799f2SPaolo Bonzini } 2092d7799f2SPaolo Bonzini 2102d7799f2SPaolo Bonzini int main(int argc, char **argv) 2112d7799f2SPaolo Bonzini { 2122d7799f2SPaolo Bonzini TestOutputVisitorData out_visitor_data; 2132d7799f2SPaolo Bonzini 2142d7799f2SPaolo Bonzini g_test_init(&argc, &argv, NULL); 2152d7799f2SPaolo Bonzini 2162d7799f2SPaolo Bonzini output_visitor_test_add("/string-visitor/output/int", 217b4900c0eSHu Tao &out_visitor_data, test_visitor_out_int, false); 218deb847bfSDr. David Alan Gilbert output_visitor_test_add("/string-visitor/output/int-human", 219b4900c0eSHu Tao &out_visitor_data, test_visitor_out_int, true); 2202d7799f2SPaolo Bonzini output_visitor_test_add("/string-visitor/output/bool", 221b4900c0eSHu Tao &out_visitor_data, test_visitor_out_bool, false); 222deb847bfSDr. David Alan Gilbert output_visitor_test_add("/string-visitor/output/bool-human", 223b4900c0eSHu Tao &out_visitor_data, test_visitor_out_bool, true); 2242d7799f2SPaolo Bonzini output_visitor_test_add("/string-visitor/output/number", 225b4900c0eSHu Tao &out_visitor_data, test_visitor_out_number, false); 226deb847bfSDr. David Alan Gilbert output_visitor_test_add("/string-visitor/output/number-human", 227b4900c0eSHu Tao &out_visitor_data, test_visitor_out_number, true); 2282d7799f2SPaolo Bonzini output_visitor_test_add("/string-visitor/output/string", 229b4900c0eSHu Tao &out_visitor_data, test_visitor_out_string, false); 230deb847bfSDr. David Alan Gilbert output_visitor_test_add("/string-visitor/output/string-human", 231b4900c0eSHu Tao &out_visitor_data, test_visitor_out_string, true); 2322d7799f2SPaolo Bonzini output_visitor_test_add("/string-visitor/output/no-string", 233b4900c0eSHu Tao &out_visitor_data, test_visitor_out_no_string, 234b4900c0eSHu Tao false); 235deb847bfSDr. David Alan Gilbert output_visitor_test_add("/string-visitor/output/no-string-human", 236b4900c0eSHu Tao &out_visitor_data, test_visitor_out_no_string, 237b4900c0eSHu Tao true); 2382d7799f2SPaolo Bonzini output_visitor_test_add("/string-visitor/output/enum", 239b4900c0eSHu Tao &out_visitor_data, test_visitor_out_enum, false); 240deb847bfSDr. David Alan Gilbert output_visitor_test_add("/string-visitor/output/enum-human", 241b4900c0eSHu Tao &out_visitor_data, test_visitor_out_enum, true); 24269e25563SHu Tao output_visitor_test_add("/string-visitor/output/intList", 243b4900c0eSHu Tao &out_visitor_data, test_visitor_out_intList, false); 244deb847bfSDr. David Alan Gilbert output_visitor_test_add("/string-visitor/output/intList-human", 245b4900c0eSHu Tao &out_visitor_data, test_visitor_out_intList, true); 2462d7799f2SPaolo Bonzini 2472d7799f2SPaolo Bonzini g_test_run(); 2482d7799f2SPaolo Bonzini 2492d7799f2SPaolo Bonzini return 0; 2502d7799f2SPaolo Bonzini } 251