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

1.1       root        1: /*
                      2:  * QMP Input Visitor unit-tests (strict mode).
                      3:  *
                      4:  * Copyright (C) 2011-2012 Red Hat Inc.
                      5:  *
                      6:  * Authors:
                      7:  *  Luiz Capitulino <[email protected]>
                      8:  *  Paolo Bonzini <[email protected]>
                      9:  *
                     10:  * This work is licensed under the terms of the GNU GPL, version 2 or later.
                     11:  * See the COPYING file in the top-level directory.
                     12:  */
                     13: 
                     14: #include <glib.h>
                     15: #include <stdarg.h>
                     16: 
                     17: #include "qapi/qmp-input-visitor.h"
                     18: #include "test-qapi-types.h"
                     19: #include "test-qapi-visit.h"
                     20: #include "qemu-objects.h"
                     21: 
                     22: typedef struct TestInputVisitorData {
                     23:     QObject *obj;
                     24:     QmpInputVisitor *qiv;
                     25: } TestInputVisitorData;
                     26: 
                     27: static void validate_teardown(TestInputVisitorData *data,
                     28:                                const void *unused)
                     29: {
                     30:     qobject_decref(data->obj);
                     31:     data->obj = NULL;
                     32: 
                     33:     if (data->qiv) {
                     34:         qmp_input_visitor_cleanup(data->qiv);
                     35:         data->qiv = NULL;
                     36:     }
                     37: }
                     38: 
                     39: /* This is provided instead of a test setup function so that the JSON
                     40:    string used by the tests are kept in the test functions (and not
                     41:    int main()) */
                     42: static GCC_FMT_ATTR(2, 3)
                     43: Visitor *validate_test_init(TestInputVisitorData *data,
                     44:                              const char *json_string, ...)
                     45: {
                     46:     Visitor *v;
                     47:     va_list ap;
                     48: 
                     49:     va_start(ap, json_string);
                     50:     data->obj = qobject_from_jsonv(json_string, &ap);
                     51:     va_end(ap);
                     52: 
                     53:     g_assert(data->obj != NULL);
                     54: 
                     55:     data->qiv = qmp_input_visitor_new_strict(data->obj);
                     56:     g_assert(data->qiv != NULL);
                     57: 
                     58:     v = qmp_input_get_visitor(data->qiv);
                     59:     g_assert(v != NULL);
                     60: 
                     61:     return v;
                     62: }
                     63: 
                     64: typedef struct TestStruct
                     65: {
                     66:     int64_t integer;
                     67:     bool boolean;
                     68:     char *string;
                     69: } TestStruct;
                     70: 
                     71: static void visit_type_TestStruct(Visitor *v, TestStruct **obj,
                     72:                                   const char *name, Error **errp)
                     73: {
                     74:     visit_start_struct(v, (void **)obj, "TestStruct", name, sizeof(TestStruct),
                     75:                        errp);
                     76: 
                     77:     visit_type_int(v, &(*obj)->integer, "integer", errp);
                     78:     visit_type_bool(v, &(*obj)->boolean, "boolean", errp);
                     79:     visit_type_str(v, &(*obj)->string, "string", errp);
                     80: 
                     81:     visit_end_struct(v, errp);
                     82: }
                     83: 
                     84: static void test_validate_struct(TestInputVisitorData *data,
                     85:                                   const void *unused)
                     86: {
                     87:     TestStruct *p = NULL;
                     88:     Error *errp = NULL;
                     89:     Visitor *v;
                     90: 
                     91:     v = validate_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }");
                     92: 
                     93:     visit_type_TestStruct(v, &p, NULL, &errp);
                     94:     g_assert(!error_is_set(&errp));
                     95:     g_free(p->string);
                     96:     g_free(p);
                     97: }
                     98: 
                     99: static void test_validate_struct_nested(TestInputVisitorData *data,
                    100:                                          const void *unused)
                    101: {
                    102:     UserDefNested *udp = NULL;
                    103:     Error *errp = NULL;
                    104:     Visitor *v;
                    105: 
                    106:     v = validate_test_init(data, "{ 'string0': 'string0', 'dict1': { 'string1': 'string1', 'dict2': { 'userdef1': { 'integer': 42, 'string': 'string' }, 'string2': 'string2'}}}");
                    107: 
                    108:     visit_type_UserDefNested(v, &udp, NULL, &errp);
                    109:     g_assert(!error_is_set(&errp));
                    110:     qapi_free_UserDefNested(udp);
                    111: }
                    112: 
                    113: static void test_validate_list(TestInputVisitorData *data,
                    114:                                 const void *unused)
                    115: {
                    116:     UserDefOneList *head = NULL;
                    117:     Error *errp = NULL;
                    118:     Visitor *v;
                    119: 
                    120:     v = validate_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44 } ]");
                    121: 
                    122:     visit_type_UserDefOneList(v, &head, NULL, &errp);
                    123:     g_assert(!error_is_set(&errp));
                    124:     qapi_free_UserDefOneList(head);
                    125: }
                    126: 
                    127: static void test_validate_union(TestInputVisitorData *data,
                    128:                                  const void *unused)
                    129: {
                    130:     UserDefUnion *tmp = NULL;
                    131:     Visitor *v;
                    132:     Error *errp = NULL;
                    133: 
                    134:     v = validate_test_init(data, "{ 'type': 'b', 'data' : { 'integer': 42 } }");
                    135: 
                    136:     visit_type_UserDefUnion(v, &tmp, NULL, &errp);
                    137:     g_assert(!error_is_set(&errp));
                    138:     qapi_free_UserDefUnion(tmp);
                    139: }
                    140: 
                    141: static void test_validate_fail_struct(TestInputVisitorData *data,
                    142:                                        const void *unused)
                    143: {
                    144:     TestStruct *p = NULL;
                    145:     Error *errp = NULL;
                    146:     Visitor *v;
                    147: 
                    148:     v = validate_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo', 'extra': 42 }");
                    149: 
                    150:     visit_type_TestStruct(v, &p, NULL, &errp);
                    151:     g_assert(error_is_set(&errp));
                    152:     if (p) {
                    153:         g_free(p->string);
                    154:     }
                    155:     g_free(p);
                    156: }
                    157: 
                    158: static void test_validate_fail_struct_nested(TestInputVisitorData *data,
                    159:                                               const void *unused)
                    160: {
                    161:     UserDefNested *udp = NULL;
                    162:     Error *errp = NULL;
                    163:     Visitor *v;
                    164: 
                    165:     v = validate_test_init(data, "{ 'string0': 'string0', 'dict1': { 'string1': 'string1', 'dict2': { 'userdef1': { 'integer': 42, 'string': 'string', 'extra': [42, 23, {'foo':'bar'}] }, 'string2': 'string2'}}}");
                    166: 
                    167:     visit_type_UserDefNested(v, &udp, NULL, &errp);
                    168:     g_assert(error_is_set(&errp));
                    169:     qapi_free_UserDefNested(udp);
                    170: }
                    171: 
                    172: static void test_validate_fail_list(TestInputVisitorData *data,
                    173:                                      const void *unused)
                    174: {
                    175:     UserDefOneList *head = NULL;
                    176:     Error *errp = NULL;
                    177:     Visitor *v;
                    178: 
                    179:     v = validate_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44, 'extra': 'ggg' } ]");
                    180: 
                    181:     visit_type_UserDefOneList(v, &head, NULL, &errp);
                    182:     g_assert(error_is_set(&errp));
                    183:     qapi_free_UserDefOneList(head);
                    184: }
                    185: 
                    186: static void test_validate_fail_union(TestInputVisitorData *data,
                    187:                                       const void *unused)
                    188: {
                    189:     UserDefUnion *tmp = NULL;
                    190:     Error *errp = NULL;
                    191:     Visitor *v;
                    192: 
                    193:     v = validate_test_init(data, "{ 'type': 'b', 'data' : { 'integer': 42 }, 'extra': 'yyy' }");
                    194: 
                    195:     visit_type_UserDefUnion(v, &tmp, NULL, &errp);
                    196:     g_assert(error_is_set(&errp));
                    197:     qapi_free_UserDefUnion(tmp);
                    198: }
                    199: 
                    200: static void validate_test_add(const char *testpath,
                    201:                                TestInputVisitorData *data,
                    202:                                void (*test_func)(TestInputVisitorData *data, const void *user_data))
                    203: {
                    204:     g_test_add(testpath, TestInputVisitorData, data, NULL, test_func,
                    205:                validate_teardown);
                    206: }
                    207: 
                    208: int main(int argc, char **argv)
                    209: {
                    210:     TestInputVisitorData testdata;
                    211: 
                    212:     g_test_init(&argc, &argv, NULL);
                    213: 
                    214:     validate_test_add("/visitor/input-strict/pass/struct",
                    215:                        &testdata, test_validate_struct);
                    216:     validate_test_add("/visitor/input-strict/pass/struct-nested",
                    217:                        &testdata, test_validate_struct_nested);
                    218:     validate_test_add("/visitor/input-strict/pass/list",
                    219:                        &testdata, test_validate_list);
                    220:     validate_test_add("/visitor/input-strict/pass/union",
                    221:                        &testdata, test_validate_union);
                    222:     validate_test_add("/visitor/input-strict/fail/struct",
                    223:                        &testdata, test_validate_fail_struct);
                    224:     validate_test_add("/visitor/input-strict/fail/struct-nested",
                    225:                        &testdata, test_validate_fail_struct_nested);
                    226:     validate_test_add("/visitor/input-strict/fail/list",
                    227:                        &testdata, test_validate_fail_list);
                    228:     validate_test_add("/visitor/input-strict/fail/union",
                    229:                        &testdata, test_validate_fail_union);
                    230: 
                    231:     g_test_run();
                    232: 
                    233:     return 0;
                    234: }

unix.superglobalmegacorp.com

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