mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
Merge remote-tracking branch 'remotes/qmp-unstable/queue/qmp' into staging
* remotes/qmp-unstable/queue/qmp: (32 commits) qapi: Add missing null check to opts_start_struct() qapi: Clean up superfluous null check in qapi_dealloc_type_str() qapi: Clean up null checking in generated visitors qapi: Drop unused code in qapi-commands.py qapi: Drop nonsensical header guard in generated qapi-visit.c qapi: Fix licensing of scripts tests/qapi-schema: Cover flat union types tests/qapi-schema: Cover union types with base tests/qapi-schema: Cover complex types with base tests/qapi-schema: Cover anonymous union types tests/qapi-schema: Cover simple argument types tests/qapi-schema: Cover optional command arguments tests/qapi-schema: Actually check successful QMP command response monitor: Remove left-over code in do_info_profile. qerror: Improve QERR_DEVICE_NOT_ACTIVE message qmp: Check for returned data from __json_read in get_events dump: add 'query-dump-guest-memory-capability' command Define the architecture for compressed dump format dump: make kdump-compressed format available for 'dump-guest-memory' dump: add API to write dump pages ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
e00ef747f0
27 changed files with 1546 additions and 108 deletions
|
@ -7,8 +7,12 @@
|
|||
'data': { 'enum1': 'EnumOne', '*enum2': 'EnumOne', 'enum3': 'EnumOne', '*enum4': 'EnumOne' } }
|
||||
|
||||
# for testing nested structs
|
||||
{ 'type': 'UserDefZero',
|
||||
'data': { 'integer': 'int' } }
|
||||
|
||||
{ 'type': 'UserDefOne',
|
||||
'data': { 'integer': 'int', 'string': 'str', '*enum1': 'EnumOne' } }
|
||||
'base': 'UserDefZero',
|
||||
'data': { 'string': 'str', '*enum1': 'EnumOne' } }
|
||||
|
||||
{ 'type': 'UserDefTwo',
|
||||
'data': { 'string': 'str',
|
||||
|
@ -30,8 +34,20 @@
|
|||
'data': { 'integer': 'int' } }
|
||||
|
||||
{ 'union': 'UserDefUnion',
|
||||
'base': 'UserDefZero',
|
||||
'data': { 'a' : 'UserDefA', 'b' : 'UserDefB' } }
|
||||
|
||||
{ 'union': 'UserDefFlatUnion',
|
||||
'base': 'UserDefOne',
|
||||
'discriminator': 'string',
|
||||
'data': { 'a' : 'UserDefA', 'b' : 'UserDefB' } }
|
||||
# FIXME generated struct UserDefFlatUnion has members for direct base
|
||||
# UserDefOne, but lacks members for indirect base UserDefZero
|
||||
|
||||
{ 'union': 'UserDefAnonUnion',
|
||||
'discriminator': {},
|
||||
'data': { 'uda': 'UserDefA', 's': 'str', 'i': 'int' } }
|
||||
|
||||
# for testing native lists
|
||||
{ 'union': 'UserDefNativeListUnion',
|
||||
'data': { 'integer': ['int'],
|
||||
|
@ -50,7 +66,11 @@
|
|||
# testing commands
|
||||
{ 'command': 'user_def_cmd', 'data': {} }
|
||||
{ 'command': 'user_def_cmd1', 'data': {'ud1a': 'UserDefOne'} }
|
||||
{ 'command': 'user_def_cmd2', 'data': {'ud1a': 'UserDefOne', 'ud1b': 'UserDefOne'}, 'returns': 'UserDefTwo' }
|
||||
{ 'command': 'user_def_cmd2',
|
||||
'data': {'ud1a': 'UserDefOne', '*ud1b': 'UserDefOne'},
|
||||
'returns': 'UserDefTwo' }
|
||||
{ 'command': 'user_def_cmd3', 'data': {'a': 'int', '*b': 'int' },
|
||||
'returns': 'int' }
|
||||
|
||||
# For testing integer range flattening in opts-visitor. The following schema
|
||||
# corresponds to the option format:
|
||||
|
|
|
@ -1,19 +1,28 @@
|
|||
[OrderedDict([('enum', 'EnumOne'), ('data', ['value1', 'value2', 'value3'])]),
|
||||
OrderedDict([('type', 'NestedEnumsOne'), ('data', OrderedDict([('enum1', 'EnumOne'), ('*enum2', 'EnumOne'), ('enum3', 'EnumOne'), ('*enum4', 'EnumOne')]))]),
|
||||
OrderedDict([('type', 'UserDefOne'), ('data', OrderedDict([('integer', 'int'), ('string', 'str'), ('*enum1', 'EnumOne')]))]),
|
||||
OrderedDict([('type', 'UserDefZero'), ('data', OrderedDict([('integer', 'int')]))]),
|
||||
OrderedDict([('type', 'UserDefOne'), ('base', 'UserDefZero'), ('data', OrderedDict([('string', 'str'), ('*enum1', 'EnumOne')]))]),
|
||||
OrderedDict([('type', 'UserDefTwo'), ('data', OrderedDict([('string', 'str'), ('dict', OrderedDict([('string', 'str'), ('dict', OrderedDict([('userdef', 'UserDefOne'), ('string', 'str')])), ('*dict2', OrderedDict([('userdef', 'UserDefOne'), ('string', 'str')]))]))]))]),
|
||||
OrderedDict([('type', 'UserDefNested'), ('data', OrderedDict([('string0', 'str'), ('dict1', OrderedDict([('string1', 'str'), ('dict2', OrderedDict([('userdef1', 'UserDefOne'), ('string2', 'str')])), ('*dict3', OrderedDict([('userdef2', 'UserDefOne'), ('string3', 'str')]))]))]))]),
|
||||
OrderedDict([('type', 'UserDefA'), ('data', OrderedDict([('boolean', 'bool')]))]),
|
||||
OrderedDict([('type', 'UserDefB'), ('data', OrderedDict([('integer', 'int')]))]),
|
||||
OrderedDict([('union', 'UserDefUnion'), ('data', OrderedDict([('a', 'UserDefA'), ('b', 'UserDefB')]))]),
|
||||
OrderedDict([('union', 'UserDefUnion'), ('base', 'UserDefZero'), ('data', OrderedDict([('a', 'UserDefA'), ('b', 'UserDefB')]))]),
|
||||
OrderedDict([('union', 'UserDefFlatUnion'), ('base', 'UserDefOne'), ('discriminator', 'string'), ('data', OrderedDict([('a', 'UserDefA'), ('b', 'UserDefB')]))]),
|
||||
OrderedDict([('union', 'UserDefAnonUnion'), ('discriminator', OrderedDict()), ('data', OrderedDict([('uda', 'UserDefA'), ('s', 'str'), ('i', 'int')]))]),
|
||||
OrderedDict([('union', 'UserDefNativeListUnion'), ('data', OrderedDict([('integer', ['int']), ('s8', ['int8']), ('s16', ['int16']), ('s32', ['int32']), ('s64', ['int64']), ('u8', ['uint8']), ('u16', ['uint16']), ('u32', ['uint32']), ('u64', ['uint64']), ('number', ['number']), ('boolean', ['bool']), ('string', ['str'])]))]),
|
||||
OrderedDict([('command', 'user_def_cmd'), ('data', OrderedDict())]),
|
||||
OrderedDict([('command', 'user_def_cmd1'), ('data', OrderedDict([('ud1a', 'UserDefOne')]))]),
|
||||
OrderedDict([('command', 'user_def_cmd2'), ('data', OrderedDict([('ud1a', 'UserDefOne'), ('ud1b', 'UserDefOne')])), ('returns', 'UserDefTwo')]),
|
||||
OrderedDict([('command', 'user_def_cmd2'), ('data', OrderedDict([('ud1a', 'UserDefOne'), ('*ud1b', 'UserDefOne')])), ('returns', 'UserDefTwo')]),
|
||||
OrderedDict([('command', 'user_def_cmd3'), ('data', OrderedDict([('a', 'int'), ('*b', 'int')])), ('returns', 'int')]),
|
||||
OrderedDict([('type', 'UserDefOptions'), ('data', OrderedDict([('*i64', ['int']), ('*u64', ['uint64']), ('*u16', ['uint16']), ('*i64x', 'int'), ('*u64x', 'uint64')]))])]
|
||||
['EnumOne', 'UserDefUnionKind', 'UserDefNativeListUnionKind']
|
||||
['EnumOne',
|
||||
'UserDefUnionKind',
|
||||
'UserDefFlatUnionKind',
|
||||
'UserDefAnonUnionKind',
|
||||
'UserDefNativeListUnionKind']
|
||||
[OrderedDict([('type', 'NestedEnumsOne'), ('data', OrderedDict([('enum1', 'EnumOne'), ('*enum2', 'EnumOne'), ('enum3', 'EnumOne'), ('*enum4', 'EnumOne')]))]),
|
||||
OrderedDict([('type', 'UserDefOne'), ('data', OrderedDict([('integer', 'int'), ('string', 'str'), ('*enum1', 'EnumOne')]))]),
|
||||
OrderedDict([('type', 'UserDefZero'), ('data', OrderedDict([('integer', 'int')]))]),
|
||||
OrderedDict([('type', 'UserDefOne'), ('base', 'UserDefZero'), ('data', OrderedDict([('string', 'str'), ('*enum1', 'EnumOne')]))]),
|
||||
OrderedDict([('type', 'UserDefTwo'), ('data', OrderedDict([('string', 'str'), ('dict', OrderedDict([('string', 'str'), ('dict', OrderedDict([('userdef', 'UserDefOne'), ('string', 'str')])), ('*dict2', OrderedDict([('userdef', 'UserDefOne'), ('string', 'str')]))]))]))]),
|
||||
OrderedDict([('type', 'UserDefNested'), ('data', OrderedDict([('string0', 'str'), ('dict1', OrderedDict([('string1', 'str'), ('dict2', OrderedDict([('userdef1', 'UserDefOne'), ('string2', 'str')])), ('*dict3', OrderedDict([('userdef2', 'UserDefOne'), ('string3', 'str')]))]))]))]),
|
||||
OrderedDict([('type', 'UserDefA'), ('data', OrderedDict([('boolean', 'bool')]))]),
|
||||
|
|
|
@ -16,16 +16,20 @@ void qmp_user_def_cmd1(UserDefOne * ud1, Error **errp)
|
|||
{
|
||||
}
|
||||
|
||||
UserDefTwo * qmp_user_def_cmd2(UserDefOne * ud1a, UserDefOne * ud1b, Error **errp)
|
||||
UserDefTwo *qmp_user_def_cmd2(UserDefOne *ud1a,
|
||||
bool has_udb1, UserDefOne *ud1b,
|
||||
Error **errp)
|
||||
{
|
||||
UserDefTwo *ret;
|
||||
UserDefOne *ud1c = g_malloc0(sizeof(UserDefOne));
|
||||
UserDefOne *ud1d = g_malloc0(sizeof(UserDefOne));
|
||||
|
||||
ud1c->string = strdup(ud1a->string);
|
||||
ud1c->integer = ud1a->integer;
|
||||
ud1d->string = strdup(ud1b->string);
|
||||
ud1d->integer = ud1b->integer;
|
||||
ud1c->base = g_new0(UserDefZero, 1);
|
||||
ud1c->base->integer = ud1a->base->integer;
|
||||
ud1d->string = strdup(has_udb1 ? ud1b->string : "blah0");
|
||||
ud1d->base = g_new0(UserDefZero, 1);
|
||||
ud1d->base->integer = has_udb1 ? ud1b->base->integer : 0;
|
||||
|
||||
ret = g_malloc0(sizeof(UserDefTwo));
|
||||
ret->string = strdup("blah1");
|
||||
|
@ -39,6 +43,11 @@ UserDefTwo * qmp_user_def_cmd2(UserDefOne * ud1a, UserDefOne * ud1b, Error **err
|
|||
return ret;
|
||||
}
|
||||
|
||||
int64_t qmp_user_def_cmd3(int64_t a, bool has_b, int64_t b, Error **errp)
|
||||
{
|
||||
return a + (has_b ? b : 0);
|
||||
}
|
||||
|
||||
/* test commands with no input and no return value */
|
||||
static void test_dispatch_cmd(void)
|
||||
{
|
||||
|
@ -71,14 +80,34 @@ static void test_dispatch_cmd_error(void)
|
|||
QDECREF(req);
|
||||
}
|
||||
|
||||
static QObject *test_qmp_dispatch(QDict *req)
|
||||
{
|
||||
QObject *resp_obj;
|
||||
QDict *resp;
|
||||
QObject *ret;
|
||||
|
||||
resp_obj = qmp_dispatch(QOBJECT(req));
|
||||
assert(resp_obj);
|
||||
resp = qobject_to_qdict(resp_obj);
|
||||
assert(resp && !qdict_haskey(resp, "error"));
|
||||
ret = qdict_get(resp, "return");
|
||||
assert(ret);
|
||||
qobject_incref(ret);
|
||||
qobject_decref(resp_obj);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* test commands that involve both input parameters and return values */
|
||||
static void test_dispatch_cmd_io(void)
|
||||
{
|
||||
QDict *req = qdict_new();
|
||||
QDict *args = qdict_new();
|
||||
QDict *args3 = qdict_new();
|
||||
QDict *ud1a = qdict_new();
|
||||
QDict *ud1b = qdict_new();
|
||||
QObject *resp;
|
||||
QDict *ret, *ret_dict, *ret_dict_dict, *ret_dict_dict_userdef;
|
||||
QDict *ret_dict_dict2, *ret_dict_dict2_userdef;
|
||||
QInt *ret3;
|
||||
|
||||
qdict_put_obj(ud1a, "integer", QOBJECT(qint_from_int(42)));
|
||||
qdict_put_obj(ud1a, "string", QOBJECT(qstring_from_str("hello")));
|
||||
|
@ -87,15 +116,33 @@ static void test_dispatch_cmd_io(void)
|
|||
qdict_put_obj(args, "ud1a", QOBJECT(ud1a));
|
||||
qdict_put_obj(args, "ud1b", QOBJECT(ud1b));
|
||||
qdict_put_obj(req, "arguments", QOBJECT(args));
|
||||
|
||||
qdict_put_obj(req, "execute", QOBJECT(qstring_from_str("user_def_cmd2")));
|
||||
|
||||
/* TODO: put in full payload and check for errors */
|
||||
resp = qmp_dispatch(QOBJECT(req));
|
||||
assert(resp != NULL);
|
||||
assert(!qdict_haskey(qobject_to_qdict(resp), "error"));
|
||||
ret = qobject_to_qdict(test_qmp_dispatch(req));
|
||||
|
||||
assert(!strcmp(qdict_get_str(ret, "string"), "blah1"));
|
||||
ret_dict = qdict_get_qdict(ret, "dict");
|
||||
assert(!strcmp(qdict_get_str(ret_dict, "string"), "blah2"));
|
||||
ret_dict_dict = qdict_get_qdict(ret_dict, "dict");
|
||||
ret_dict_dict_userdef = qdict_get_qdict(ret_dict_dict, "userdef");
|
||||
assert(qdict_get_int(ret_dict_dict_userdef, "integer") == 42);
|
||||
assert(!strcmp(qdict_get_str(ret_dict_dict_userdef, "string"), "hello"));
|
||||
assert(!strcmp(qdict_get_str(ret_dict_dict, "string"), "blah3"));
|
||||
ret_dict_dict2 = qdict_get_qdict(ret_dict, "dict2");
|
||||
ret_dict_dict2_userdef = qdict_get_qdict(ret_dict_dict2, "userdef");
|
||||
assert(qdict_get_int(ret_dict_dict2_userdef, "integer") == 422);
|
||||
assert(!strcmp(qdict_get_str(ret_dict_dict2_userdef, "string"), "hello2"));
|
||||
assert(!strcmp(qdict_get_str(ret_dict_dict2, "string"), "blah4"));
|
||||
QDECREF(ret);
|
||||
|
||||
qdict_put(args3, "a", qint_from_int(66));
|
||||
qdict_put(req, "arguments", args3);
|
||||
qdict_put(req, "execute", qstring_from_str("user_def_cmd3"));
|
||||
|
||||
ret3 = qobject_to_qint(test_qmp_dispatch(req));
|
||||
assert(qint_get_int(ret3) == 66);
|
||||
QDECREF(ret);
|
||||
|
||||
qobject_decref(resp);
|
||||
QDECREF(req);
|
||||
}
|
||||
|
||||
|
@ -106,17 +153,20 @@ static void test_dealloc_types(void)
|
|||
UserDefOneList *ud1list;
|
||||
|
||||
ud1test = g_malloc0(sizeof(UserDefOne));
|
||||
ud1test->integer = 42;
|
||||
ud1test->base = g_new0(UserDefZero, 1);
|
||||
ud1test->base->integer = 42;
|
||||
ud1test->string = g_strdup("hi there 42");
|
||||
|
||||
qapi_free_UserDefOne(ud1test);
|
||||
|
||||
ud1a = g_malloc0(sizeof(UserDefOne));
|
||||
ud1a->integer = 43;
|
||||
ud1a->base = g_new0(UserDefZero, 1);
|
||||
ud1a->base->integer = 43;
|
||||
ud1a->string = g_strdup("hi there 43");
|
||||
|
||||
ud1b = g_malloc0(sizeof(UserDefOne));
|
||||
ud1b->integer = 44;
|
||||
ud1b->base = g_new0(UserDefZero, 1);
|
||||
ud1b->base->integer = 44;
|
||||
ud1b->string = g_strdup("hi there 44");
|
||||
|
||||
ud1list = g_malloc0(sizeof(UserDefOneList));
|
||||
|
|
|
@ -132,13 +132,42 @@ static void test_validate_union(TestInputVisitorData *data,
|
|||
Visitor *v;
|
||||
Error *errp = NULL;
|
||||
|
||||
v = validate_test_init(data, "{ 'type': 'b', 'data' : { 'integer': 42 } }");
|
||||
v = validate_test_init(data, "{ 'type': 'b', 'integer': 41, 'data' : { 'integer': 42 } }");
|
||||
|
||||
visit_type_UserDefUnion(v, &tmp, NULL, &errp);
|
||||
g_assert(!errp);
|
||||
qapi_free_UserDefUnion(tmp);
|
||||
}
|
||||
|
||||
static void test_validate_union_flat(TestInputVisitorData *data,
|
||||
const void *unused)
|
||||
{
|
||||
UserDefFlatUnion *tmp = NULL;
|
||||
Visitor *v;
|
||||
Error *errp = NULL;
|
||||
|
||||
v = validate_test_init(data, "{ 'string': 'a', 'boolean': true }");
|
||||
/* TODO when generator bug is fixed, add 'integer': 41 */
|
||||
|
||||
visit_type_UserDefFlatUnion(v, &tmp, NULL, &errp);
|
||||
g_assert(!error_is_set(&errp));
|
||||
qapi_free_UserDefFlatUnion(tmp);
|
||||
}
|
||||
|
||||
static void test_validate_union_anon(TestInputVisitorData *data,
|
||||
const void *unused)
|
||||
{
|
||||
UserDefAnonUnion *tmp = NULL;
|
||||
Visitor *v;
|
||||
Error *errp = NULL;
|
||||
|
||||
v = validate_test_init(data, "42");
|
||||
|
||||
visit_type_UserDefAnonUnion(v, &tmp, NULL, &errp);
|
||||
g_assert(!error_is_set(&errp));
|
||||
qapi_free_UserDefAnonUnion(tmp);
|
||||
}
|
||||
|
||||
static void test_validate_fail_struct(TestInputVisitorData *data,
|
||||
const void *unused)
|
||||
{
|
||||
|
@ -191,13 +220,41 @@ static void test_validate_fail_union(TestInputVisitorData *data,
|
|||
Error *errp = NULL;
|
||||
Visitor *v;
|
||||
|
||||
v = validate_test_init(data, "{ 'type': 'b', 'data' : { 'integer': 42 }, 'extra': 'yyy' }");
|
||||
v = validate_test_init(data, "{ 'type': 'b', 'data' : { 'integer': 42 } }");
|
||||
|
||||
visit_type_UserDefUnion(v, &tmp, NULL, &errp);
|
||||
g_assert(errp);
|
||||
qapi_free_UserDefUnion(tmp);
|
||||
}
|
||||
|
||||
static void test_validate_fail_union_flat(TestInputVisitorData *data,
|
||||
const void *unused)
|
||||
{
|
||||
UserDefFlatUnion *tmp = NULL;
|
||||
Error *errp = NULL;
|
||||
Visitor *v;
|
||||
|
||||
v = validate_test_init(data, "{ 'string': 'c', 'integer': 41, 'boolean': true }");
|
||||
|
||||
visit_type_UserDefFlatUnion(v, &tmp, NULL, &errp);
|
||||
g_assert(error_is_set(&errp));
|
||||
qapi_free_UserDefFlatUnion(tmp);
|
||||
}
|
||||
|
||||
static void test_validate_fail_union_anon(TestInputVisitorData *data,
|
||||
const void *unused)
|
||||
{
|
||||
UserDefAnonUnion *tmp = NULL;
|
||||
Visitor *v;
|
||||
Error *errp = NULL;
|
||||
|
||||
v = validate_test_init(data, "3.14");
|
||||
|
||||
visit_type_UserDefAnonUnion(v, &tmp, NULL, &errp);
|
||||
g_assert(error_is_set(&errp));
|
||||
qapi_free_UserDefAnonUnion(tmp);
|
||||
}
|
||||
|
||||
static void validate_test_add(const char *testpath,
|
||||
TestInputVisitorData *data,
|
||||
void (*test_func)(TestInputVisitorData *data, const void *user_data))
|
||||
|
@ -220,6 +277,10 @@ int main(int argc, char **argv)
|
|||
&testdata, test_validate_list);
|
||||
validate_test_add("/visitor/input-strict/pass/union",
|
||||
&testdata, test_validate_union);
|
||||
validate_test_add("/visitor/input-strict/pass/union-flat",
|
||||
&testdata, test_validate_union_flat);
|
||||
validate_test_add("/visitor/input-strict/pass/union-anon",
|
||||
&testdata, test_validate_union_anon);
|
||||
validate_test_add("/visitor/input-strict/fail/struct",
|
||||
&testdata, test_validate_fail_struct);
|
||||
validate_test_add("/visitor/input-strict/fail/struct-nested",
|
||||
|
@ -228,6 +289,10 @@ int main(int argc, char **argv)
|
|||
&testdata, test_validate_fail_list);
|
||||
validate_test_add("/visitor/input-strict/fail/union",
|
||||
&testdata, test_validate_fail_union);
|
||||
validate_test_add("/visitor/input-strict/fail/union-flat",
|
||||
&testdata, test_validate_fail_union_flat);
|
||||
validate_test_add("/visitor/input-strict/fail/union-anon",
|
||||
&testdata, test_validate_fail_union_anon);
|
||||
|
||||
g_test_run();
|
||||
|
||||
|
|
|
@ -252,7 +252,7 @@ static void test_visitor_in_struct_nested(TestInputVisitorData *data,
|
|||
|
||||
check_and_free_str(udp->string0, "string0");
|
||||
check_and_free_str(udp->dict1.string1, "string1");
|
||||
g_assert_cmpint(udp->dict1.dict2.userdef1->integer, ==, 42);
|
||||
g_assert_cmpint(udp->dict1.dict2.userdef1->base->integer, ==, 42);
|
||||
check_and_free_str(udp->dict1.dict2.userdef1->string, "string");
|
||||
check_and_free_str(udp->dict1.dict2.string2, "string2");
|
||||
g_assert(udp->dict1.has_dict3 == false);
|
||||
|
@ -280,7 +280,7 @@ static void test_visitor_in_list(TestInputVisitorData *data,
|
|||
|
||||
snprintf(string, sizeof(string), "string%d", i);
|
||||
g_assert_cmpstr(item->value->string, ==, string);
|
||||
g_assert_cmpint(item->value->integer, ==, 42 + i);
|
||||
g_assert_cmpint(item->value->base->integer, ==, 42 + i);
|
||||
}
|
||||
|
||||
qapi_free_UserDefOneList(head);
|
||||
|
@ -293,15 +293,50 @@ static void test_visitor_in_union(TestInputVisitorData *data,
|
|||
Error *err = NULL;
|
||||
UserDefUnion *tmp;
|
||||
|
||||
v = visitor_input_test_init(data, "{ 'type': 'b', 'data' : { 'integer': 42 } }");
|
||||
v = visitor_input_test_init(data, "{ 'type': 'b', 'integer': 41, 'data' : { 'integer': 42 } }");
|
||||
|
||||
visit_type_UserDefUnion(v, &tmp, NULL, &err);
|
||||
g_assert(err == NULL);
|
||||
g_assert_cmpint(tmp->kind, ==, USER_DEF_UNION_KIND_B);
|
||||
g_assert_cmpint(tmp->integer, ==, 41);
|
||||
g_assert_cmpint(tmp->b->integer, ==, 42);
|
||||
qapi_free_UserDefUnion(tmp);
|
||||
}
|
||||
|
||||
static void test_visitor_in_union_flat(TestInputVisitorData *data,
|
||||
const void *unused)
|
||||
{
|
||||
Visitor *v;
|
||||
Error *err = NULL;
|
||||
UserDefFlatUnion *tmp;
|
||||
|
||||
v = visitor_input_test_init(data, "{ 'string': 'a', 'boolean': true }");
|
||||
/* TODO when generator bug is fixed, add 'integer': 41 */
|
||||
|
||||
visit_type_UserDefFlatUnion(v, &tmp, NULL, &err);
|
||||
g_assert(err == NULL);
|
||||
g_assert_cmpint(tmp->kind, ==, USER_DEF_UNION_KIND_A);
|
||||
/* TODO g_assert_cmpint(tmp->integer, ==, 41); */
|
||||
g_assert_cmpint(tmp->a->boolean, ==, true);
|
||||
qapi_free_UserDefFlatUnion(tmp);
|
||||
}
|
||||
|
||||
static void test_visitor_in_union_anon(TestInputVisitorData *data,
|
||||
const void *unused)
|
||||
{
|
||||
Visitor *v;
|
||||
Error *err = NULL;
|
||||
UserDefAnonUnion *tmp;
|
||||
|
||||
v = visitor_input_test_init(data, "42");
|
||||
|
||||
visit_type_UserDefAnonUnion(v, &tmp, NULL, &err);
|
||||
g_assert(err == NULL);
|
||||
g_assert_cmpint(tmp->kind, ==, USER_DEF_ANON_UNION_KIND_I);
|
||||
g_assert_cmpint(tmp->i, ==, 42);
|
||||
qapi_free_UserDefAnonUnion(tmp);
|
||||
}
|
||||
|
||||
static void test_native_list_integer_helper(TestInputVisitorData *data,
|
||||
const void *unused,
|
||||
UserDefNativeListUnionKind kind)
|
||||
|
@ -635,6 +670,10 @@ int main(int argc, char **argv)
|
|||
&in_visitor_data, test_visitor_in_list);
|
||||
input_visitor_test_add("/visitor/input/union",
|
||||
&in_visitor_data, test_visitor_in_union);
|
||||
input_visitor_test_add("/visitor/input/union-flat",
|
||||
&in_visitor_data, test_visitor_in_union_flat);
|
||||
input_visitor_test_add("/visitor/input/union-anon",
|
||||
&in_visitor_data, test_visitor_in_union_anon);
|
||||
input_visitor_test_add("/visitor/input/errors",
|
||||
&in_visitor_data, test_visitor_in_errors);
|
||||
input_visitor_test_add("/visitor/input/native_list/int",
|
||||
|
|
|
@ -231,13 +231,15 @@ static void test_visitor_out_struct_nested(TestOutputVisitorData *data,
|
|||
ud2->dict1.string1 = g_strdup(strings[1]);
|
||||
ud2->dict1.dict2.userdef1 = g_malloc0(sizeof(UserDefOne));
|
||||
ud2->dict1.dict2.userdef1->string = g_strdup(string);
|
||||
ud2->dict1.dict2.userdef1->integer = value;
|
||||
ud2->dict1.dict2.userdef1->base = g_new0(UserDefZero, 1);
|
||||
ud2->dict1.dict2.userdef1->base->integer = value;
|
||||
ud2->dict1.dict2.string2 = g_strdup(strings[2]);
|
||||
|
||||
ud2->dict1.has_dict3 = true;
|
||||
ud2->dict1.dict3.userdef2 = g_malloc0(sizeof(UserDefOne));
|
||||
ud2->dict1.dict3.userdef2->string = g_strdup(string);
|
||||
ud2->dict1.dict3.userdef2->integer = value;
|
||||
ud2->dict1.dict3.userdef2->base = g_new0(UserDefZero, 1);
|
||||
ud2->dict1.dict3.userdef2->base->integer = value;
|
||||
ud2->dict1.dict3.string3 = g_strdup(strings[3]);
|
||||
|
||||
visit_type_UserDefNested(data->ov, &ud2, "unused", &errp);
|
||||
|
@ -279,7 +281,8 @@ static void test_visitor_out_struct_errors(TestOutputVisitorData *data,
|
|||
const void *unused)
|
||||
{
|
||||
EnumOne bad_values[] = { ENUM_ONE_MAX, -1 };
|
||||
UserDefOne u = { 0 }, *pu = &u;
|
||||
UserDefZero b;
|
||||
UserDefOne u = { .base = &b }, *pu = &u;
|
||||
Error *errp;
|
||||
int i;
|
||||
|
||||
|
@ -391,7 +394,8 @@ static void test_visitor_out_list_qapi_free(TestOutputVisitorData *data,
|
|||
p->value->dict1.string1 = g_strdup(string);
|
||||
p->value->dict1.dict2.userdef1 = g_malloc0(sizeof(UserDefOne));
|
||||
p->value->dict1.dict2.userdef1->string = g_strdup(string);
|
||||
p->value->dict1.dict2.userdef1->integer = 42;
|
||||
p->value->dict1.dict2.userdef1->base = g_new0(UserDefZero, 1);
|
||||
p->value->dict1.dict2.userdef1->base->integer = 42;
|
||||
p->value->dict1.dict2.string2 = g_strdup(string);
|
||||
p->value->dict1.has_dict3 = false;
|
||||
|
||||
|
@ -412,6 +416,7 @@ static void test_visitor_out_union(TestOutputVisitorData *data,
|
|||
|
||||
UserDefUnion *tmp = g_malloc0(sizeof(UserDefUnion));
|
||||
tmp->kind = USER_DEF_UNION_KIND_A;
|
||||
tmp->integer = 41;
|
||||
tmp->a = g_malloc0(sizeof(UserDefA));
|
||||
tmp->a->boolean = true;
|
||||
|
||||
|
@ -423,6 +428,7 @@ static void test_visitor_out_union(TestOutputVisitorData *data,
|
|||
qdict = qobject_to_qdict(arg);
|
||||
|
||||
g_assert_cmpstr(qdict_get_str(qdict, "type"), ==, "a");
|
||||
g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 41);
|
||||
|
||||
qvalue = qdict_get(qdict, "data");
|
||||
g_assert(data != NULL);
|
||||
|
@ -434,6 +440,55 @@ static void test_visitor_out_union(TestOutputVisitorData *data,
|
|||
QDECREF(qdict);
|
||||
}
|
||||
|
||||
static void test_visitor_out_union_flat(TestOutputVisitorData *data,
|
||||
const void *unused)
|
||||
{
|
||||
QObject *arg;
|
||||
QDict *qdict;
|
||||
|
||||
Error *err = NULL;
|
||||
|
||||
UserDefFlatUnion *tmp = g_malloc0(sizeof(UserDefFlatUnion));
|
||||
tmp->kind = USER_DEF_UNION_KIND_A;
|
||||
tmp->a = g_malloc0(sizeof(UserDefA));
|
||||
/* TODO when generator bug is fixed: tmp->integer = 41; */
|
||||
tmp->a->boolean = true;
|
||||
|
||||
visit_type_UserDefFlatUnion(data->ov, &tmp, NULL, &err);
|
||||
g_assert(err == NULL);
|
||||
arg = qmp_output_get_qobject(data->qov);
|
||||
|
||||
g_assert(qobject_type(arg) == QTYPE_QDICT);
|
||||
qdict = qobject_to_qdict(arg);
|
||||
|
||||
g_assert_cmpstr(qdict_get_str(qdict, "string"), ==, "a");
|
||||
/* TODO g_assert_cmpint(qdict_get_int(qdict, "integer"), ==, 41); */
|
||||
g_assert_cmpint(qdict_get_bool(qdict, "boolean"), ==, true);
|
||||
|
||||
qapi_free_UserDefFlatUnion(tmp);
|
||||
QDECREF(qdict);
|
||||
}
|
||||
|
||||
static void test_visitor_out_union_anon(TestOutputVisitorData *data,
|
||||
const void *unused)
|
||||
{
|
||||
QObject *arg;
|
||||
Error *err = NULL;
|
||||
|
||||
UserDefAnonUnion *tmp = g_malloc0(sizeof(UserDefAnonUnion));
|
||||
tmp->kind = USER_DEF_ANON_UNION_KIND_I;
|
||||
tmp->i = 42;
|
||||
|
||||
visit_type_UserDefAnonUnion(data->ov, &tmp, NULL, &err);
|
||||
g_assert(err == NULL);
|
||||
arg = qmp_output_get_qobject(data->qov);
|
||||
|
||||
g_assert(qobject_type(arg) == QTYPE_QINT);
|
||||
g_assert_cmpint(qint_get_int(qobject_to_qint(arg)), ==, 42);
|
||||
|
||||
qapi_free_UserDefAnonUnion(tmp);
|
||||
}
|
||||
|
||||
static void init_native_list(UserDefNativeListUnion *cvalue)
|
||||
{
|
||||
int i;
|
||||
|
@ -782,6 +837,10 @@ int main(int argc, char **argv)
|
|||
&out_visitor_data, test_visitor_out_list_qapi_free);
|
||||
output_visitor_test_add("/visitor/output/union",
|
||||
&out_visitor_data, test_visitor_out_union);
|
||||
output_visitor_test_add("/visitor/output/union-flat",
|
||||
&out_visitor_data, test_visitor_out_union_flat);
|
||||
output_visitor_test_add("/visitor/output/union-anon",
|
||||
&out_visitor_data, test_visitor_out_union_anon);
|
||||
output_visitor_test_add("/visitor/output/native_list/int",
|
||||
&out_visitor_data, test_visitor_out_native_list_int);
|
||||
output_visitor_test_add("/visitor/output/native_list/int8",
|
||||
|
|
|
@ -239,12 +239,14 @@ static UserDefNested *nested_struct_create(void)
|
|||
udnp->string0 = strdup("test_string0");
|
||||
udnp->dict1.string1 = strdup("test_string1");
|
||||
udnp->dict1.dict2.userdef1 = g_malloc0(sizeof(UserDefOne));
|
||||
udnp->dict1.dict2.userdef1->integer = 42;
|
||||
udnp->dict1.dict2.userdef1->base = g_new0(UserDefZero, 1);
|
||||
udnp->dict1.dict2.userdef1->base->integer = 42;
|
||||
udnp->dict1.dict2.userdef1->string = strdup("test_string");
|
||||
udnp->dict1.dict2.string2 = strdup("test_string2");
|
||||
udnp->dict1.has_dict3 = true;
|
||||
udnp->dict1.dict3.userdef2 = g_malloc0(sizeof(UserDefOne));
|
||||
udnp->dict1.dict3.userdef2->integer = 43;
|
||||
udnp->dict1.dict3.userdef2->base = g_new0(UserDefZero, 1);
|
||||
udnp->dict1.dict3.userdef2->base->integer = 43;
|
||||
udnp->dict1.dict3.userdef2->string = strdup("test_string");
|
||||
udnp->dict1.dict3.string3 = strdup("test_string3");
|
||||
return udnp;
|
||||
|
@ -256,14 +258,14 @@ static void nested_struct_compare(UserDefNested *udnp1, UserDefNested *udnp2)
|
|||
g_assert(udnp2);
|
||||
g_assert_cmpstr(udnp1->string0, ==, udnp2->string0);
|
||||
g_assert_cmpstr(udnp1->dict1.string1, ==, udnp2->dict1.string1);
|
||||
g_assert_cmpint(udnp1->dict1.dict2.userdef1->integer, ==,
|
||||
udnp2->dict1.dict2.userdef1->integer);
|
||||
g_assert_cmpint(udnp1->dict1.dict2.userdef1->base->integer, ==,
|
||||
udnp2->dict1.dict2.userdef1->base->integer);
|
||||
g_assert_cmpstr(udnp1->dict1.dict2.userdef1->string, ==,
|
||||
udnp2->dict1.dict2.userdef1->string);
|
||||
g_assert_cmpstr(udnp1->dict1.dict2.string2, ==, udnp2->dict1.dict2.string2);
|
||||
g_assert(udnp1->dict1.has_dict3 == udnp2->dict1.has_dict3);
|
||||
g_assert_cmpint(udnp1->dict1.dict3.userdef2->integer, ==,
|
||||
udnp2->dict1.dict3.userdef2->integer);
|
||||
g_assert_cmpint(udnp1->dict1.dict3.userdef2->base->integer, ==,
|
||||
udnp2->dict1.dict3.userdef2->base->integer);
|
||||
g_assert_cmpstr(udnp1->dict1.dict3.userdef2->string, ==,
|
||||
udnp2->dict1.dict3.userdef2->string);
|
||||
g_assert_cmpstr(udnp1->dict1.dict3.string3, ==, udnp2->dict1.dict3.string3);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue