Statistics
| Branch: | Revision:

root / tests / test-opts-visitor.c @ 5e954943

History | View | Annotate | Download (9.3 kB)

1 3953e3a5 Laszlo Ersek
/*
2 3953e3a5 Laszlo Ersek
 * Options Visitor unit-tests.
3 3953e3a5 Laszlo Ersek
 *
4 3953e3a5 Laszlo Ersek
 * Copyright (C) 2013 Red Hat, Inc.
5 3953e3a5 Laszlo Ersek
 *
6 3953e3a5 Laszlo Ersek
 * Authors:
7 3953e3a5 Laszlo Ersek
 *   Laszlo Ersek <lersek@redhat.com> (based on test-string-output-visitor)
8 3953e3a5 Laszlo Ersek
 *
9 3953e3a5 Laszlo Ersek
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
10 3953e3a5 Laszlo Ersek
 * See the COPYING file in the top-level directory.
11 3953e3a5 Laszlo Ersek
 */
12 3953e3a5 Laszlo Ersek
13 3953e3a5 Laszlo Ersek
#include <glib.h>
14 3953e3a5 Laszlo Ersek
15 3953e3a5 Laszlo Ersek
#include "qemu/config-file.h"     /* qemu_add_opts() */
16 3953e3a5 Laszlo Ersek
#include "qemu/option.h"          /* qemu_opts_parse() */
17 3953e3a5 Laszlo Ersek
#include "qapi/opts-visitor.h"    /* opts_visitor_new() */
18 3953e3a5 Laszlo Ersek
#include "test-qapi-visit.h"      /* visit_type_UserDefOptions() */
19 3953e3a5 Laszlo Ersek
#include "qapi/dealloc-visitor.h" /* qapi_dealloc_visitor_new() */
20 3953e3a5 Laszlo Ersek
21 3953e3a5 Laszlo Ersek
static QemuOptsList userdef_opts = {
22 3953e3a5 Laszlo Ersek
    .name = "userdef",
23 3953e3a5 Laszlo Ersek
    .head = QTAILQ_HEAD_INITIALIZER(userdef_opts.head),
24 3953e3a5 Laszlo Ersek
    .desc = { { 0 } } /* validated with OptsVisitor */
25 3953e3a5 Laszlo Ersek
};
26 3953e3a5 Laszlo Ersek
27 3953e3a5 Laszlo Ersek
/* fixture (= glib test case context) and test case manipulation */
28 3953e3a5 Laszlo Ersek
29 3953e3a5 Laszlo Ersek
typedef struct OptsVisitorFixture {
30 3953e3a5 Laszlo Ersek
    UserDefOptions *userdef;
31 3953e3a5 Laszlo Ersek
    Error *err;
32 3953e3a5 Laszlo Ersek
} OptsVisitorFixture;
33 3953e3a5 Laszlo Ersek
34 3953e3a5 Laszlo Ersek
35 3953e3a5 Laszlo Ersek
static void
36 3953e3a5 Laszlo Ersek
setup_fixture(OptsVisitorFixture *f, gconstpointer test_data)
37 3953e3a5 Laszlo Ersek
{
38 3953e3a5 Laszlo Ersek
    const char *opts_string = test_data;
39 3953e3a5 Laszlo Ersek
    QemuOpts *opts;
40 3953e3a5 Laszlo Ersek
    OptsVisitor *ov;
41 3953e3a5 Laszlo Ersek
42 3953e3a5 Laszlo Ersek
    opts = qemu_opts_parse(qemu_find_opts("userdef"), opts_string, 0);
43 3953e3a5 Laszlo Ersek
    g_assert(opts != NULL);
44 3953e3a5 Laszlo Ersek
45 3953e3a5 Laszlo Ersek
    ov = opts_visitor_new(opts);
46 3953e3a5 Laszlo Ersek
    visit_type_UserDefOptions(opts_get_visitor(ov), &f->userdef, NULL,
47 3953e3a5 Laszlo Ersek
                              &f->err);
48 3953e3a5 Laszlo Ersek
    opts_visitor_cleanup(ov);
49 3953e3a5 Laszlo Ersek
    qemu_opts_del(opts);
50 3953e3a5 Laszlo Ersek
}
51 3953e3a5 Laszlo Ersek
52 3953e3a5 Laszlo Ersek
53 3953e3a5 Laszlo Ersek
static void
54 3953e3a5 Laszlo Ersek
teardown_fixture(OptsVisitorFixture *f, gconstpointer test_data)
55 3953e3a5 Laszlo Ersek
{
56 3953e3a5 Laszlo Ersek
    if (f->userdef != NULL) {
57 3953e3a5 Laszlo Ersek
        QapiDeallocVisitor *dv;
58 3953e3a5 Laszlo Ersek
59 3953e3a5 Laszlo Ersek
        dv = qapi_dealloc_visitor_new();
60 3953e3a5 Laszlo Ersek
        visit_type_UserDefOptions(qapi_dealloc_get_visitor(dv), &f->userdef,
61 3953e3a5 Laszlo Ersek
                                  NULL, NULL);
62 3953e3a5 Laszlo Ersek
        qapi_dealloc_visitor_cleanup(dv);
63 3953e3a5 Laszlo Ersek
    }
64 3953e3a5 Laszlo Ersek
    error_free(f->err);
65 3953e3a5 Laszlo Ersek
}
66 3953e3a5 Laszlo Ersek
67 3953e3a5 Laszlo Ersek
68 3953e3a5 Laszlo Ersek
static void
69 3953e3a5 Laszlo Ersek
add_test(const char *testpath,
70 3953e3a5 Laszlo Ersek
         void (*test_func)(OptsVisitorFixture *f, gconstpointer test_data),
71 3953e3a5 Laszlo Ersek
         gconstpointer test_data)
