qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Eric Blake <eblake@redhat.com>
To: qemu-devel@nongnu.org
Cc: armbru@redhat.com, Michael Roth <mdroth@linux.vnet.ibm.com>
Subject: [Qemu-devel] [PATCH v10 01/30] qapi: Use generated TestStruct machinery in tests
Date: Thu,  5 Nov 2015 23:35:25 -0700	[thread overview]
Message-ID: <1446791754-23823-2-git-send-email-eblake@redhat.com> (raw)
In-Reply-To: <1446791754-23823-1-git-send-email-eblake@redhat.com>

Commit d88f5fd and friends first introduced the various test-qmp-*
tests in 2011, with duplicated hand-rolled TestStruct machinery,
to make sure the qapi visitor interface was tested.  Later, commit
4f193e3 in 2013 added a .json file for further testing use by the
files, but without consolidating any of the existing hand-rolled
visitors.  And with four copies, subtle differences have crept in,
between the tests themselves (mainly whitespace differences, but
also a question of whether to use NULL or "TestStruct" when
calling visit_start_struct()) and from what the generator produces
(the hand-rolled versions did not cater to partially-allocated
objects, because they did not have a deallocation usage).

Of course, just because the visitor interface is tested does not
mean it is a sane interface; and future patches will be changing
some of the visitor contracts.  Rather than having to duplicate
the cleanup work in each copy of the TestStruct visitor, and keep
each hand-rolled copy in sync with what the generator supplies, we
might as well just test what the generator should give us in the
first place.

Signed-off-by: Eric Blake <eblake@redhat.com>

---
v10: no change
v9: no change
v8: improve commit message
v7: rebase on top of subset B v9; defer unrelated trailing whitespace
cleanups to later in series
v6: new patch
---
 tests/qapi-schema/qapi-schema-test.json |  6 +++-
 tests/qapi-schema/qapi-schema-test.out  |  5 +++
 tests/test-qmp-input-strict.c           | 35 --------------------
 tests/test-qmp-input-visitor.c          | 34 -------------------
 tests/test-qmp-output-visitor.c         | 58 ---------------------------------
 tests/test-visitor-serialization.c      | 34 -------------------
 6 files changed, 10 insertions(+), 162 deletions(-)

diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
index 48e104b..44638da 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -3,6 +3,9 @@
 # This file is a stress test of supported qapi constructs that must
 # parse and compile correctly.

+{ 'struct': 'TestStruct',
+  'data': { 'integer': 'int', 'boolean': 'bool', 'string': 'str' } }
+
 # for testing enums
 { 'struct': 'NestedEnumsOne',
   'data': { 'enum1': 'EnumOne',   # Intentional forward reference
@@ -46,7 +49,8 @@

 # dummy struct to force generation of array types not otherwise mentioned
 { 'struct': 'ForceArrays',
-  'data': { 'unused1':['UserDefOne'], 'unused2':['UserDefTwo'] } }
+  'data': { 'unused1':['UserDefOne'], 'unused2':['UserDefTwo'],
+            'unused3':['TestStruct'] } }

 # for testing unions
 # Among other things, test that a name collision between branches does
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index a7e9aab..e20a823 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -92,6 +92,7 @@ object EventStructOne
 object ForceArrays
     member unused1: UserDefOneList optional=False
     member unused2: UserDefTwoList optional=False
+    member unused3: TestStructList optional=False
 enum MyEnum []
 object NestedEnumsOne
     member enum1: EnumOne optional=False
@@ -100,6 +101,10 @@ object NestedEnumsOne
     member enum4: EnumOne optional=True
 enum QEnumTwo ['value1', 'value2']
     prefix QENUM_TWO
+object TestStruct
+    member integer: int optional=False
+    member boolean: bool optional=False
+    member string: str optional=False
 object UserDefA
     member boolean: bool optional=False
     member a_b: int optional=True
diff --git a/tests/test-qmp-input-strict.c b/tests/test-qmp-input-strict.c
index 53a7693..b44184f 100644
--- a/tests/test-qmp-input-strict.c
+++ b/tests/test-qmp-input-strict.c
@@ -89,41 +89,6 @@ static Visitor *validate_test_init_raw(TestInputVisitorData *data,
     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)
-{
-    Error *err = NULL;
-
-    visit_start_struct(v, (void **)obj, "TestStruct", name, sizeof(TestStruct),
-                       &err);
-    if (err) {
-        goto out;
-    }
-
-    visit_type_int(v, &(*obj)->integer, "integer", &err);
-    if (err) {
-        goto out_end;
-    }
-    visit_type_bool(v, &(*obj)->boolean, "boolean", &err);
-    if (err) {
-        goto out_end;
-    }
-    visit_type_str(v, &(*obj)->string, "string", &err);
-
-out_end:
-    error_propagate(errp, err);
-    err = NULL;
-    visit_end_struct(v, &err);
-out:
-    error_propagate(errp, err);
-}

 static void test_validate_struct(TestInputVisitorData *data,
                                   const void *unused)
diff --git a/tests/test-qmp-input-visitor.c b/tests/test-qmp-input-visitor.c
index de65982..3f6bc4d 100644
--- a/tests/test-qmp-input-visitor.c
+++ b/tests/test-qmp-input-visitor.c
@@ -185,40 +185,6 @@ static void test_visitor_in_enum(TestInputVisitorData *data,
     data->qiv = NULL;
 }

-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)
-{
-    Error *err = NULL;
-
-    visit_start_struct(v, (void **)obj, "TestStruct", name, sizeof(TestStruct),
-                       &err);
-    if (err) {
-        goto out;
-    }
-    visit_type_int(v, &(*obj)->integer, "integer", &err);
-    if (err) {
-        goto out_end;
-    }
-    visit_type_bool(v, &(*obj)->boolean, "boolean", &err);
-    if (err) {
-        goto out_end;
-    }
-    visit_type_str(v, &(*obj)->string, "string", &err);
-
-out_end:
-    error_propagate(errp, err);
-    err = NULL;
-    visit_end_struct(v, &err);
-out:
-    error_propagate(errp, err);
-}

 static void test_visitor_in_struct(TestInputVisitorData *data,
                                    const void *unused)
