qapi: Share test_init code in test-qmp-input*

Rather than duplicate the body of two functions just to
decide between qobject_from_jsonv() and qobject_from_json(),
exploit the fact that qobject_from_jsonv() intentionally
takes 'va_list *' instead of the more common 'va_list', and
that qobject_from_json() just calls qobject_from_jsonv(,NULL).
For each file, our two existing init functions then become
thin wrappers around a new internal function, and future
updates to initialization don't have to be duplicated.

Suggested-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Eric Blake <eblake@redhat.com>
Message-Id: <1446791754-23823-5-git-send-email-eblake@redhat.com>
[Two old comment typos fixed]
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Eric Blake 2015-11-05 23:35:28 -07:00 committed by Markus Armbruster
parent cc9f60d4a2
commit 0920a17199
2 changed files with 46 additions and 51 deletions

View File

@ -40,9 +40,27 @@ static void validate_teardown(TestInputVisitorData *data,
} }
} }
/* This is provided instead of a test setup function so that the JSON /* The various test_init functions are provided instead of a test setup
string used by the tests are kept in the test functions (and not function so that the JSON string used by the tests are kept in the test
int main()) */ functions (and not in main()). */
static Visitor *validate_test_init_internal(TestInputVisitorData *data,
const char *json_string,
va_list *ap)
{
Visitor *v;
data->obj = qobject_from_jsonv(json_string, ap);
g_assert(data->obj);
data->qiv = qmp_input_visitor_new_strict(data->obj);
g_assert(data->qiv);
v = qmp_input_get_visitor(data->qiv);
g_assert(v);
return v;
}
static GCC_FMT_ATTR(2, 3) static GCC_FMT_ATTR(2, 3)
Visitor *validate_test_init(TestInputVisitorData *data, Visitor *validate_test_init(TestInputVisitorData *data,
const char *json_string, ...) const char *json_string, ...)
@ -51,17 +69,8 @@ Visitor *validate_test_init(TestInputVisitorData *data,
va_list ap; va_list ap;
va_start(ap, json_string); va_start(ap, json_string);
data->obj = qobject_from_jsonv(json_string, &ap); v = validate_test_init_internal(data, json_string, &ap);
va_end(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; return v;
} }
@ -75,18 +84,7 @@ Visitor *validate_test_init(TestInputVisitorData *data,
static Visitor *validate_test_init_raw(TestInputVisitorData *data, static Visitor *validate_test_init_raw(TestInputVisitorData *data,
const char *json_string) const char *json_string)
{ {
Visitor *v; return validate_test_init_internal(data, json_string, NULL);
data->obj = qobject_from_json(json_string);
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;
} }

View File

@ -36,9 +36,27 @@ static void visitor_input_teardown(TestInputVisitorData *data,
} }
} }
/* This is provided instead of a test setup function so that the JSON /* The various test_init functions are provided instead of a test setup
string used by the tests are kept in the test functions (and not function so that the JSON string used by the tests are kept in the test
int main()) */ functions (and not in main()). */
static Visitor *visitor_input_test_init_internal(TestInputVisitorData *data,
const char *json_string,
va_list *ap)
{
Visitor *v;
data->obj = qobject_from_jsonv(json_string, ap);
g_assert(data->obj);
data->qiv = qmp_input_visitor_new(data->obj);
g_assert(data->qiv);
v = qmp_input_get_visitor(data->qiv);
g_assert(v);
return v;
}
static GCC_FMT_ATTR(2, 3) static GCC_FMT_ATTR(2, 3)
Visitor *visitor_input_test_init(TestInputVisitorData *data, Visitor *visitor_input_test_init(TestInputVisitorData *data,
const char *json_string, ...) const char *json_string, ...)
@ -47,17 +65,8 @@ Visitor *visitor_input_test_init(TestInputVisitorData *data,
va_list ap; va_list ap;
va_start(ap, json_string); va_start(ap, json_string);
data->obj = qobject_from_jsonv(json_string, &ap); v = visitor_input_test_init_internal(data, json_string, &ap);
va_end(ap); va_end(ap);
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; return v;
} }
@ -71,19 +80,7 @@ Visitor *visitor_input_test_init(TestInputVisitorData *data,
static Visitor *visitor_input_test_init_raw(TestInputVisitorData *data, static Visitor *visitor_input_test_init_raw(TestInputVisitorData *data,
const char *json_string) const char *json_string)
{ {
Visitor *v; return visitor_input_test_init_internal(data, json_string, NULL);
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, static void test_visitor_in_int(TestInputVisitorData *data,