72 3953e3a5 Laszlo Ersek
{
73 3953e3a5 Laszlo Ersek
    g_test_add(testpath, OptsVisitorFixture, test_data, setup_fixture,
74 3953e3a5 Laszlo Ersek
               test_func, teardown_fixture);
75 3953e3a5 Laszlo Ersek
}
76 3953e3a5 Laszlo Ersek
77 3953e3a5 Laszlo Ersek
/* test output evaluation */
78 3953e3a5 Laszlo Ersek
79 3953e3a5 Laszlo Ersek
static void
80 3953e3a5 Laszlo Ersek
expect_ok(OptsVisitorFixture *f, gconstpointer test_data)
81 3953e3a5 Laszlo Ersek
{
82 3953e3a5 Laszlo Ersek
    g_assert(f->err == NULL);
83 3953e3a5 Laszlo Ersek
    g_assert(f->userdef != NULL);
84 3953e3a5 Laszlo Ersek
}
85 3953e3a5 Laszlo Ersek
86 3953e3a5 Laszlo Ersek
87 3953e3a5 Laszlo Ersek
static void
88 3953e3a5 Laszlo Ersek
expect_fail(OptsVisitorFixture *f, gconstpointer test_data)
89 3953e3a5 Laszlo Ersek
{
90 3953e3a5 Laszlo Ersek
    g_assert(f->err != NULL);
91 3953e3a5 Laszlo Ersek
92 3953e3a5 Laszlo Ersek
    /* The error message is printed when this test utility is invoked directly
93 3953e3a5 Laszlo Ersek
     * (ie. without gtester) and the --verbose flag is passed:
94 3953e3a5 Laszlo Ersek
     *
95 3953e3a5 Laszlo Ersek
     * tests/test-opts-visitor --verbose
96 3953e3a5 Laszlo Ersek
     */
97 3953e3a5 Laszlo Ersek
    g_test_message("'%s': %s", (const char *)test_data,
98 3953e3a5 Laszlo Ersek
                   error_get_pretty(f->err));
99 3953e3a5 Laszlo Ersek
}
100 3953e3a5 Laszlo Ersek
101 3953e3a5 Laszlo Ersek
102 3953e3a5 Laszlo Ersek
static void
103 3953e3a5 Laszlo Ersek
test_value(OptsVisitorFixture *f, gconstpointer test_data)
104 3953e3a5 Laszlo Ersek
{
105 3953e3a5 Laszlo Ersek
    uint64_t magic, bitval;
106 3953e3a5 Laszlo Ersek
    intList *i64;
107 3953e3a5 Laszlo Ersek
    uint64List *u64;
108 3953e3a5 Laszlo Ersek
    uint16List *u16;
109 3953e3a5 Laszlo Ersek
110 3953e3a5 Laszlo Ersek
    expect_ok(f, test_data);
111 3953e3a5 Laszlo Ersek
112 3953e3a5 Laszlo Ersek
    magic = 0;
113 3953e3a5 Laszlo Ersek
    for (i64 = f->userdef->i64; i64 != NULL; i64 = i64->next) {
114 3953e3a5 Laszlo Ersek
        g_assert(-16 <= i64->value && i64->value < 64-16);
115 3953e3a5 Laszlo Ersek
        bitval = 1ull << (i64->value + 16);
116 3953e3a5 Laszlo Ersek
        g_assert((magic & bitval) == 0);
117 3953e3a5 Laszlo Ersek
        magic |= bitval;
118 3953e3a5 Laszlo Ersek
    }
119 3953e3a5 Laszlo Ersek
    g_assert(magic == 0xDEADBEEF);
120 3953e3a5 Laszlo Ersek
121 3953e3a5 Laszlo Ersek
    magic = 0;
122 3953e3a5 Laszlo Ersek
    for (u64 = f->userdef->u64; u64 != NULL; u64 = u64->next) {
123 3953e3a5 Laszlo Ersek
        g_assert(u64->value < 64);
124 3953e3a5 Laszlo Ersek
        bitval = 1ull << u64->value;
125 3953e3a5 Laszlo Ersek
        g_assert((magic & bitval) == 0);
126 3953e3a5 Laszlo Ersek
        magic |= bitval;
127 3953e3a5 Laszlo Ersek
    }
128 5cb6be2c Stefan Hajnoczi
    g_assert(magic == 0xBADC0FFEE0DDF00DULL);
129 3953e3a5 Laszlo Ersek
130 3953e3a5 Laszlo Ersek
    magic = 0;
131 3953e3a5 Laszlo Ersek
    for (u16 = f->userdef->u16; u16 != NULL; u16 = u16->next) {
132 3953e3a5 Laszlo Ersek
        g_assert(u16->value < 64);
133 3953e3a5 Laszlo Ersek
        bitval = 1ull << u16->value;
134 3953e3a5 Laszlo Ersek
        g_assert((magic & bitval) == 0);
135 3953e3a5 Laszlo Ersek
        magic |= bitval;
136 3953e3a5 Laszlo Ersek
    }
137 3953e3a5 Laszlo Ersek
    g_assert(magic == 0xD15EA5E);
138 3953e3a5 Laszlo Ersek
}
139 3953e3a5 Laszlo Ersek
140 3953e3a5 Laszlo Ersek
141 3953e3a5 Laszlo Ersek
static void
142 3953e3a5 Laszlo Ersek
expect_i64_min(OptsVisitorFixture *f, gconstpointer test_data)
143 3953e3a5 Laszlo Ersek
{
144 3953e3a5 Laszlo Ersek
    expect_ok(f, test_data);
145 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->has_i64);
146 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->i64->next == NULL);
147 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->i64->value == INT64_MIN);
148 3953e3a5 Laszlo Ersek
}
149 3953e3a5 Laszlo Ersek
150 3953e3a5 Laszlo Ersek
151 3953e3a5 Laszlo Ersek
static void
152 3953e3a5 Laszlo Ersek
expect_i64_max(OptsVisitorFixture *f, gconstpointer test_data)
153 3953e3a5 Laszlo Ersek
{
154 3953e3a5 Laszlo Ersek
    expect_ok(f, test_data);
155 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->has_i64);
156 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->i64->next == NULL);
157 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->i64->value == INT64_MAX);
158 3953e3a5 Laszlo Ersek
}
159 3953e3a5 Laszlo Ersek
160 3953e3a5 Laszlo Ersek
161 3953e3a5 Laszlo Ersek
static void
162 3953e3a5 Laszlo Ersek
expect_zero(OptsVisitorFixture *f, gconstpointer test_data)
163 3953e3a5 Laszlo Ersek
{
164 3953e3a5 Laszlo Ersek
    expect_ok(f, test_data);
165 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->has_u64);
166 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->u64->next == NULL);
167 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->u64->value == 0);
168 3953e3a5 Laszlo Ersek
}
169 3953e3a5 Laszlo Ersek
170 3953e3a5 Laszlo Ersek
171 3953e3a5 Laszlo Ersek
static void
172 3953e3a5 Laszlo Ersek
expect_u64_max(OptsVisitorFixture *f, gconstpointer test_data)
173 3953e3a5 Laszlo Ersek
{
174 3953e3a5 Laszlo Ersek
    expect_ok(f, test_data);
175 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->has_u64);
176 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->u64->next == NULL);
177 3953e3a5 Laszlo Ersek
    g_assert(f->userdef->u64->value == UINT64_MAX);
