2012-03-22 19:51:10 +08:00
|
|
|
/*
|
|
|
|
* QMP Input Visitor unit-tests (strict mode).
|
|
|
|
*
|
2015-05-04 23:05:06 +08:00
|
|
|
* Copyright (C) 2011-2012, 2015 Red Hat Inc.
|
2012-03-22 19:51:10 +08:00
|
|
|
*
|
|
|
|
* Authors:
|
|
|
|
* Luiz Capitulino <lcapitulino@redhat.com>
|
|
|
|
* Paolo Bonzini <pbonzini@redhat.com>
|
|
|
|
*
|
|
|
|
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
|
|
|
* See the COPYING file in the top-level directory.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <glib.h>
|
|
|
|
#include <stdarg.h>
|
|
|
|
|
2012-12-06 18:22:34 +08:00
|
|
|
#include "qemu-common.h"
|
2012-03-22 19:51:10 +08:00
|
|
|
#include "qapi/qmp-input-visitor.h"
|
|
|
|
#include "test-qapi-types.h"
|
|
|
|
#include "test-qapi-visit.h"
|
2012-12-18 01:19:43 +08:00
|
|
|
#include "qapi/qmp/types.h"
|
2012-03-22 19:51:10 +08:00
|
|
|
|
|
|
|
typedef struct TestInputVisitorData {
|
|
|
|
QObject *obj;
|
|
|
|
QmpInputVisitor *qiv;
|
|
|
|
} TestInputVisitorData;
|
|
|
|
|
|
|
|
static void validate_teardown(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
|
|
|
{
|
|
|
|
qobject_decref(data->obj);
|
|
|
|
data->obj = NULL;
|
|
|
|
|
|
|
|
if (data->qiv) {
|
|
|
|
qmp_input_visitor_cleanup(data->qiv);
|
|
|
|
data->qiv = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* This is provided instead of a test setup function so that the JSON
|
|
|
|
string used by the tests are kept in the test functions (and not
|
|
|
|
int main()) */
|
|
|
|
static GCC_FMT_ATTR(2, 3)
|
|
|
|
Visitor *validate_test_init(TestInputVisitorData *data,
|
|
|
|
const char *json_string, ...)
|
|
|
|
{
|
|
|
|
Visitor *v;
|
|
|
|
va_list ap;
|
|
|
|
|
|
|
|
va_start(ap, json_string);
|
|
|
|
data->obj = qobject_from_jsonv(json_string, &ap);
|
|
|
|
va_end(ap);
|
|
|
|
|
|
|
|
g_assert(data->obj != NULL);
|
|
|
|
|
|
|
|
data->qiv = qmp_input_visitor_new_strict(data->obj);
|
|
|
|
g_assert(data->qiv != NULL);
|
|
|
|
|
|
|
|
v = qmp_input_get_visitor(data->qiv);
|
|
|
|
g_assert(v != NULL);
|
|
|
|
|
|
|
|
return v;
|
|
|
|
}
|
|
|
|
|
|
|
|
typedef struct TestStruct
|
|
|
|
{
|
|
|
|
int64_t integer;
|
|
|
|
bool boolean;
|
|
|
|
char *string;
|
|
|
|
} TestStruct;
|
|
|
|
|
|
|
|
static void visit_type_TestStruct(Visitor *v, TestStruct **obj,
|
|
|
|
const char *name, Error **errp)
|
|
|
|
{
|
2014-05-07 15:53:53 +08:00
|
|
|
Error *err = NULL;
|
|
|
|
|
2012-03-22 19:51:10 +08:00
|
|
|
visit_start_struct(v, (void **)obj, "TestStruct", name, sizeof(TestStruct),
|
2014-05-07 15:53:53 +08:00
|
|
|
&err);
|
|
|
|
if (err) {
|
|
|
|
goto out;
|
|
|
|
}
|
|
|
|
|
|
|
|
visit_type_int(v, &(*obj)->integer, "integer", &err);
|
qapi: Replace uncommon use of the error API by the common one
We commonly use the error API like this:
err = NULL;
foo(..., &err);
if (err) {
goto out;
}
bar(..., &err);
Every error source is checked separately. The second function is only
called when the first one succeeds. Both functions are free to pass
their argument to error_set(). Because error_set() asserts no error
has been set, this effectively means they must not be called with an
error set.
The qapi-generated code uses the error API differently:
// *errp was initialized to NULL somewhere up the call chain
frob(..., errp);
gnat(..., errp);
Errors accumulate in *errp: first error wins, subsequent errors get
dropped. To make this work, the second function does nothing when
called with an error set. Requires non-null errp, or else the second
function can't see the first one fail.
This usage has also bled into visitor tests, and two device model
object property getters rtc_get_date() and balloon_stats_get_all().
With the "accumulate" technique, you need fewer error checks in
callers, and buy that with an error check in every callee. Can be
nice.
However, mixing the two techniques is confusing. You can't use the
"accumulate" technique with functions designed for the "check
separately" technique. You can use the "check separately" technique
with functions designed for the "accumulate" technique, but then
error_set() can't catch you setting an error more than once.
Standardize on the "check separately" technique for now, because it's
overwhelmingly prevalent.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
2014-05-07 15:53:54 +08:00
|
|
|
if (err) {
|
|
|
|
goto out_end;
|
|
|
|
}
|
2014-05-07 15:53:53 +08:00
|
|
|
visit_type_bool(v, &(*obj)->boolean, "boolean", &err);
|
qapi: Replace uncommon use of the error API by the common one
We commonly use the error API like this:
err = NULL;
foo(..., &err);
if (err) {
goto out;
}
bar(..., &err);
Every error source is checked separately. The second function is only
called when the first one succeeds. Both functions are free to pass
their argument to error_set(). Because error_set() asserts no error
has been set, this effectively means they must not be called with an
error set.
The qapi-generated code uses the error API differently:
// *errp was initialized to NULL somewhere up the call chain
frob(..., errp);
gnat(..., errp);
Errors accumulate in *errp: first error wins, subsequent errors get
dropped. To make this work, the second function does nothing when
called with an error set. Requires non-null errp, or else the second
function can't see the first one fail.
This usage has also bled into visitor tests, and two device model
object property getters rtc_get_date() and balloon_stats_get_all().
With the "accumulate" technique, you need fewer error checks in
callers, and buy that with an error check in every callee. Can be
nice.
However, mixing the two techniques is confusing. You can't use the
"accumulate" technique with functions designed for the "check
separately" technique. You can use the "check separately" technique
with functions designed for the "accumulate" technique, but then
error_set() can't catch you setting an error more than once.
Standardize on the "check separately" technique for now, because it's
overwhelmingly prevalent.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
2014-05-07 15:53:54 +08:00
|
|
|
if (err) {
|
|
|
|
goto out_end;
|
|
|
|
}
|
2014-05-07 15:53:53 +08:00
|
|
|
visit_type_str(v, &(*obj)->string, "string", &err);
|
2012-03-22 19:51:10 +08:00
|
|
|
|
qapi: Replace uncommon use of the error API by the common one
We commonly use the error API like this:
err = NULL;
foo(..., &err);
if (err) {
goto out;
}
bar(..., &err);
Every error source is checked separately. The second function is only
called when the first one succeeds. Both functions are free to pass
their argument to error_set(). Because error_set() asserts no error
has been set, this effectively means they must not be called with an
error set.
The qapi-generated code uses the error API differently:
// *errp was initialized to NULL somewhere up the call chain
frob(..., errp);
gnat(..., errp);
Errors accumulate in *errp: first error wins, subsequent errors get
dropped. To make this work, the second function does nothing when
called with an error set. Requires non-null errp, or else the second
function can't see the first one fail.
This usage has also bled into visitor tests, and two device model
object property getters rtc_get_date() and balloon_stats_get_all().
With the "accumulate" technique, you need fewer error checks in
callers, and buy that with an error check in every callee. Can be
nice.
However, mixing the two techniques is confusing. You can't use the
"accumulate" technique with functions designed for the "check
separately" technique. You can use the "check separately" technique
with functions designed for the "accumulate" technique, but then
error_set() can't catch you setting an error more than once.
Standardize on the "check separately" technique for now, because it's
overwhelmingly prevalent.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com>
2014-05-07 15:53:54 +08:00
|
|
|
out_end:
|
|
|
|
error_propagate(errp, err);
|
|
|
|
err = NULL;
|
2014-05-07 15:53:53 +08:00
|
|
|
visit_end_struct(v, &err);
|
|
|
|
out:
|
|
|
|
error_propagate(errp, err);
|
2012-03-22 19:51:10 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void test_validate_struct(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
|
|
|
{
|
|
|
|
TestStruct *p = NULL;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2012-03-22 19:51:10 +08:00
|
|
|
Visitor *v;
|
|
|
|
|
|
|
|
v = validate_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }");
|
|
|
|
|
2014-05-02 19:26:29 +08:00
|
|
|
visit_type_TestStruct(v, &p, NULL, &err);
|
|
|
|
g_assert(!err);
|
2012-03-22 19:51:10 +08:00
|
|
|
g_free(p->string);
|
|
|
|
g_free(p);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void test_validate_struct_nested(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
|
|
|
{
|
2015-05-04 23:05:29 +08:00
|
|
|
UserDefTwo *udp = NULL;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2012-03-22 19:51:10 +08:00
|
|
|
Visitor *v;
|
|
|
|
|
2015-05-04 23:05:29 +08:00
|
|
|
v = validate_test_init(data, "{ 'string0': 'string0', "
|
|
|
|
"'dict1': { 'string1': 'string1', "
|
|
|
|
"'dict2': { 'userdef': { 'integer': 42, "
|
|
|
|
"'string': 'string' }, 'string': 'string2'}}}");
|
2012-03-22 19:51:10 +08:00
|
|
|
|
2015-05-04 23:05:29 +08:00
|
|
|
visit_type_UserDefTwo(v, &udp, NULL, &err);
|
2014-05-02 19:26:29 +08:00
|
|
|
g_assert(!err);
|
2015-05-04 23:05:29 +08:00
|
|
|
qapi_free_UserDefTwo(udp);
|
2012-03-22 19:51:10 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void test_validate_list(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
|
|
|
{
|
|
|
|
UserDefOneList *head = NULL;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2012-03-22 19:51:10 +08:00
|
|
|
Visitor *v;
|
|
|
|
|
|
|
|
v = validate_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44 } ]");
|
|
|
|
|
2014-05-02 19:26:29 +08:00
|
|
|
visit_type_UserDefOneList(v, &head, NULL, &err);
|
|
|
|
g_assert(!err);
|
2012-03-22 19:51:10 +08:00
|
|
|
qapi_free_UserDefOneList(head);
|
|
|
|
}
|
|
|
|
|
2015-05-04 23:05:06 +08:00
|
|
|
static void test_validate_union_native_list(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
2012-03-22 19:51:10 +08:00
|
|
|
{
|
2015-05-04 23:05:06 +08:00
|
|
|
UserDefNativeListUnion *tmp = NULL;
|
2012-03-22 19:51:10 +08:00
|
|
|
Visitor *v;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2012-03-22 19:51:10 +08:00
|
|
|
|
2015-05-04 23:05:06 +08:00
|
|
|
v = validate_test_init(data, "{ 'type': 'integer', 'data' : [ 1, 2 ] }");
|
2012-03-22 19:51:10 +08:00
|
|
|
|
2015-05-04 23:05:06 +08:00
|
|
|
visit_type_UserDefNativeListUnion(v, &tmp, NULL, &err);
|
2014-05-02 19:26:29 +08:00
|
|
|
g_assert(!err);
|
2015-05-04 23:05:06 +08:00
|
|
|
qapi_free_UserDefNativeListUnion(tmp);
|
2012-03-22 19:51:10 +08:00
|
|
|
}
|
|
|
|
|
2014-03-01 15:40:33 +08:00
|
|
|
static void test_validate_union_flat(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
|
|
|
{
|
|
|
|
UserDefFlatUnion *tmp = NULL;
|
|
|
|
Visitor *v;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2014-03-01 15:40:33 +08:00
|
|
|
|
2014-03-05 10:44:39 +08:00
|
|
|
v = validate_test_init(data,
|
|
|
|
"{ 'enum1': 'value1', "
|
qapi-visit: Convert to QAPISchemaVisitor, fixing bugs
Fixes flat unions to visit the base's base members (the previous
commit merely added them to the struct). Same test case.
Patch's effect on visit_type_UserDefFlatUnion():
static void visit_type_UserDefFlatUnion_fields(Visitor *m, UserDefFlatUnion **obj, Error **errp)
{
Error *err = NULL;
+ visit_type_int(m, &(*obj)->integer, "integer", &err);
+ if (err) {
+ goto out;
+ }
visit_type_str(m, &(*obj)->string, "string", &err);
if (err) {
goto out;
Test cases updated for the bug fix.
Fixes alternates to generate a visitor for their implicit enumeration
type. None of them are currently used, obviously. Example:
block-core.json's BlockdevRef now generates
visit_type_BlockdevRefKind().
Code is generated in a different order now, and therefore has got a
few new forward declarations. Doesn't matter.
The guard QAPI_VISIT_BUILTIN_VISITOR_DECL is renamed to
QAPI_VISIT_BUILTIN.
The previous commit's two ugly special cases exist here, too. Mark
both TODO.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Daniel P. Berrange <berrange@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
2015-09-16 19:06:10 +08:00
|
|
|
"'integer': 41, "
|
2014-03-05 10:44:39 +08:00
|
|
|
"'string': 'str', "
|
|
|
|
"'boolean': true }");
|
2014-03-01 15:40:33 +08:00
|
|
|
|
2014-05-02 19:26:29 +08:00
|
|
|
visit_type_UserDefFlatUnion(v, &tmp, NULL, &err);
|
|
|
|
g_assert(!err);
|
2014-03-01 15:40:33 +08:00
|
|
|
qapi_free_UserDefFlatUnion(tmp);
|
|
|
|
}
|
|
|
|
|
2015-05-04 23:05:11 +08:00
|
|
|
static void test_validate_alternate(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
2014-03-01 15:40:30 +08:00
|
|
|
{
|
2015-05-04 23:05:11 +08:00
|
|
|
UserDefAlternate *tmp = NULL;
|
2014-03-01 15:40:30 +08:00
|
|
|
Visitor *v;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2014-03-01 15:40:30 +08:00
|
|
|
|
|
|
|
v = validate_test_init(data, "42");
|
|
|
|
|
2015-05-04 23:05:11 +08:00
|
|
|
visit_type_UserDefAlternate(v, &tmp, NULL, &err);
|
2014-05-02 19:26:29 +08:00
|
|
|
g_assert(!err);
|
2015-05-04 23:05:11 +08:00
|
|
|
qapi_free_UserDefAlternate(tmp);
|
2014-03-01 15:40:30 +08:00
|
|
|
}
|
|
|
|
|
2012-03-22 19:51:10 +08:00
|
|
|
static void test_validate_fail_struct(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
|
|
|
{
|
|
|
|
TestStruct *p = NULL;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2012-03-22 19:51:10 +08:00
|
|
|
Visitor *v;
|
|
|
|
|
|
|
|
v = validate_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo', 'extra': 42 }");
|
|
|
|
|
2014-05-02 19:26:29 +08:00
|
|
|
visit_type_TestStruct(v, &p, NULL, &err);
|
|
|
|
g_assert(err);
|
2012-03-22 19:51:10 +08:00
|
|
|
if (p) {
|
|
|
|
g_free(p->string);
|
|
|
|
}
|
|
|
|
g_free(p);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void test_validate_fail_struct_nested(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
|
|
|
{
|
2015-05-04 23:05:29 +08:00
|
|
|
UserDefTwo *udp = NULL;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2012-03-22 19:51:10 +08:00
|
|
|
Visitor *v;
|
|
|
|
|
|
|
|
v = validate_test_init(data, "{ 'string0': 'string0', 'dict1': { 'string1': 'string1', 'dict2': { 'userdef1': { 'integer': 42, 'string': 'string', 'extra': [42, 23, {'foo':'bar'}] }, 'string2': 'string2'}}}");
|
|
|
|
|
2015-05-04 23:05:29 +08:00
|
|
|
visit_type_UserDefTwo(v, &udp, NULL, &err);
|
2014-05-02 19:26:29 +08:00
|
|
|
g_assert(err);
|
2015-05-04 23:05:29 +08:00
|
|
|
qapi_free_UserDefTwo(udp);
|
2012-03-22 19:51:10 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void test_validate_fail_list(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
|
|
|
{
|
|
|
|
UserDefOneList *head = NULL;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2012-03-22 19:51:10 +08:00
|
|
|
Visitor *v;
|
|
|
|
|
|
|
|
v = validate_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44, 'extra': 'ggg' } ]");
|
|
|
|
|
2014-05-02 19:26:29 +08:00
|
|
|
visit_type_UserDefOneList(v, &head, NULL, &err);
|
|
|
|
g_assert(err);
|
2012-03-22 19:51:10 +08:00
|
|
|
qapi_free_UserDefOneList(head);
|
|
|
|
}
|
|
|
|
|
2015-05-04 23:05:06 +08:00
|
|
|
static void test_validate_fail_union_native_list(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
2012-03-22 19:51:10 +08:00
|
|
|
{
|
2015-05-04 23:05:06 +08:00
|
|
|
UserDefNativeListUnion *tmp = NULL;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2012-03-22 19:51:10 +08:00
|
|
|
Visitor *v;
|
|
|
|
|
2015-05-04 23:05:06 +08:00
|
|
|
v = validate_test_init(data,
|
|
|
|
"{ 'type': 'integer', 'data' : [ 'string' ] }");
|
2012-03-22 19:51:10 +08:00
|
|
|
|
2015-05-04 23:05:06 +08:00
|
|
|
visit_type_UserDefNativeListUnion(v, &tmp, NULL, &err);
|
2014-05-02 19:26:29 +08:00
|
|
|
g_assert(err);
|
2015-05-04 23:05:06 +08:00
|
|
|
qapi_free_UserDefNativeListUnion(tmp);
|
2012-03-22 19:51:10 +08:00
|
|
|
}
|
|
|
|
|
2014-03-01 15:40:33 +08:00
|
|
|
static void test_validate_fail_union_flat(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
|
|
|
{
|
|
|
|
UserDefFlatUnion *tmp = NULL;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2014-03-01 15:40:33 +08:00
|
|
|
Visitor *v;
|
|
|
|
|
|
|
|
v = validate_test_init(data, "{ 'string': 'c', 'integer': 41, 'boolean': true }");
|
|
|
|
|
2014-05-02 19:26:29 +08:00
|
|
|
visit_type_UserDefFlatUnion(v, &tmp, NULL, &err);
|
|
|
|
g_assert(err);
|
2014-03-01 15:40:33 +08:00
|
|
|
qapi_free_UserDefFlatUnion(tmp);
|
|
|
|
}
|
|
|
|
|
2014-09-19 04:36:42 +08:00
|
|
|
static void test_validate_fail_union_flat_no_discrim(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
|
|
|
{
|
|
|
|
UserDefFlatUnion2 *tmp = NULL;
|
|
|
|
Error *err = NULL;
|
|
|
|
Visitor *v;
|
|
|
|
|
|
|
|
/* test situation where discriminator field ('enum1' here) is missing */
|
qapi-visit: Convert to QAPISchemaVisitor, fixing bugs
Fixes flat unions to visit the base's base members (the previous
commit merely added them to the struct). Same test case.
Patch's effect on visit_type_UserDefFlatUnion():
static void visit_type_UserDefFlatUnion_fields(Visitor *m, UserDefFlatUnion **obj, Error **errp)
{
Error *err = NULL;
+ visit_type_int(m, &(*obj)->integer, "integer", &err);
+ if (err) {
+ goto out;
+ }
visit_type_str(m, &(*obj)->string, "string", &err);
if (err) {
goto out;
Test cases updated for the bug fix.
Fixes alternates to generate a visitor for their implicit enumeration
type. None of them are currently used, obviously. Example:
block-core.json's BlockdevRef now generates
visit_type_BlockdevRefKind().
Code is generated in a different order now, and therefore has got a
few new forward declarations. Doesn't matter.
The guard QAPI_VISIT_BUILTIN_VISITOR_DECL is renamed to
QAPI_VISIT_BUILTIN.
The previous commit's two ugly special cases exist here, too. Mark
both TODO.
Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Daniel P. Berrange <berrange@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
2015-09-16 19:06:10 +08:00
|
|
|
v = validate_test_init(data, "{ 'integer': 42, 'string': 'c', 'string1': 'd', 'string2': 'e' }");
|
2014-09-19 04:36:42 +08:00
|
|
|
|
|
|
|
visit_type_UserDefFlatUnion2(v, &tmp, NULL, &err);
|
|
|
|
g_assert(err);
|
|
|
|
qapi_free_UserDefFlatUnion2(tmp);
|
|
|
|
}
|
|
|
|
|
2015-05-04 23:05:11 +08:00
|
|
|
static void test_validate_fail_alternate(TestInputVisitorData *data,
|
|
|
|
const void *unused)
|
2014-03-01 15:40:30 +08:00
|
|
|
{
|
2015-05-04 23:05:11 +08:00
|
|
|
UserDefAlternate *tmp = NULL;
|
2014-03-01 15:40:30 +08:00
|
|
|
Visitor *v;
|
2014-05-02 19:26:29 +08:00
|
|
|
Error *err = NULL;
|
2014-03-01 15:40:30 +08:00
|
|
|
|
|
|
|
v = validate_test_init(data, "3.14");
|
|
|
|
|
2015-05-04 23:05:11 +08:00
|
|
|
visit_type_UserDefAlternate(v, &tmp, NULL, &err);
|
2014-05-02 19:26:29 +08:00
|
|
|
g_assert(err);
|
2015-05-04 23:05:11 +08:00
|
|
|
qapi_free_UserDefAlternate(tmp);
|
2014-03-01 15:40:30 +08:00
|
|
|
}
|
|
|
|
|
2012-03-22 19:51:10 +08:00
|
|
|
static void validate_test_add(const char *testpath,
|
|
|
|
TestInputVisitorData *data,
|
|
|
|
void (*test_func)(TestInputVisitorData *data, const void *user_data))
|
|
|
|
{
|
|
|
|
g_test_add(testpath, TestInputVisitorData, data, NULL, test_func,
|
|
|
|
validate_teardown);
|
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char **argv)
|
|
|
|
{
|
|
|
|
TestInputVisitorData testdata;
|
|
|
|
|
|
|
|
g_test_init(&argc, &argv, NULL);
|
|
|
|
|
|
|
|
validate_test_add("/visitor/input-strict/pass/struct",
|
2015-05-04 23:05:06 +08:00
|
|
|
&testdata, test_validate_struct);
|
2012-03-22 19:51:10 +08:00
|
|
|
validate_test_add("/visitor/input-strict/pass/struct-nested",
|
2015-05-04 23:05:06 +08:00
|
|
|
&testdata, test_validate_struct_nested);
|
2012-03-22 19:51:10 +08:00
|
|
|
validate_test_add("/visitor/input-strict/pass/list",
|
2015-05-04 23:05:06 +08:00
|
|
|
&testdata, test_validate_list);
|
2014-03-01 15:40:33 +08:00
|
|
|
validate_test_add("/visitor/input-strict/pass/union-flat",
|
2015-05-04 23:05:06 +08:00
|
|
|
&testdata, test_validate_union_flat);
|
2015-05-04 23:05:11 +08:00
|
|
|
validate_test_add("/visitor/input-strict/pass/alternate",
|
|
|
|
&testdata, test_validate_alternate);
|
2015-05-04 23:05:06 +08:00
|
|
|
validate_test_add("/visitor/input-strict/pass/union-native-list",
|
|
|
|
&testdata, test_validate_union_native_list);
|
2012-03-22 19:51:10 +08:00
|
|
|
validate_test_add("/visitor/input-strict/fail/struct",
|
2015-05-04 23:05:06 +08:00
|
|
|
&testdata, test_validate_fail_struct);
|
2012-03-22 19:51:10 +08:00
|
|
|
validate_test_add("/visitor/input-strict/fail/struct-nested",
|
2015-05-04 23:05:06 +08:00
|
|
|
&testdata, test_validate_fail_struct_nested);
|
2012-03-22 19:51:10 +08:00
|
|
|
validate_test_add("/visitor/input-strict/fail/list",
|
2015-05-04 23:05:06 +08:00
|
|
|
&testdata, test_validate_fail_list);
|
2014-03-01 15:40:33 +08:00
|
|
|
validate_test_add("/visitor/input-strict/fail/union-flat",
|
2015-05-04 23:05:06 +08:00
|
|
|
&testdata, test_validate_fail_union_flat);
|
2014-09-19 04:36:42 +08:00
|
|
|
validate_test_add("/visitor/input-strict/fail/union-flat-no-discriminator",
|
2015-05-04 23:05:06 +08:00
|
|
|
&testdata, test_validate_fail_union_flat_no_discrim);
|
2015-05-04 23:05:11 +08:00
|
|
|
validate_test_add("/visitor/input-strict/fail/alternate",
|
|
|
|
&testdata, test_validate_fail_alternate);
|
2015-05-04 23:05:06 +08:00
|
|
|
validate_test_add("/visitor/input-strict/fail/union-native-list",
|
|
|
|
&testdata, test_validate_fail_union_native_list);
|
2012-03-22 19:51:10 +08:00
|
|
|
|
|
|
|
g_test_run();
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|