| From e88b00eb5e1f4785827445fe5b06b590ebae7d7b Mon Sep 17 00:00:00 2001 |
| Message-Id: <e88b00eb5e1f4785827445fe5b06b590ebae7d7b.1387369730.git.minovotn@redhat.com> |
| In-Reply-To: <091eecc4fa42754760dfff393dabcc2b444e9693.1387369730.git.minovotn@redhat.com> |
| References: <091eecc4fa42754760dfff393dabcc2b444e9693.1387369730.git.minovotn@redhat.com> |
| From: Markus Armbruster <armbru@redhat.com> |
| Date: Tue, 10 Dec 2013 15:29:09 +0100 |
| Subject: [PATCH 09/21] qapi: add native list coverage for QMP input visitor |
| tests |
| |
| RH-Author: Markus Armbruster <armbru@redhat.com> |
| Message-id: <1386689361-30281-7-git-send-email-armbru@redhat.com> |
| Patchwork-id: 56125 |
| O-Subject: [PATCH 7.0 qemu-kvm 06/18] qapi: add native list coverage for QMP input visitor tests |
| Bugzilla: 997915 |
| RH-Acked-by: Laszlo Ersek <lersek@redhat.com> |
| RH-Acked-by: Kevin Wolf <kwolf@redhat.com> |
| RH-Acked-by: Luiz Capitulino <lcapitulino@redhat.com> |
| |
| From: Michael Roth <mdroth@linux.vnet.ibm.com> |
| |
| This exercises schema-generated visitors for native list types and does |
| some sanity checking on validity of deserialized data. |
| |
| Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com> |
| Reviewed-by: Laszlo Ersek <lersek@redhat.com> |
| Reviewed-by: Amos Kong <akong@redhat.com> |
| Signed-off-by: Luiz Capitulino <lcapitulino@redhat.com> |
| (cherry picked from commit 199e0f17f23a68c8d619e9e623d970324ed5efc1) |
| Signed-off-by: Markus Armbruster <armbru@redhat.com> |
| |
| tests/test-qmp-input-visitor.c | 338 +++++++++++++++++++++++++++++++++++++++++ |
| 1 file changed, 338 insertions(+) |
| |
| Signed-off-by: Michal Novotny <minovotn@redhat.com> |
| |
| tests/test-qmp-input-visitor.c | 338 +++++++++++++++++++++++++++++++++++++++++ |
| 1 file changed, 338 insertions(+) |
| |
| diff --git a/tests/test-qmp-input-visitor.c b/tests/test-qmp-input-visitor.c |
| index b308cf9..2741eef 100644 |
| |
| |
| @@ -61,6 +61,31 @@ Visitor *visitor_input_test_init(TestInputVisitorData *data, |
| return v; |
| } |
| |
| +/* similar to visitor_input_test_init(), but does not expect a string |
| + * literal/format json_string argument and so can be used for |
| + * programatically generated strings (and we can't pass in programatically |
| + * generated strings via %s format parameters since qobject_from_jsonv() |
| + * will wrap those in double-quotes and treat the entire object as a |
| + * string) |
| + */ |
| +static Visitor *visitor_input_test_init_raw(TestInputVisitorData *data, |
| + const char *json_string) |
| +{ |
| + Visitor *v; |
| + |
| + data->obj = qobject_from_json(json_string); |
| + |
| + g_assert(data->obj != NULL); |
| + |
| + data->qiv = qmp_input_visitor_new(data->obj); |
| + g_assert(data->qiv != NULL); |
| + |
| + v = qmp_input_get_visitor(data->qiv); |
| + g_assert(v != NULL); |
| + |
| + return v; |
| +} |
| + |
| static void test_visitor_in_int(TestInputVisitorData *data, |
| const void *unused) |
| { |
| @@ -277,6 +302,287 @@ static void test_visitor_in_union(TestInputVisitorData *data, |
| qapi_free_UserDefUnion(tmp); |
| } |
| |
| +static void test_native_list_integer_helper(TestInputVisitorData *data, |
| + const void *unused, |
| + UserDefNativeListUnionKind kind) |
| +{ |
| + UserDefNativeListUnion *cvalue = NULL; |
| + Error *err = NULL; |
| + Visitor *v; |
| + GString *gstr_list = g_string_new(""); |
| + GString *gstr_union = g_string_new(""); |
| + int i; |
| + |
| + for (i = 0; i < 32; i++) { |
| + g_string_append_printf(gstr_list, "%d", i); |
| + if (i != 31) { |
| + g_string_append(gstr_list, ", "); |
| + } |
| + } |
| + g_string_append_printf(gstr_union, "{ 'type': '%s', 'data': [ %s ] }", |
| + UserDefNativeListUnionKind_lookup[kind], |
| + gstr_list->str); |
| + v = visitor_input_test_init_raw(data, gstr_union->str); |
| + |
| + visit_type_UserDefNativeListUnion(v, &cvalue, NULL, &err); |
| + g_assert(err == NULL); |
| + g_assert(cvalue != NULL); |
| + g_assert_cmpint(cvalue->kind, ==, kind); |
| + |
| + switch (kind) { |
| + case USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER: { |
| + intList *elem = NULL; |
| + for (i = 0, elem = cvalue->integer; elem; elem = elem->next, i++) { |
| + g_assert_cmpint(elem->value, ==, i); |
| + } |
| + break; |
| + } |
| + case USER_DEF_NATIVE_LIST_UNION_KIND_S8: { |
| + int8List *elem = NULL; |
| + for (i = 0, elem = cvalue->s8; elem; elem = elem->next, i++) { |
| + g_assert_cmpint(elem->value, ==, i); |
| + } |
| + break; |
| + } |
| + case USER_DEF_NATIVE_LIST_UNION_KIND_S16: { |
| + int16List *elem = NULL; |
| + for (i = 0, elem = cvalue->s16; elem; elem = elem->next, i++) { |
| + g_assert_cmpint(elem->value, ==, i); |
| + } |
| + break; |
| + } |
| + case USER_DEF_NATIVE_LIST_UNION_KIND_S32: { |
| + int32List *elem = NULL; |
| + for (i = 0, elem = cvalue->s32; elem; elem = elem->next, i++) { |
| + g_assert_cmpint(elem->value, ==, i); |
| + } |
| + break; |
| + } |
| + case USER_DEF_NATIVE_LIST_UNION_KIND_S64: { |
| + int64List *elem = NULL; |
| + for (i = 0, elem = cvalue->s64; elem; elem = elem->next, i++) { |
| + g_assert_cmpint(elem->value, ==, i); |
| + } |
| + break; |
| + } |
| + case USER_DEF_NATIVE_LIST_UNION_KIND_U8: { |
| + uint8List *elem = NULL; |
| + for (i = 0, elem = cvalue->u8; elem; elem = elem->next, i++) { |
| + g_assert_cmpint(elem->value, ==, i); |
| + } |
| + break; |
| + } |
| + case USER_DEF_NATIVE_LIST_UNION_KIND_U16: { |
| + uint16List *elem = NULL; |
| + for (i = 0, elem = cvalue->u16; elem; elem = elem->next, i++) { |
| + g_assert_cmpint(elem->value, ==, i); |
| + } |
| + break; |
| + } |
| + case USER_DEF_NATIVE_LIST_UNION_KIND_U32: { |
| + uint32List *elem = NULL; |
| + for (i = 0, elem = cvalue->u32; elem; elem = elem->next, i++) { |
| + g_assert_cmpint(elem->value, ==, i); |
| + } |
| + break; |
| + } |
| + case USER_DEF_NATIVE_LIST_UNION_KIND_U64: { |
| + uint64List *elem = NULL; |
| + for (i = 0, elem = cvalue->u64; elem; elem = elem->next, i++) { |
| + g_assert_cmpint(elem->value, ==, i); |
| + } |
| + break; |
| + } |
| + default: |
| + g_assert(false); |
| + } |
| + |
| + g_string_free(gstr_union, true); |
| + g_string_free(gstr_list, true); |
| + qapi_free_UserDefNativeListUnion(cvalue); |
| +} |
| + |
| +static void test_visitor_in_native_list_int(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + test_native_list_integer_helper(data, unused, |
| + USER_DEF_NATIVE_LIST_UNION_KIND_INTEGER); |
| +} |
| + |
| +static void test_visitor_in_native_list_int8(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + test_native_list_integer_helper(data, unused, |
| + USER_DEF_NATIVE_LIST_UNION_KIND_S8); |
| +} |
| + |
| +static void test_visitor_in_native_list_int16(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + test_native_list_integer_helper(data, unused, |
| + USER_DEF_NATIVE_LIST_UNION_KIND_S16); |
| +} |
| + |
| +static void test_visitor_in_native_list_int32(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + test_native_list_integer_helper(data, unused, |
| + USER_DEF_NATIVE_LIST_UNION_KIND_S32); |
| +} |
| + |
| +static void test_visitor_in_native_list_int64(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + test_native_list_integer_helper(data, unused, |
| + USER_DEF_NATIVE_LIST_UNION_KIND_S64); |
| +} |
| + |
| +static void test_visitor_in_native_list_uint8(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + test_native_list_integer_helper(data, unused, |
| + USER_DEF_NATIVE_LIST_UNION_KIND_U8); |
| +} |
| + |
| +static void test_visitor_in_native_list_uint16(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + test_native_list_integer_helper(data, unused, |
| + USER_DEF_NATIVE_LIST_UNION_KIND_U16); |
| +} |
| + |
| +static void test_visitor_in_native_list_uint32(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + test_native_list_integer_helper(data, unused, |
| + USER_DEF_NATIVE_LIST_UNION_KIND_U32); |
| +} |
| + |
| +static void test_visitor_in_native_list_uint64(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + test_native_list_integer_helper(data, unused, |
| + USER_DEF_NATIVE_LIST_UNION_KIND_U64); |
| +} |
| + |
| +static void test_visitor_in_native_list_bool(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + UserDefNativeListUnion *cvalue = NULL; |
| + boolList *elem = NULL; |
| + Error *err = NULL; |
| + Visitor *v; |
| + GString *gstr_list = g_string_new(""); |
| + GString *gstr_union = g_string_new(""); |
| + int i; |
| + |
| + for (i = 0; i < 32; i++) { |
| + g_string_append_printf(gstr_list, "%s", |
| + (i % 3 == 0) ? "true" : "false"); |
| + if (i != 31) { |
| + g_string_append(gstr_list, ", "); |
| + } |
| + } |
| + g_string_append_printf(gstr_union, "{ 'type': 'boolean', 'data': [ %s ] }", |
| + gstr_list->str); |
| + v = visitor_input_test_init_raw(data, gstr_union->str); |
| + |
| + visit_type_UserDefNativeListUnion(v, &cvalue, NULL, &err); |
| + g_assert(err == NULL); |
| + g_assert(cvalue != NULL); |
| + g_assert_cmpint(cvalue->kind, ==, USER_DEF_NATIVE_LIST_UNION_KIND_BOOLEAN); |
| + |
| + for (i = 0, elem = cvalue->boolean; elem; elem = elem->next, i++) { |
| + g_assert_cmpint(elem->value, ==, (i % 3 == 0) ? 1 : 0); |
| + } |
| + |
| + g_string_free(gstr_union, true); |
| + g_string_free(gstr_list, true); |
| + qapi_free_UserDefNativeListUnion(cvalue); |
| +} |
| + |
| +static void test_visitor_in_native_list_string(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + UserDefNativeListUnion *cvalue = NULL; |
| + strList *elem = NULL; |
| + Error *err = NULL; |
| + Visitor *v; |
| + GString *gstr_list = g_string_new(""); |
| + GString *gstr_union = g_string_new(""); |
| + int i; |
| + |
| + for (i = 0; i < 32; i++) { |
| + g_string_append_printf(gstr_list, "'%d'", i); |
| + if (i != 31) { |
| + g_string_append(gstr_list, ", "); |
| + } |
| + } |
| + g_string_append_printf(gstr_union, "{ 'type': 'string', 'data': [ %s ] }", |
| + gstr_list->str); |
| + v = visitor_input_test_init_raw(data, gstr_union->str); |
| + |
| + visit_type_UserDefNativeListUnion(v, &cvalue, NULL, &err); |
| + g_assert(err == NULL); |
| + g_assert(cvalue != NULL); |
| + g_assert_cmpint(cvalue->kind, ==, USER_DEF_NATIVE_LIST_UNION_KIND_STRING); |
| + |
| + for (i = 0, elem = cvalue->string; elem; elem = elem->next, i++) { |
| + gchar str[8]; |
| + sprintf(str, "%d", i); |
| + g_assert_cmpstr(elem->value, ==, str); |
| + } |
| + |
| + g_string_free(gstr_union, true); |
| + g_string_free(gstr_list, true); |
| + qapi_free_UserDefNativeListUnion(cvalue); |
| +} |
| + |
| +#define DOUBLE_STR_MAX 16 |
| + |
| +static void test_visitor_in_native_list_number(TestInputVisitorData *data, |
| + const void *unused) |
| +{ |
| + UserDefNativeListUnion *cvalue = NULL; |
| + numberList *elem = NULL; |
| + Error *err = NULL; |
| + Visitor *v; |
| + GString *gstr_list = g_string_new(""); |
| + GString *gstr_union = g_string_new(""); |
| + int i; |
| + |
| + for (i = 0; i < 32; i++) { |
| + g_string_append_printf(gstr_list, "%f", (double)i / 3); |
| + if (i != 31) { |
| + g_string_append(gstr_list, ", "); |
| + } |
| + } |
| + g_string_append_printf(gstr_union, "{ 'type': 'number', 'data': [ %s ] }", |
| + gstr_list->str); |
| + v = visitor_input_test_init_raw(data, gstr_union->str); |
| + |
| + visit_type_UserDefNativeListUnion(v, &cvalue, NULL, &err); |
| + g_assert(err == NULL); |
| + g_assert(cvalue != NULL); |
| + g_assert_cmpint(cvalue->kind, ==, USER_DEF_NATIVE_LIST_UNION_KIND_NUMBER); |
| + |
| + for (i = 0, elem = cvalue->number; elem; elem = elem->next, i++) { |
| + GString *double_expected = g_string_new(""); |
| + GString *double_actual = g_string_new(""); |
| + |
| + g_string_printf(double_expected, "%.6f", (double)i / 3); |
| + g_string_printf(double_actual, "%.6f", elem->value); |
| + g_assert_cmpstr(double_expected->str, ==, double_actual->str); |
| + |
| + g_string_free(double_expected, true); |
| + g_string_free(double_actual, true); |
| + } |
| + |
| + g_string_free(gstr_union, true); |
| + g_string_free(gstr_list, true); |
| + qapi_free_UserDefNativeListUnion(cvalue); |
| +} |
| + |
| static void input_visitor_test_add(const char *testpath, |
| TestInputVisitorData *data, |
| void (*test_func)(TestInputVisitorData *data, const void *user_data)) |
| @@ -330,6 +636,38 @@ int main(int argc, char **argv) |
| &in_visitor_data, test_visitor_in_union); |
| input_visitor_test_add("/visitor/input/errors", |
| &in_visitor_data, test_visitor_in_errors); |
| + input_visitor_test_add("/visitor/input/native_list/int", |
| + &in_visitor_data, |
| + test_visitor_in_native_list_int); |
| + input_visitor_test_add("/visitor/input/native_list/int8", |
| + &in_visitor_data, |
| + test_visitor_in_native_list_int8); |
| + input_visitor_test_add("/visitor/input/native_list/int16", |
| + &in_visitor_data, |
| + test_visitor_in_native_list_int16); |
| + input_visitor_test_add("/visitor/input/native_list/int32", |
| + &in_visitor_data, |
| + test_visitor_in_native_list_int32); |
| + input_visitor_test_add("/visitor/input/native_list/int64", |
| + &in_visitor_data, |
| + test_visitor_in_native_list_int64); |
| + input_visitor_test_add("/visitor/input/native_list/uint8", |
| + &in_visitor_data, |
| + test_visitor_in_native_list_uint8); |
| + input_visitor_test_add("/visitor/input/native_list/uint16", |
| + &in_visitor_data, |
| + test_visitor_in_native_list_uint16); |
| + input_visitor_test_add("/visitor/input/native_list/uint32", |
| + &in_visitor_data, |
| + test_visitor_in_native_list_uint32); |
| + input_visitor_test_add("/visitor/input/native_list/uint64", |
| + &in_visitor_data, test_visitor_in_native_list_uint64); |
| + input_visitor_test_add("/visitor/input/native_list/bool", |
| + &in_visitor_data, test_visitor_in_native_list_bool); |
| + input_visitor_test_add("/visitor/input/native_list/str", |
| + &in_visitor_data, test_visitor_in_native_list_string); |
| + input_visitor_test_add("/visitor/input/native_list/number", |
| + &in_visitor_data, test_visitor_in_native_list_number); |
| |
| g_test_run(); |
| |
| -- |
| 1.7.11.7 |
| |