178 3953e3a5 Laszlo Ersek
}
179 3953e3a5 Laszlo Ersek
180 3953e3a5 Laszlo Ersek
/* test cases */
181 3953e3a5 Laszlo Ersek
182 3953e3a5 Laszlo Ersek
int
183 3953e3a5 Laszlo Ersek
main(int argc, char **argv)
184 3953e3a5 Laszlo Ersek
{
185 3953e3a5 Laszlo Ersek
    g_test_init(&argc, &argv, NULL);
186 3953e3a5 Laszlo Ersek
187 3953e3a5 Laszlo Ersek
    qemu_add_opts(&userdef_opts);
188 3953e3a5 Laszlo Ersek
189 3953e3a5 Laszlo Ersek
    /* Three hexadecimal magic numbers, "dead beef", "bad coffee, odd food" and
190 3953e3a5 Laszlo Ersek
     * "disease", from
191 3953e3a5 Laszlo Ersek
     * <http://en.wikipedia.org/wiki/Magic_number_%28programming%29>, were
192 3953e3a5 Laszlo Ersek
     * converted to binary and dissected into bit ranges. Each magic number is
193 3953e3a5 Laszlo Ersek
     * going to be recomposed using the lists called "i64", "u64" and "u16",
194 3953e3a5 Laszlo Ersek
     * respectively.
195 3953e3a5 Laszlo Ersek
     *
196 3953e3a5 Laszlo Ersek
     * (Note that these types pertain to the individual bit shift counts, not
197 3953e3a5 Laszlo Ersek
     * the magic numbers themselves; the intent is to exercise opts_type_int()
198 3953e3a5 Laszlo Ersek
     * and opts_type_uint64().)
199 3953e3a5 Laszlo Ersek
     *
200 3953e3a5 Laszlo Ersek
     * The "i64" shift counts have been decreased by 16 (decimal) in order to
201 3953e3a5 Laszlo Ersek
     * test negative values as well. Finally, the full list of QemuOpt elements
202 3953e3a5 Laszlo Ersek
     * has been permuted with "shuf".
203 3953e3a5 Laszlo Ersek
     *
204 3953e3a5 Laszlo Ersek
     * Both "i64" and "u64" have some (distinct) single-element ranges
205 3953e3a5 Laszlo Ersek
     * represented as both "a" and "a-a". "u16" is a special case of "i64" (see
206 3953e3a5 Laszlo Ersek
     * visit_type_uint16()), so it wouldn't add a separate test in this regard.
207 3953e3a5 Laszlo Ersek
     */
208 3953e3a5 Laszlo Ersek
209 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/flatten/value", &test_value,
210 3953e3a5 Laszlo Ersek
             "i64=-1-0,u64=12-16,u64=2-3,i64=-11--9,u64=57,u16=9,i64=5-5,"
211 3953e3a5 Laszlo Ersek
             "u16=1-4,u16=20,u64=63-63,i64=-16--13,u64=50-52,i64=14-15,u16=11,"
212 3953e3a5 Laszlo Ersek
             "i64=7,u16=18,i64=2-3,u16=6,u64=54-55,u64=0,u64=18-20,u64=33-43,"
213 3953e3a5 Laszlo Ersek
             "i64=9-12,u16=26-27,u64=59-61,u16=13-16,u64=29-31,u64=22-23,"
214 3953e3a5 Laszlo Ersek
             "u16=24,i64=-7--3");
