From patchwork Wed Nov 30 19:44:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Eric Blake X-Patchwork-Id: 9454757 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id A74CC60756 for ; Wed, 30 Nov 2016 19:55:27 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 97DFE27FAD for ; Wed, 30 Nov 2016 19:55:27 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8C5F3283D3; Wed, 30 Nov 2016 19:55:27 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C401127FAD for ; Wed, 30 Nov 2016 19:55:26 +0000 (UTC) Received: from localhost ([::1]:46103 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cCAyT-00035w-W3 for patchwork-qemu-devel@patchwork.kernel.org; Wed, 30 Nov 2016 14:55:26 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35412) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cCAof-0003n0-Vd for qemu-devel@nongnu.org; Wed, 30 Nov 2016 14:45:22 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cCAoe-0001qs-9r for qemu-devel@nongnu.org; Wed, 30 Nov 2016 14:45:17 -0500 Received: from mx1.redhat.com ([209.132.183.28]:51148) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cCAoe-0001qR-1I for qemu-devel@nongnu.org; Wed, 30 Nov 2016 14:45:16 -0500 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 08BEA445D2; Wed, 30 Nov 2016 19:45:15 +0000 (UTC) Received: from red.redhat.com (ovpn-116-172.phx2.redhat.com [10.3.116.172]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id uAUJj2nD025934; Wed, 30 Nov 2016 14:45:14 -0500 From: Eric Blake To: qemu-devel@nongnu.org Date: Wed, 30 Nov 2016 13:44:24 -0600 Message-Id: <1480535094-23831-7-git-send-email-eblake@redhat.com> In-Reply-To: <1480535094-23831-1-git-send-email-eblake@redhat.com> References: <1480535094-23831-1-git-send-email-eblake@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.27 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.30]); Wed, 30 Nov 2016 19:45:15 +0000 (UTC) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.132.183.28 Subject: [Qemu-devel] [PATCH 06/36] qobject-input-visitor: Avoid dynamic JSON in tests X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: pbonzini@redhat.com, armbru@redhat.com, Michael Roth Errors-To: qemu-devel-bounces+patchwork-qemu-devel=patchwork.kernel.org@nongnu.org Sender: "Qemu-devel" X-Virus-Scanned: ClamAV using ClamSMTP As argued elsewhere, we want to get rid of the pseudo-printf dynamic JSON parsing of qobject_from_jsonv(). In the qobject-input visitor tests, it is trivial to convert to using the direct qobject_from_json() or a hand-built QObject. While at it, wrap some long lines noticed while auditing callers. Signed-off-by: Eric Blake --- tests/test-qobject-input-strict.c | 37 +++---------------- tests/test-qobject-input-visitor.c | 75 ++++++++++++++++---------------------- 2 files changed, 37 insertions(+), 75 deletions(-) diff --git a/tests/test-qobject-input-strict.c b/tests/test-qobject-input-strict.c index 4087ea3..8e6a74a 100644 --- a/tests/test-qobject-input-strict.c +++ b/tests/test-qobject-input-strict.c @@ -41,16 +41,15 @@ static void validate_teardown(TestInputVisitorData *data, } } -/* The various test_init functions are provided instead of a test setup +/* The test_init function 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 in main()). */ -static Visitor *validate_test_init_internal(TestInputVisitorData *data, - const char *json_string, - va_list *ap) +static Visitor *validate_test_init(TestInputVisitorData *data, + const char *json_string) { validate_teardown(data, NULL); - data->obj = qobject_from_jsonv(json_string, ap); + data->obj = qobject_from_json(json_string); g_assert(data->obj); data->qiv = qobject_input_visitor_new(data->obj, true); @@ -58,32 +57,6 @@ static Visitor *validate_test_init_internal(TestInputVisitorData *data, return data->qiv; } -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); - v = validate_test_init_internal(data, json_string, &ap); - va_end(ap); - return v; -} - -/* similar to validate_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 *validate_test_init_raw(TestInputVisitorData *data, - const char *json_string) -{ - return validate_test_init_internal(data, json_string, NULL); -} - static void test_validate_struct(TestInputVisitorData *data, const void *unused) @@ -315,7 +288,7 @@ static void do_test_validate_qmp_introspect(TestInputVisitorData *data, SchemaInfoList *schema = NULL; Visitor *v; - v = validate_test_init_raw(data, schema_json); + v = validate_test_init(data, schema_json); visit_type_SchemaInfoList(v, NULL, &schema, &error_abort); g_assert(schema); diff --git a/tests/test-qobject-input-visitor.c b/tests/test-qobject-input-visitor.c index 945404a..4c1436d 100644 --- a/tests/test-qobject-input-visitor.c +++ b/tests/test-qobject-input-visitor.c @@ -40,44 +40,24 @@ static void visitor_input_teardown(TestInputVisitorData *data, /* The various test_init functions are provided instead of a test setup function so that the JSON string used by the tests are kept in the test functions (and not in main()). */ -static Visitor *visitor_input_test_init_internal(TestInputVisitorData *data, - const char *json_string, - va_list *ap) +static Visitor *visitor_input_test_init_obj(TestInputVisitorData *data, + QObject *obj) { visitor_input_teardown(data, NULL); - data->obj = qobject_from_jsonv(json_string, ap); - g_assert(data->obj); - + data->obj = obj; data->qiv = qobject_input_visitor_new(data->obj, false); g_assert(data->qiv); return data->qiv; } -static GCC_FMT_ATTR(2, 3) -Visitor *visitor_input_test_init(TestInputVisitorData *data, - const char *json_string, ...) -{ - Visitor *v; - va_list ap; - - va_start(ap, json_string); - v = visitor_input_test_init_internal(data, json_string, &ap); - va_end(ap); - 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) +/* similar to visitor_input_test_init_obj(), but takes input as a raw JSON + * string rather than a preformed QObject */ -static Visitor *visitor_input_test_init_raw(TestInputVisitorData *data, - const char *json_string) +static Visitor *visitor_input_test_init(TestInputVisitorData *data, + const char *json_string) { - return visitor_input_test_init_internal(data, json_string, NULL); + return visitor_input_test_init_obj(data, qobject_from_json(json_string)); } static void test_visitor_in_int(TestInputVisitorData *data, @@ -87,7 +67,7 @@ static void test_visitor_in_int(TestInputVisitorData *data, int value = -42; Visitor *v; - v = visitor_input_test_init(data, "%d", value); + v = visitor_input_test_init_obj(data, QOBJECT(qint_from_int(value))); visit_type_int(v, NULL, &res, &error_abort); g_assert_cmpint(res, ==, value); @@ -104,7 +84,8 @@ static void test_visitor_in_int_overflow(TestInputVisitorData *data, * a QFloat/double field instead, leading to an error if we pass it * to visit_type_int. confirm this. */ - v = visitor_input_test_init(data, "%f", DBL_MAX); + v = visitor_input_test_init_obj(data, + QOBJECT(qfloat_from_double(DBL_MAX))); visit_type_int(v, NULL, &res, &err); error_free_or_abort(&err); @@ -116,7 +97,7 @@ static void test_visitor_in_bool(TestInputVisitorData *data, bool res = false; Visitor *v; - v = visitor_input_test_init(data, "true"); + v = visitor_input_test_init_obj(data, QOBJECT(qbool_from_bool(true))); visit_type_bool(v, NULL, &res, &error_abort); g_assert_cmpint(res, ==, true); @@ -128,7 +109,7 @@ static void test_visitor_in_number(TestInputVisitorData *data, double res = 0, value = 3.14; Visitor *v; - v = visitor_input_test_init(data, "%f", value); + v = visitor_input_test_init_obj(data, QOBJECT(qfloat_from_double(value))); visit_type_number(v, NULL, &res, &error_abort); g_assert_cmpfloat(res, ==, value); @@ -140,7 +121,7 @@ static void test_visitor_in_string(TestInputVisitorData *data, char *res = NULL, *value = (char *) "Q E M U"; Visitor *v; - v = visitor_input_test_init(data, "%s", value); + v = visitor_input_test_init_obj(data, QOBJECT(qstring_from_str(value))); visit_type_str(v, NULL, &res, &error_abort); g_assert_cmpstr(res, ==, value); @@ -156,8 +137,9 @@ static void test_visitor_in_enum(TestInputVisitorData *data, for (i = 0; EnumOne_lookup[i]; i++) { EnumOne res = -1; + QString *str = qstring_from_str(EnumOne_lookup[i]); - v = visitor_input_test_init(data, "%s", EnumOne_lookup[i]); + v = visitor_input_test_init_obj(data, QOBJECT(str)); visit_type_EnumOne(v, NULL, &res, &error_abort); g_assert_cmpint(i, ==, res); @@ -171,7 +153,8 @@ static void test_visitor_in_struct(TestInputVisitorData *data, TestStruct *p = NULL; Visitor *v; - v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }"); + v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true," + " 'string': 'foo' }"); visit_type_TestStruct(v, NULL, &p, &error_abort); g_assert_cmpint(p->integer, ==, -42); @@ -191,7 +174,8 @@ static void test_visitor_in_struct_nested(TestInputVisitorData *data, v = visitor_input_test_init(data, "{ 'string0': 'string0', " "'dict1': { 'string1': 'string1', " "'dict2': { 'userdef': { 'integer': 42, " - "'string': 'string' }, 'string': 'string2'}}}"); + "'string': 'string' }, " + "'string': 'string2'}}}"); visit_type_UserDefTwo(v, NULL, &udp, &error_abort); @@ -212,7 +196,10 @@ static void test_visitor_in_list(TestInputVisitorData *data, Visitor *v; int i; - v = visitor_input_test_init(data, "[ { 'string': 'string0', 'integer': 42 }, { 'string': 'string1', 'integer': 43 }, { 'string': 'string2', 'integer': 44 } ]"); + v = visitor_input_test_init(data, + "[ { 'string': 'string0', 'integer': 42 }," + "{ 'string': 'string1', 'integer': 43 }, " + "{ 'string': 'string2', 'integer': 44 } ]"); visit_type_UserDefOneList(v, NULL, &head, &error_abort); g_assert(head != NULL); @@ -252,7 +239,8 @@ static void test_visitor_in_any(TestInputVisitorData *data, g_assert_cmpint(qint_get_int(qint), ==, -42); qobject_decref(res); - v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, 'string': 'foo' }"); + v = visitor_input_test_init(data, "{ 'integer': -42, 'boolean': true, " + "'string': 'foo' }"); visit_type_any(v, NULL, &res, &error_abort); qdict = qobject_to_qdict(res); g_assert(qdict && qdict_size(qdict) == 3); @@ -375,7 +363,8 @@ static void test_visitor_in_alternate(TestInputVisitorData *data, g_assert_cmpstr(wrap->alt->u.s, ==, "string"); qapi_free_WrapAlternate(wrap); - v = visitor_input_test_init(data, "{ 'alt': {'integer':1, 'string':'str', " + v = visitor_input_test_init(data, "{ 'alt': {'integer':1, " + "'string':'str', " "'enum1':'value1', 'boolean':true} }"); visit_type_WrapAlternate(v, NULL, &wrap, &error_abort); g_assert_cmpint(wrap->alt->type, ==, QTYPE_QDICT); @@ -492,7 +481,7 @@ static void test_native_list_integer_helper(TestInputVisitorData *data, 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); + v = visitor_input_test_init(data, gstr_union->str); visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort); g_assert(cvalue != NULL); @@ -654,7 +643,7 @@ static void test_visitor_in_native_list_bool(TestInputVisitorData *data, } g_string_append_printf(gstr_union, "{ 'type': 'boolean', 'data': [ %s ] }", gstr_list->str); - v = visitor_input_test_init_raw(data, gstr_union->str); + v = visitor_input_test_init(data, gstr_union->str); visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort); g_assert(cvalue != NULL); @@ -687,7 +676,7 @@ static void test_visitor_in_native_list_string(TestInputVisitorData *data, } g_string_append_printf(gstr_union, "{ 'type': 'string', 'data': [ %s ] }", gstr_list->str); - v = visitor_input_test_init_raw(data, gstr_union->str); + v = visitor_input_test_init(data, gstr_union->str); visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort); g_assert(cvalue != NULL); @@ -724,7 +713,7 @@ static void test_visitor_in_native_list_number(TestInputVisitorData *data, } g_string_append_printf(gstr_union, "{ 'type': 'number', 'data': [ %s ] }", gstr_list->str); - v = visitor_input_test_init_raw(data, gstr_union->str); + v = visitor_input_test_init(data, gstr_union->str); visit_type_UserDefNativeListUnion(v, NULL, &cvalue, &error_abort); g_assert(cvalue != NULL);