Statistics
| Branch: | Revision:

root / tests / test-qmp-input-strict.c @ 5e954943

History | View | Annotate | Download (7 kB)

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