215 3953e3a5 Laszlo Ersek
216 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/val1/errno",    &expect_fail,
217 3953e3a5 Laszlo Ersek
             "i64=0x8000000000000000");
218 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/val1/empty",    &expect_fail, "i64=");
219 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/val1/trailing", &expect_fail, "i64=5z");
220 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/nonlist",       &expect_fail, "i64x=5-6");
221 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/val2/errno",    &expect_fail,
222 3953e3a5 Laszlo Ersek
             "i64=0x7fffffffffffffff-0x8000000000000000");
223 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/val2/empty",    &expect_fail, "i64=5-");
224 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/val2/trailing", &expect_fail, "i64=5-6z");
225 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/range/empty",   &expect_fail, "i64=6-5");
226 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/range/minval",  &expect_i64_min,
227 3953e3a5 Laszlo Ersek
             "i64=-0x8000000000000000--0x8000000000000000");
228 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/range/maxval",  &expect_i64_max,
229 3953e3a5 Laszlo Ersek
             "i64=0x7fffffffffffffff-0x7fffffffffffffff");
230 3953e3a5 Laszlo Ersek
231 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/val1/errno",    &expect_fail, "u64=-1");
232 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/val1/empty",    &expect_fail, "u64=");
233 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/val1/trailing", &expect_fail, "u64=5z");
234 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/nonlist",       &expect_fail, "u64x=5-6");
235 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/val2/errno",    &expect_fail,
236 3953e3a5 Laszlo Ersek
             "u64=0xffffffffffffffff-0x10000000000000000");