diff --git a/tests/test-qmp-output-visitor.c b/tests/test-qmp-output-visitor.c
index 09d0dd8..baf58dc 100644
--- a/tests/test-qmp-output-visitor.c
+++ b/tests/test-qmp-output-visitor.c
@@ -166,41 +166,6 @@ static void test_visitor_out_enum_errors(TestOutputVisitorData *data,
     }
 }

-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)
-{
-    Error *err = NULL;
-
-    visit_start_struct(v, (void **)obj, "TestStruct", name, sizeof(TestStruct),
-                       &err);
-    if (err) {
-        goto out;
-    }
-
-    visit_type_int(v, &(*obj)->integer, "integer", &err);
-    if (err) {
-        goto out_end;
-    }
-    visit_type_bool(v, &(*obj)->boolean, "boolean", &err);
-    if (err) {
-        goto out_end;
-    }
-    visit_type_str(v, &(*obj)->string, "string", &err);
-
-out_end:
-    error_propagate(errp, err);
-    err = NULL;
-    visit_end_struct(v, &err);
-out:
-    error_propagate(errp, err);
-}

 static void test_visitor_out_struct(TestOutputVisitorData *data,
                                     const void *unused)
@@ -314,29 +279,6 @@ static void test_visitor_out_struct_errors(TestOutputVisitorData *data,
     }
 }

-typedef struct TestStructList
-{
-    union {
-        TestStruct *value;
-        uint64_t padding;
-    };
-    struct TestStructList *next;
-} TestStructList;
-
-static void visit_type_TestStructList(Visitor *v, TestStructList **obj,
-                                      const char *name, Error **errp)
-{
-    GenericList *i, **head = (GenericList **)obj;
-
-    visit_start_list(v, name, errp);
-
-    for (*head = i = visit_next_list(v, head, errp); i; i = visit_next_list(v, &i, errp)) {
-        TestStructList *native_i = (TestStructList *)i;
-        visit_type_TestStruct(v, &native_i->value, NULL, errp);
-    }
-
-    visit_end_list(v, errp);
-}

 static void test_visitor_out_list(TestOutputVisitorData *data,
                                   const void *unused)
diff --git a/tests/test-visitor-serialization.c b/tests/test-visitor-serialization.c
index 634563b..c024e5e 100644
--- a/tests/test-visitor-serialization.c
+++ b/tests/test-visitor-serialization.c
@@ -186,40 +186,6 @@ static void visit_primitive_list(Visitor *v, void **native, Error **errp)
     }
 }

-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)
-{
-    Error *err = NULL;
-
-    visit_start_struct(v, (void **)obj, NULL, name, sizeof(TestStruct), &err);
-    if (err) {
-        goto out;
-    }
-
-    visit_type_int(v, &(*obj)->integer, "integer", &err);
-    if (err) {
-        goto out_end;
-    }
-    visit_type_bool(v, &(*obj)->boolean, "boolean", &err);
-    if (err) {
-        goto out_end;
-    }
-    visit_type_str(v, &(*obj)->string, "string", &err);
-
-out_end:
-    error_propagate(errp, err);
-    err = NULL;
-    visit_end_struct(v, &err);
-out:
-    error_propagate(errp, err);
-}

 static TestStruct *struct_create(void)
 {
-- 
2.4.3

  reply	other threads:[~2015-11-06  6:36 UTC|newest]

Thread overview: 85+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-06  6:35 [Qemu-devel] [PATCH v10 00/30] qapi member collision (post-introspection cleanups, subset C') Eric Blake
2015-11-06  6:35 ` Eric Blake [this message]
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 02/30] qapi: Strengthen test of TestStructList Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 03/30] qobject: Protect against use-after-free in qobject_decref() Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 04/30] qapi: Share test_init code in test-qmp-input* Eric Blake
2015-11-06 15:17   ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 05/30] qapi: Plug leaks in test-qmp-* Eric Blake
2015-11-06 15:21   ` Markus Armbruster
2015-11-06 15:49     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 06/30] qapi: Simplify non-error testing " Eric Blake
2015-11-06 15:36   ` Markus Armbruster
2015-11-06 15:54     ` Eric Blake
2015-11-06 16:24       ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 07/30] qapi: Simplify error cleanup " Eric Blake
2015-11-06 15:40   ` Markus Armbruster
2015-11-06 15:59     ` Eric Blake
2015-11-06 16:23       ` Markus Armbruster
2015-11-06 16:32         ` Eric Blake
2015-11-06 17:04   ` [Qemu-devel] [PATCH] fixup! " Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 08/30] qapi: More tests of alternate output Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 09/30] qapi: Test failure in middle of array parse Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 10/30] qapi: More tests of input arrays Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 11/30] qapi: Provide nicer array names in introspection Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 12/30] qapi-introspect: Document lack of sorting Eric Blake
2015-11-06 15:52   ` Markus Armbruster
2015-11-09 20:56     ` Eric Blake
2015-11-10  7:36       ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 13/30] qapi: Track simple union tag in object.local_members Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 14/30] qapi-types: Consolidate gen_struct() and gen_union() Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 15/30] qapi-types: Simplify gen_struct_field[s] Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 16/30] qapi: Drop obsolete tag value collision assertions Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 17/30] qapi: Simplify QAPISchemaObjectTypeMember.check() Eric Blake
2015-11-09 12:31   ` Markus Armbruster
2015-11-09 14:44     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 18/30] qapi: Clean up after previous commit Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 19/30] qapi: Fix up commit 7618b91's clash sanity checking change Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 20/30] qapi: Eliminate QAPISchemaObjectType.check() variable members Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 21/30] qapi: Factor out QAPISchemaObjectTypeMember.check_clash() Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 22/30] qapi: Simplify QAPISchemaObjectTypeVariants.check() Eric Blake
2015-11-09 12:38   ` Markus Armbruster
2015-11-10  5:04     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 23/30] qapi: Check for qapi collisions of flat union branches Eric Blake
2015-11-09 12:56   ` Markus Armbruster
2015-11-09 15:13     ` Markus Armbruster
2015-11-10  5:18       ` Eric Blake
2015-11-10  5:16     ` Eric Blake
2015-11-10  8:30       ` Markus Armbruster
2015-11-10 13:24         ` Eric Blake
2015-11-10 23:37       ` Eric Blake
2015-11-11  9:50         ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 24/30] qapi: Factor out QAPISchemaObjectType.check_clash() Eric Blake
2015-11-09 13:00   ` Markus Armbruster
2015-11-09 17:36     ` Eric Blake
2015-11-09 19:11       ` Markus Armbruster
2015-11-10  5:22         ` Eric Blake
2015-11-09 14:49   ` Markus Armbruster
2015-11-10  5:32     ` Eric Blake
2015-11-10  9:15       ` Markus Armbruster
2015-11-10 13:19         ` Eric Blake
2015-11-10 14:43           ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 25/30] qapi: Hoist tag collision check to Variants.check() Eric Blake
2015-11-09 13:07   ` Markus Armbruster
2015-11-10  5:33     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 26/30] qapi: Remove outdated tests related to QMP/branch collisions Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 27/30] qapi: Track owner of each object member Eric Blake
2015-11-09 14:26   ` Markus Armbruster
2015-11-11  0:17     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 28/30] qapi: Detect collisions in C member names Eric Blake
2015-11-09 15:17   ` Markus Armbruster
2015-11-11  0:34     ` Eric Blake
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 29/30] cpu: Convert CpuInfo into flat union Eric Blake
2015-11-09 15:22   ` Markus Armbruster
2015-11-11  2:50     ` Eric Blake
2015-11-11 10:19       ` Markus Armbruster
2015-11-11 15:40         ` Eric Blake
2015-11-11 17:00           ` Markus Armbruster
2015-11-06  6:35 ` [Qemu-devel] [PATCH v10 30/30] qapi: Forbid case-insensitive clashes Eric Blake
2015-11-09 15:42   ` Markus Armbruster
2015-11-06 16:03 ` [Qemu-devel] [PATCH v10 00/30] qapi member collision (post-introspection cleanups, subset C') Markus Armbruster
2015-11-06 16:08   ` Eric Blake
2015-11-09  9:59     ` Markus Armbruster
2015-11-09 14:43       ` Eric Blake
2015-11-09 18:42         ` Markus Armbruster
2015-11-10 11:57           ` Markus Armbruster
2015-11-11 22:48             ` Eric Blake

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1446791754-23823-2-git-send-email-eblake@redhat.com \
    --to=eblake@redhat.com \
    --cc=armbru@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).