Annotation of qemu/tests/test-qmp-input-visitor.c, revision 1.1.1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.