237 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/val2/empty",    &expect_fail, "u64=5-");
238 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/val2/trailing", &expect_fail, "u64=5-6z");
239 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/range/empty",   &expect_fail, "u64=6-5");
240 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/range/minval",  &expect_zero, "u64=0-0");
241 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/range/maxval",  &expect_u64_max,
242 3953e3a5 Laszlo Ersek
             "u64=0xffffffffffffffff-0xffffffffffffffff");
243 3953e3a5 Laszlo Ersek
244 3953e3a5 Laszlo Ersek
    /* Test maximum range sizes. The macro value is open-coded here
245 3953e3a5 Laszlo Ersek
     * *intentionally*; the test case must use concrete values by design. If
246 3953e3a5 Laszlo Ersek
     * OPTS_VISITOR_RANGE_MAX is changed, the following values need to be
247 3953e3a5 Laszlo Ersek
     * recalculated as well. The assert and this comment should help with it.
248 3953e3a5 Laszlo Ersek
     */
249 3953e3a5 Laszlo Ersek
    g_assert(OPTS_VISITOR_RANGE_MAX == 65536);
250 3953e3a5 Laszlo Ersek
251 3953e3a5 Laszlo Ersek
    /* The unsigned case is simple, a u64-u64 difference can always be
252 3953e3a5 Laszlo Ersek
     * represented as a u64.
253 3953e3a5 Laszlo Ersek
     */
254 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/range/max",  &expect_ok,   "u64=0-65535");
255 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/u64/range/2big", &expect_fail, "u64=0-65536");
256 3953e3a5 Laszlo Ersek
257 3953e3a5 Laszlo Ersek
    /* The same cannot be said about an i64-i64 difference. */
258 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/range/max/pos/a", &expect_ok,
259 3953e3a5 Laszlo Ersek
             "i64=0x7fffffffffff0000-0x7fffffffffffffff");
260 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/range/max/pos/b", &expect_ok,
261 3953e3a5 Laszlo Ersek
             "i64=0x7ffffffffffeffff-0x7ffffffffffffffe");
262 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/range/2big/pos",  &expect_fail,
263 3953e3a5 Laszlo Ersek
             "i64=0x7ffffffffffeffff-0x7fffffffffffffff");
264 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/range/max/neg/a", &expect_ok,
265 3953e3a5 Laszlo Ersek
             "i64=-0x8000000000000000--0x7fffffffffff0001");
266 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/range/max/neg/b", &expect_ok,
267 3953e3a5 Laszlo Ersek
             "i64=-0x7fffffffffffffff--0x7fffffffffff0000");
268 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/range/2big/neg",  &expect_fail,
269 3953e3a5 Laszlo Ersek
             "i64=-0x8000000000000000--0x7fffffffffff0000");
270 3953e3a5 Laszlo Ersek
    add_test("/visitor/opts/i64/range/2big/full", &expect_fail,
271 3953e3a5 Laszlo Ersek
             "i64=-0x8000000000000000-0x7fffffffffffffff");
272 3953e3a5 Laszlo Ersek
273 3953e3a5 Laszlo Ersek
    g_test_run();
274 3953e3a5 Laszlo Ersek
    return 0;
275 3953e3a5 Laszlo Ersek
}