All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code
@ 2014-02-10 14:20 Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 01/13] tests/qapi-schema: Actually check successful QMP command response Markus Armbruster
                   ` (13 more replies)
  0 siblings, 14 replies; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Coverity is unhappy with the generated code.  Nothing serious, just
heaps of valid DEADCODE defects topped off with a few bogus
FORWARD_NULL defects.

I had a look at the generator, and decided I don't want to mess with
it without decent test coverage.  Unfortunately, a few features have
been added without tests.  My first seven patches make the tests catch
up.  tests/qapi-schema/qapi-schema-test.json now covers all mcgen() in
scripts/qapi*.py, except for a few in qapi-commands.py that are
conditional on -m.

The next four patches clean up the generated code.

I also reviewed null checks in visitor implementations.  The final two
patches address the issues I found there.

v2:
* Previously separate patch "qapi: Fix licensing of scripts" revised
  and included as "[PATCH v2 08/13] qapi: Fix licensing of scripts"
* Style cleanups
* New PATCH 12/13 and 13/13

Markus Armbruster (13):
  tests/qapi-schema: Actually check successful QMP command response
  tests/qapi-schema: Cover optional command arguments
  tests/qapi-schema: Cover simple argument types
  tests/qapi-schema: Cover anonymous union types
  tests/qapi-schema: Cover complex types with base
  tests/qapi-schema: Cover union types with base
  tests/qapi-schema: Cover flat union types
  qapi: Fix licensing of scripts
  qapi: Drop nonsensical header guard in generated qapi-visit.c
  qapi: Drop unused code in qapi-commands.py
  qapi: Clean up null checking in generated visitors
  qapi: Clean up superfluous null check in qapi_dealloc_type_str()
  qapi: Add missing null check to opts_start_struct()

 qapi/opts-visitor.c                     |  4 +-
 qapi/qapi-dealloc-visitor.c             |  4 +-
 scripts/qapi-commands.py                | 24 +---------
 scripts/qapi-types.py                   |  4 +-
 scripts/qapi-visit.py                   | 20 ++++-----
 scripts/qapi.py                         |  4 +-
 tests/qapi-schema/qapi-schema-test.json | 24 +++++++++-
 tests/qapi-schema/qapi-schema-test.out  | 19 +++++---
 tests/test-qmp-commands.c               | 78 +++++++++++++++++++++++++++------
 tests/test-qmp-input-strict.c           | 69 ++++++++++++++++++++++++++++-
 tests/test-qmp-input-visitor.c          | 45 +++++++++++++++++--
 tests/test-qmp-output-visitor.c         | 67 ++++++++++++++++++++++++++--
 tests/test-visitor-serialization.c      | 14 +++---
 13 files changed, 299 insertions(+), 77 deletions(-)

-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v2 01/13] tests/qapi-schema: Actually check successful QMP command response
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 02/13] tests/qapi-schema: Cover optional command arguments Markus Armbruster
                   ` (12 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/test-qmp-commands.c | 43 +++++++++++++++++++++++++++++++++++--------
 1 file changed, 35 insertions(+), 8 deletions(-)

diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c
index 5a3e82a..d039b87 100644
--- a/tests/test-qmp-commands.c
+++ b/tests/test-qmp-commands.c
@@ -71,6 +71,23 @@ 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)
 {
@@ -78,7 +95,8 @@ static void test_dispatch_cmd_io(void)
     QDict *args = 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;
 
     qdict_put_obj(ud1a, "integer", QOBJECT(qint_from_int(42)));
     qdict_put_obj(ud1a, "string", QOBJECT(qstring_from_str("hello")));
@@ -87,15 +105,24 @@ 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"));
-
-    qobject_decref(resp);
+    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);
     QDECREF(req);
 }
 
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v2 02/13] tests/qapi-schema: Cover optional command arguments
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 01/13] tests/qapi-schema: Actually check successful QMP command response Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 03/13] tests/qapi-schema: Cover simple argument types Markus Armbruster
                   ` (11 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/qapi-schema/qapi-schema-test.json | 4 +++-
 tests/qapi-schema/qapi-schema-test.out  | 2 +-
 tests/test-qmp-commands.c               | 8 +++++---
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
index fe5af75..d2b1397 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -50,7 +50,9 @@
 # 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' }
 
 # For testing integer range flattening in opts-visitor. The following schema
 # corresponds to the option format:
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index 3851880..af9829e 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -9,7 +9,7 @@
  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([('type', 'UserDefOptions'), ('data', OrderedDict([('*i64', ['int']), ('*u64', ['uint64']), ('*u16', ['uint16']), ('*i64x', 'int'), ('*u64x', 'uint64')]))])]
 ['EnumOne', 'UserDefUnionKind', 'UserDefNativeListUnionKind']
 [OrderedDict([('type', 'NestedEnumsOne'), ('data', OrderedDict([('enum1', 'EnumOne'), ('*enum2', 'EnumOne'), ('enum3', 'EnumOne'), ('*enum4', 'EnumOne')]))]),
diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c
index d039b87..d7720ab 100644
--- a/tests/test-qmp-commands.c
+++ b/tests/test-qmp-commands.c
@@ -16,7 +16,9 @@ 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));
@@ -24,8 +26,8 @@ UserDefTwo * qmp_user_def_cmd2(UserDefOne * ud1a, UserDefOne * ud1b, Error **err
 
     ud1c->string = strdup(ud1a->string);
     ud1c->integer = ud1a->integer;
-    ud1d->string = strdup(ud1b->string);
-    ud1d->integer = ud1b->integer;
+    ud1d->string = strdup(has_udb1 ? ud1b->string : "blah0");
+    ud1d->integer = has_udb1 ? ud1b->integer : 0;
 
     ret = g_malloc0(sizeof(UserDefTwo));
     ret->string = strdup("blah1");
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v2 03/13] tests/qapi-schema: Cover simple argument types
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 01/13] tests/qapi-schema: Actually check successful QMP command response Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 02/13] tests/qapi-schema: Cover optional command arguments Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 04/13] tests/qapi-schema: Cover anonymous union types Markus Armbruster
                   ` (10 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/qapi-schema/qapi-schema-test.json |  2 ++
 tests/qapi-schema/qapi-schema-test.out  |  1 +
 tests/test-qmp-commands.c               | 16 ++++++++++++++++
 3 files changed, 19 insertions(+)

diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
index d2b1397..3f62821 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -53,6 +53,8 @@
 { '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:
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index af9829e..59468ac 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -10,6 +10,7 @@
  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_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']
 [OrderedDict([('type', 'NestedEnumsOne'), ('data', OrderedDict([('enum1', 'EnumOne'), ('*enum2', 'EnumOne'), ('enum3', 'EnumOne'), ('*enum4', 'EnumOne')]))]),
diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c
index d7720ab..4586cee 100644
--- a/tests/test-qmp-commands.c
+++ b/tests/test-qmp-commands.c
@@ -41,6 +41,11 @@ UserDefTwo *qmp_user_def_cmd2(UserDefOne *ud1a,
     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)
 {
@@ -95,10 +100,12 @@ 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();
     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")));
@@ -125,6 +132,15 @@ static void test_dispatch_cmd_io(void)
     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);
+
     QDECREF(req);
 }
 
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v2 04/13] tests/qapi-schema: Cover anonymous union types
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
                   ` (2 preceding siblings ...)
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 03/13] tests/qapi-schema: Cover simple argument types Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 05/13] tests/qapi-schema: Cover complex types with base Markus Armbruster
                   ` (9 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/qapi-schema/qapi-schema-test.json |  4 ++++
 tests/qapi-schema/qapi-schema-test.out  |  6 +++++-
 tests/test-qmp-input-strict.c           | 32 ++++++++++++++++++++++++++++++++
 tests/test-qmp-input-visitor.c          | 18 ++++++++++++++++++
 tests/test-qmp-output-visitor.c         | 22 ++++++++++++++++++++++
 5 files changed, 81 insertions(+), 1 deletion(-)

diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
index 3f62821..8405021 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -32,6 +32,10 @@
 { 'union': 'UserDefUnion',
   'data': { 'a' : 'UserDefA', 'b' : 'UserDefB' } }
 
+{ 'union': 'UserDefAnonUnion',
+  'discriminator': {},
+  'data': { 'uda': 'UserDefA', 's': 'str', 'i': 'int' } }
+
 # for testing native lists
 { 'union': 'UserDefNativeListUnion',
   'data': { 'integer': ['int'],
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index 59468ac..ac98f32 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -6,13 +6,17 @@
  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', '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_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',
+ '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', 'UserDefTwo'), ('data', OrderedDict([('string', 'str'), ('dict', OrderedDict([('string', 'str'), ('dict', OrderedDict([('userdef', 'UserDefOne'), ('string', 'str')])), ('*dict2', OrderedDict([('userdef', 'UserDefOne'), ('string', 'str')]))]))]))]),
diff --git a/tests/test-qmp-input-strict.c b/tests/test-qmp-input-strict.c
index 6f68963..75dd49f 100644
--- a/tests/test-qmp-input-strict.c
+++ b/tests/test-qmp-input-strict.c
@@ -139,6 +139,20 @@ static void test_validate_union(TestInputVisitorData *data,
     qapi_free_UserDefUnion(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)
 {
@@ -198,6 +212,20 @@ static void test_validate_fail_union(TestInputVisitorData *data,
     qapi_free_UserDefUnion(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 +248,8 @@ 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-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 +258,8 @@ 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-anon",
+                       &testdata, test_validate_fail_union_anon);
 
     g_test_run();
 
diff --git a/tests/test-qmp-input-visitor.c b/tests/test-qmp-input-visitor.c
index 1e1c6fa..89f845b 100644
--- a/tests/test-qmp-input-visitor.c
+++ b/tests/test-qmp-input-visitor.c
@@ -302,6 +302,22 @@ static void test_visitor_in_union(TestInputVisitorData *data,
     qapi_free_UserDefUnion(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 +651,8 @@ 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-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",
diff --git a/tests/test-qmp-output-visitor.c b/tests/test-qmp-output-visitor.c
index e073d83..86efdb4 100644
--- a/tests/test-qmp-output-visitor.c
+++ b/tests/test-qmp-output-visitor.c
@@ -434,6 +434,26 @@ static void test_visitor_out_union(TestOutputVisitorData *data,
     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 +802,8 @@ 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-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",
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v2 05/13] tests/qapi-schema: Cover complex types with base
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
                   ` (3 preceding siblings ...)
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 04/13] tests/qapi-schema: Cover anonymous union types Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 06/13] tests/qapi-schema: Cover union " Markus Armbruster
                   ` (8 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/qapi-schema/qapi-schema-test.json |  6 +++++-
 tests/qapi-schema/qapi-schema-test.out  |  6 ++++--
 tests/test-qmp-commands.c               | 15 ++++++++++-----
 tests/test-qmp-input-visitor.c          |  4 ++--
 tests/test-qmp-output-visitor.c         | 12 ++++++++----
 tests/test-visitor-serialization.c      | 14 ++++++++------
 6 files changed, 37 insertions(+), 20 deletions(-)

diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
index 8405021..c7e6be8 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -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',
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index ac98f32..89e213a 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -1,6 +1,7 @@
 [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')]))]),
@@ -18,7 +19,8 @@
  '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')]))]),
diff --git a/tests/test-qmp-commands.c b/tests/test-qmp-commands.c
index 4586cee..8e62c2d 100644
--- a/tests/test-qmp-commands.c
+++ b/tests/test-qmp-commands.c
@@ -25,9 +25,11 @@ UserDefTwo *qmp_user_def_cmd2(UserDefOne *ud1a,
     UserDefOne *ud1d = g_malloc0(sizeof(UserDefOne));
 
     ud1c->string = strdup(ud1a->string);
-    ud1c->integer = ud1a->integer;
+    ud1c->base = g_new0(UserDefZero, 1);
+    ud1c->base->integer = ud1a->base->integer;
     ud1d->string = strdup(has_udb1 ? ud1b->string : "blah0");
-    ud1d->integer = has_udb1 ? ud1b->integer : 0;
+    ud1d->base = g_new0(UserDefZero, 1);
+    ud1d->base->integer = has_udb1 ? ud1b->base->integer : 0;
 
     ret = g_malloc0(sizeof(UserDefTwo));
     ret->string = strdup("blah1");
@@ -151,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));
diff --git a/tests/test-qmp-input-visitor.c b/tests/test-qmp-input-visitor.c
index 89f845b..30d24e2 100644
--- a/tests/test-qmp-input-visitor.c
+++ b/tests/test-qmp-input-visitor.c
@@ -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);
diff --git a/tests/test-qmp-output-visitor.c b/tests/test-qmp-output-visitor.c
index 86efdb4..3179430 100644
--- a/tests/test-qmp-output-visitor.c
+++ b/tests/test-qmp-output-visitor.c
@@ -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;
 
diff --git a/tests/test-visitor-serialization.c b/tests/test-visitor-serialization.c
index 9aaa587..dfce5aa 100644
--- a/tests/test-visitor-serialization.c
+++ b/tests/test-visitor-serialization.c
@@ -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);
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v2 06/13] tests/qapi-schema: Cover union types with base
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
                   ` (4 preceding siblings ...)
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 05/13] tests/qapi-schema: Cover complex types with base Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 07/13] tests/qapi-schema: Cover flat union types Markus Armbruster
                   ` (7 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/qapi-schema/qapi-schema-test.json | 1 +
 tests/qapi-schema/qapi-schema-test.out  | 2 +-
 tests/test-qmp-input-strict.c           | 4 ++--
 tests/test-qmp-input-visitor.c          | 3 ++-
 tests/test-qmp-output-visitor.c         | 2 ++
 5 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
index c7e6be8..f5c5d37 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -34,6 +34,7 @@
   'data': { 'integer': 'int' } }
 
 { 'union': 'UserDefUnion',
+  'base': 'UserDefZero',
   'data': { 'a' : 'UserDefA', 'b' : 'UserDefB' } }
 
 { 'union': 'UserDefAnonUnion',
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index 89e213a..3f51afd 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -6,7 +6,7 @@
  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', '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())]),
diff --git a/tests/test-qmp-input-strict.c b/tests/test-qmp-input-strict.c
index 75dd49f..a58f55f 100644
--- a/tests/test-qmp-input-strict.c
+++ b/tests/test-qmp-input-strict.c
@@ -132,7 +132,7 @@ 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(!error_is_set(&errp));
@@ -205,7 +205,7 @@ 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(error_is_set(&errp));
diff --git a/tests/test-qmp-input-visitor.c b/tests/test-qmp-input-visitor.c
index 30d24e2..1c92572 100644
--- a/tests/test-qmp-input-visitor.c
+++ b/tests/test-qmp-input-visitor.c
@@ -293,11 +293,12 @@ 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);
 }
diff --git a/tests/test-qmp-output-visitor.c b/tests/test-qmp-output-visitor.c
index 3179430..6ed7ffa 100644
--- a/tests/test-qmp-output-visitor.c
+++ b/tests/test-qmp-output-visitor.c
@@ -416,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;
 
@@ -427,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);
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v2 07/13] tests/qapi-schema: Cover flat union types
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
                   ` (5 preceding siblings ...)
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 06/13] tests/qapi-schema: Cover union " Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 08/13] qapi: Fix licensing of scripts Markus Armbruster
                   ` (6 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

The test demonstrates a generator bug: the generated struct
UserDefFlatUnion doesn't include members for the indirect base
UserDefZero.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 tests/qapi-schema/qapi-schema-test.json |  7 +++++++
 tests/qapi-schema/qapi-schema-test.out  |  2 ++
 tests/test-qmp-input-strict.c           | 33 +++++++++++++++++++++++++++++++++
 tests/test-qmp-input-visitor.c          | 20 ++++++++++++++++++++
 tests/test-qmp-output-visitor.c         | 31 +++++++++++++++++++++++++++++++
 5 files changed, 93 insertions(+)

diff --git a/tests/qapi-schema/qapi-schema-test.json b/tests/qapi-schema/qapi-schema-test.json
index f5c5d37..471ba47 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -37,6 +37,13 @@
   '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' } }
diff --git a/tests/qapi-schema/qapi-schema-test.out b/tests/qapi-schema/qapi-schema-test.out
index 3f51afd..89b53d4 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -7,6 +7,7 @@
  OrderedDict([('type', 'UserDefA'), ('data', OrderedDict([('boolean', 'bool')]))]),
  OrderedDict([('type', 'UserDefB'), ('data', OrderedDict([('integer', 'int')]))]),
  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())]),
@@ -16,6 +17,7 @@
  OrderedDict([('type', 'UserDefOptions'), ('data', OrderedDict([('*i64', ['int']), ('*u64', ['uint64']), ('*u16', ['uint16']), ('*i64x', 'int'), ('*u64x', 'uint64')]))])]
 ['EnumOne',
  'UserDefUnionKind',
+ 'UserDefFlatUnionKind',
  'UserDefAnonUnionKind',
  'UserDefNativeListUnionKind']
 [OrderedDict([('type', 'NestedEnumsOne'), ('data', OrderedDict([('enum1', 'EnumOne'), ('*enum2', 'EnumOne'), ('enum3', 'EnumOne'), ('*enum4', 'EnumOne')]))]),
diff --git a/tests/test-qmp-input-strict.c b/tests/test-qmp-input-strict.c
index a58f55f..09fc1ef 100644
--- a/tests/test-qmp-input-strict.c
+++ b/tests/test-qmp-input-strict.c
@@ -139,6 +139,21 @@ static void test_validate_union(TestInputVisitorData *data,
     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)
 {
@@ -212,6 +227,20 @@ static void test_validate_fail_union(TestInputVisitorData *data,
     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)
 {
@@ -248,6 +277,8 @@ 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",
@@ -258,6 +289,8 @@ 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);
 
diff --git a/tests/test-qmp-input-visitor.c b/tests/test-qmp-input-visitor.c
index 1c92572..f1ab541 100644
--- a/tests/test-qmp-input-visitor.c
+++ b/tests/test-qmp-input-visitor.c
@@ -303,6 +303,24 @@ static void test_visitor_in_union(TestInputVisitorData *data,
     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)
 {
@@ -652,6 +670,8 @@ 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",
diff --git a/tests/test-qmp-output-visitor.c b/tests/test-qmp-output-visitor.c
index 6ed7ffa..5613396 100644
--- a/tests/test-qmp-output-visitor.c
+++ b/tests/test-qmp-output-visitor.c
@@ -440,6 +440,35 @@ 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)
 {
@@ -808,6 +837,8 @@ 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",
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v2 08/13] qapi: Fix licensing of scripts
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
                   ` (6 preceding siblings ...)
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 07/13] tests/qapi-schema: Cover flat union types Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 15:26   ` Eric Blake
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 09/13] qapi: Drop nonsensical header guard in generated qapi-visit.c Markus Armbruster
                   ` (5 subsequent siblings)
  13 siblings, 1 reply; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

The scripts carry this copyright notice:

    # This work is licensed under the terms of the GNU GPLv2.
    # See the COPYING.LIB file in the top-level directory.

The sentences contradict each other, as COPYING.LIB contains the LGPL
2.1.  Michael Roth says this was a simple pasto, and he meant to refer
COPYING.  Let's fix that.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 scripts/qapi-commands.py | 4 ++--
 scripts/qapi-types.py    | 4 ++--
 scripts/qapi-visit.py    | 4 ++--
 scripts/qapi.py          | 4 ++--
 4 files changed, 8 insertions(+), 8 deletions(-)

diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
index b12b696..38c2347 100644
--- a/scripts/qapi-commands.py
+++ b/scripts/qapi-commands.py
@@ -7,8 +7,8 @@
 #  Anthony Liguori <aliguori@us.ibm.com>
 #  Michael Roth    <mdroth@linux.vnet.ibm.com>
 #
-# This work is licensed under the terms of the GNU GPLv2.
-# See the COPYING.LIB file in the top-level directory.
+# This work is licensed under the terms of the GNU GPL, version 2.
+# See the COPYING file in the top-level directory.
 
 from ordereddict import OrderedDict
 from qapi import *
diff --git a/scripts/qapi-types.py b/scripts/qapi-types.py
index 4a1652b..2c6e0dc 100644
--- a/scripts/qapi-types.py
+++ b/scripts/qapi-types.py
@@ -6,8 +6,8 @@
 # Authors:
 #  Anthony Liguori <aliguori@us.ibm.com>
 #
-# This work is licensed under the terms of the GNU GPLv2.
-# See the COPYING.LIB file in the top-level directory.
+# This work is licensed under the terms of the GNU GPL, version 2.
+# See the COPYING file in the top-level directory.
 
 from ordereddict import OrderedDict
 from qapi import *
diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index 65f1a54..b2a1c1c 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -7,8 +7,8 @@
 #  Anthony Liguori <aliguori@us.ibm.com>
 #  Michael Roth    <mdroth@linux.vnet.ibm.com>
 #
-# This work is licensed under the terms of the GNU GPLv2.
-# See the COPYING.LIB file in the top-level directory.
+# This work is licensed under the terms of the GNU GPL, version 2.
+# See the COPYING file in the top-level directory.
 
 from ordereddict import OrderedDict
 from qapi import *
diff --git a/scripts/qapi.py b/scripts/qapi.py
index 9b3de4c..f3c2a20 100644
--- a/scripts/qapi.py
+++ b/scripts/qapi.py
@@ -8,8 +8,8 @@
 #  Anthony Liguori <aliguori@us.ibm.com>
 #  Markus Armbruster <armbru@redhat.com>
 #
-# This work is licensed under the terms of the GNU GPLv2.
-# See the COPYING.LIB file in the top-level directory.
+# This work is licensed under the terms of the GNU GPL, version 2.
+# See the COPYING file in the top-level directory.
 
 from ordereddict import OrderedDict
 import sys
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v2 09/13] qapi: Drop nonsensical header guard in generated qapi-visit.c
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
                   ` (7 preceding siblings ...)
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 08/13] qapi: Fix licensing of scripts Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 10/13] qapi: Drop unused code in qapi-commands.py Markus Armbruster
                   ` (4 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 scripts/qapi-visit.py | 2 --
 1 file changed, 2 deletions(-)

diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index b2a1c1c..97e9b11 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -494,10 +494,8 @@ fdecl.write(guardend("QAPI_VISIT_BUILTIN_VISITOR_DECL"))
 # have the functions defined, so we use -b option to provide control
 # over these cases
 if do_builtins:
-    fdef.write(guardstart("QAPI_VISIT_BUILTIN_VISITOR_DEF"))
     for typename in builtin_types:
         fdef.write(generate_visit_list(typename, None))
-    fdef.write(guardend("QAPI_VISIT_BUILTIN_VISITOR_DEF"))
 
 for expr in exprs:
     if expr.has_key('type'):
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v2 10/13] qapi: Drop unused code in qapi-commands.py
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
                   ` (8 preceding siblings ...)
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 09/13] qapi: Drop nonsensical header guard in generated qapi-visit.c Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 11/13] qapi: Clean up null checking in generated visitors Markus Armbruster
                   ` (3 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 scripts/qapi-commands.py | 20 --------------------
 1 file changed, 20 deletions(-)

diff --git a/scripts/qapi-commands.py b/scripts/qapi-commands.py
index 38c2347..9734ab0 100644
--- a/scripts/qapi-commands.py
+++ b/scripts/qapi-commands.py
@@ -23,13 +23,6 @@ def type_visitor(name):
     else:
         return 'visit_type_%s' % name
 
-def generate_decl_enum(name, members, genlist=True):
-    return mcgen('''
-
-void %(visitor)s(Visitor *m, %(name)s * obj, const char *name, Error **errp);
-''',
-                 visitor=type_visitor(name))
-
 def generate_command_decl(name, args, ret_type):
     arglist=""
     for argname, argtype, optional, structured in parse_args(args):
@@ -76,19 +69,6 @@ def gen_marshal_output_call(name, ret_type):
         return ""
     return "qmp_marshal_output_%s(retval, ret, errp);" % c_fun(name)
 
-def gen_visitor_output_containers_decl(ret_type):
-    ret = ""
-    push_indent()
-    if ret_type:
-        ret += mcgen('''
-QmpOutputVisitor *mo;
-QapiDeallocVisitor *md;
-Visitor *v;
-''')
-    pop_indent()
-
-    return ret
-
 def gen_visitor_input_containers_decl(args):
     ret = ""
 
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH v2 11/13] qapi: Clean up null checking in generated visitors
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
                   ` (9 preceding siblings ...)
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 10/13] qapi: Drop unused code in qapi-commands.py Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 14:20 ` [Qemu-devel] [PATCH 12/13] qapi: Clean up superfluous null check in qapi_dealloc_type_str() Markus Armbruster
                   ` (2 subsequent siblings)
  13 siblings, 0 replies; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Visitors get passed a pointer to the visited object.  The generated
visitors try to cope with this pointer being null in some places, for
instance like this:

    visit_start_optional(m, obj ? &(*obj)->has_name : NULL, "name", &err);

visit_start_optional() passes its second argument to Visitor method
start_optional.  Three out of three methods dereference it
unconditionally.

I fail to see how hits pointer could legitimately be null.

All this useless null checking is highly redundant, which Coverity
duly reports.  About 200 times.

Remove the useless null checks.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
 scripts/qapi-visit.py | 14 +++++++-------
 1 file changed, 7 insertions(+), 7 deletions(-)

diff --git a/scripts/qapi-visit.py b/scripts/qapi-visit.py
index 97e9b11..c6de9ae 100644
--- a/scripts/qapi-visit.py
+++ b/scripts/qapi-visit.py
@@ -47,9 +47,9 @@ static void visit_type_%(full_name)s_fields(Visitor *m, %(name)s ** obj, Error *
 
     if base:
         ret += mcgen('''
-visit_start_implicit_struct(m, obj ? (void**) &(*obj)->%(c_name)s : NULL, sizeof(%(type)s), &err);
+visit_start_implicit_struct(m, (void**) &(*obj)->%(c_name)s, sizeof(%(type)s), &err);
 if (!err) {
-    visit_type_%(type)s_fields(m, obj ? &(*obj)->%(c_prefix)s%(c_name)s : NULL, &err);
+    visit_type_%(type)s_fields(m, &(*obj)->%(c_prefix)s%(c_name)s, &err);
     error_propagate(errp, err);
     err = NULL;
     visit_end_implicit_struct(m, &err);
@@ -61,8 +61,8 @@ if (!err) {
     for argname, argentry, optional, structured in parse_args(members):
         if optional:
             ret += mcgen('''
-visit_start_optional(m, obj ? &(*obj)->%(c_prefix)shas_%(c_name)s : NULL, "%(name)s", &err);
-if (obj && (*obj)->%(prefix)shas_%(c_name)s) {
+visit_start_optional(m, &(*obj)->%(c_prefix)shas_%(c_name)s, "%(name)s", &err);
+if ((*obj)->%(prefix)shas_%(c_name)s) {
 ''',
                          c_prefix=c_var(field_prefix), prefix=field_prefix,
                          c_name=c_var(argname), name=argname)
@@ -72,7 +72,7 @@ if (obj && (*obj)->%(prefix)shas_%(c_name)s) {
             ret += generate_visit_struct_body(full_name, argname, argentry)
         else:
             ret += mcgen('''
-visit_type_%(type)s(m, obj ? &(*obj)->%(c_prefix)s%(c_name)s : NULL, "%(name)s", &err);
+visit_type_%(type)s(m, &(*obj)->%(c_prefix)s%(c_name)s, "%(name)s", &err);
 ''',
                          c_prefix=c_var(field_prefix), prefix=field_prefix,
                          type=type_name(argentry), c_name=c_var(argname),
@@ -121,7 +121,7 @@ visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), &err);
 
     ret += mcgen('''
 if (!err) {
-    if (!obj || *obj) {
+    if (*obj) {
         visit_type_%(name)s_fields(m, obj, &err);
         error_propagate(errp, err);
         err = NULL;
@@ -273,7 +273,7 @@ void visit_type_%(name)s(Visitor *m, %(name)s ** obj, const char *name, Error **
     if (!error_is_set(errp)) {
         visit_start_struct(m, (void **)obj, "%(name)s", name, sizeof(%(name)s), &err);
         if (!err) {
-            if (obj && *obj) {
+            if (*obj) {
 ''',
                  name=name)
 
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH 12/13] qapi: Clean up superfluous null check in qapi_dealloc_type_str()
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
                   ` (10 preceding siblings ...)
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 11/13] qapi: Clean up null checking in generated visitors Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 15:27   ` Eric Blake
  2014-02-10 14:20 ` [Qemu-devel] [PATCH 13/13] qapi: Add missing null check to opts_start_struct() Markus Armbruster
  2014-02-13  9:31 ` [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Paolo Bonzini
  13 siblings, 1 reply; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Argument can't be null.  No other Visitor method type_str() checks for
null.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 qapi/qapi-dealloc-visitor.c | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c
index dc53545..d0ea118 100644
--- a/qapi/qapi-dealloc-visitor.c
+++ b/qapi/qapi-dealloc-visitor.c
@@ -131,9 +131,7 @@ static void qapi_dealloc_end_list(Visitor *v, Error **errp)
 static void qapi_dealloc_type_str(Visitor *v, char **obj, const char *name,
                                   Error **errp)
 {
-    if (obj) {
-        g_free(*obj);
-    }
+    g_free(*obj);
 }
 
 static void qapi_dealloc_type_int(Visitor *v, int64_t *obj, const char *name,
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* [Qemu-devel] [PATCH 13/13] qapi: Add missing null check to opts_start_struct()
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
                   ` (11 preceding siblings ...)
  2014-02-10 14:20 ` [Qemu-devel] [PATCH 12/13] qapi: Clean up superfluous null check in qapi_dealloc_type_str() Markus Armbruster
@ 2014-02-10 14:20 ` Markus Armbruster
  2014-02-10 15:28   ` Eric Blake
  2014-02-13  9:31 ` [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Paolo Bonzini
  13 siblings, 1 reply; 21+ messages in thread
From: Markus Armbruster @ 2014-02-10 14:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: kwolf, peter.maydell, mdroth, aliguori, pbonzini

Argument is null when visiting an unboxed struct.  I can't see such a
visit in the current code.  Fix it anyway.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
---
 qapi/opts-visitor.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c
index 96ed858..5d830a2 100644
--- a/qapi/opts-visitor.c
+++ b/qapi/opts-visitor.c
@@ -124,7 +124,9 @@ opts_start_struct(Visitor *v, void **obj, const char *kind,
     OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v);
     const QemuOpt *opt;
 
-    *obj = g_malloc0(size > 0 ? size : 1);
+    if (obj) {
+        *obj = g_malloc0(size > 0 ? size : 1);
+    }
     if (ov->depth++ > 0) {
         return;
     }
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH v2 08/13] qapi: Fix licensing of scripts
  2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 08/13] qapi: Fix licensing of scripts Markus Armbruster
@ 2014-02-10 15:26   ` Eric Blake
  0 siblings, 0 replies; 21+ messages in thread
From: Eric Blake @ 2014-02-10 15:26 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: kwolf, pbonzini, mdroth, aliguori, peter.maydell

[-- Attachment #1: Type: text/plain, Size: 921 bytes --]

On 02/10/2014 07:20 AM, Markus Armbruster wrote:
> The scripts carry this copyright notice:
> 
>     # This work is licensed under the terms of the GNU GPLv2.
>     # See the COPYING.LIB file in the top-level directory.
> 
> The sentences contradict each other, as COPYING.LIB contains the LGPL
> 2.1.  Michael Roth says this was a simple pasto, and he meant to refer
> COPYING.  Let's fix that.

Trivially acceptable, since LGPL allows release under the more
restrictive GPL.

> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  scripts/qapi-commands.py | 4 ++--
>  scripts/qapi-types.py    | 4 ++--
>  scripts/qapi-visit.py    | 4 ++--
>  scripts/qapi.py          | 4 ++--
>  4 files changed, 8 insertions(+), 8 deletions(-)

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

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 12/13] qapi: Clean up superfluous null check in qapi_dealloc_type_str()
  2014-02-10 14:20 ` [Qemu-devel] [PATCH 12/13] qapi: Clean up superfluous null check in qapi_dealloc_type_str() Markus Armbruster
@ 2014-02-10 15:27   ` Eric Blake
  0 siblings, 0 replies; 21+ messages in thread
From: Eric Blake @ 2014-02-10 15:27 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: kwolf, pbonzini, mdroth, aliguori, peter.maydell

[-- Attachment #1: Type: text/plain, Size: 1032 bytes --]

On 02/10/2014 07:20 AM, Markus Armbruster wrote:
> Argument can't be null.  No other Visitor method type_str() checks for
> null.
> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  qapi/qapi-dealloc-visitor.c | 4 +---
>  1 file changed, 1 insertion(+), 3 deletions(-)

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

> 
> diff --git a/qapi/qapi-dealloc-visitor.c b/qapi/qapi-dealloc-visitor.c
> index dc53545..d0ea118 100644
> --- a/qapi/qapi-dealloc-visitor.c
> +++ b/qapi/qapi-dealloc-visitor.c
> @@ -131,9 +131,7 @@ static void qapi_dealloc_end_list(Visitor *v, Error **errp)
>  static void qapi_dealloc_type_str(Visitor *v, char **obj, const char *name,
>                                    Error **errp)
>  {
> -    if (obj) {
> -        g_free(*obj);
> -    }
> +    g_free(*obj);
>  }
>  
>  static void qapi_dealloc_type_int(Visitor *v, int64_t *obj, const char *name,
> 

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 13/13] qapi: Add missing null check to opts_start_struct()
  2014-02-10 14:20 ` [Qemu-devel] [PATCH 13/13] qapi: Add missing null check to opts_start_struct() Markus Armbruster
@ 2014-02-10 15:28   ` Eric Blake
  2014-02-13  9:30     ` Paolo Bonzini
  0 siblings, 1 reply; 21+ messages in thread
From: Eric Blake @ 2014-02-10 15:28 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: kwolf, pbonzini, mdroth, aliguori, peter.maydell

[-- Attachment #1: Type: text/plain, Size: 1054 bytes --]

On 02/10/2014 07:20 AM, Markus Armbruster wrote:
> Argument is null when visiting an unboxed struct.  I can't see such a
> visit in the current code.  Fix it anyway.

Is this a sign of missing testsuite coverage?

> 
> Signed-off-by: Markus Armbruster <armbru@redhat.com>
> ---
>  qapi/opts-visitor.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)

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

> 
> diff --git a/qapi/opts-visitor.c b/qapi/opts-visitor.c
> index 96ed858..5d830a2 100644
> --- a/qapi/opts-visitor.c
> +++ b/qapi/opts-visitor.c
> @@ -124,7 +124,9 @@ opts_start_struct(Visitor *v, void **obj, const char *kind,
>      OptsVisitor *ov = DO_UPCAST(OptsVisitor, visitor, v);
>      const QemuOpt *opt;
>  
> -    *obj = g_malloc0(size > 0 ? size : 1);
> +    if (obj) {
> +        *obj = g_malloc0(size > 0 ? size : 1);
> +    }
>      if (ov->depth++ > 0) {
>          return;
>      }
> 

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 604 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH 13/13] qapi: Add missing null check to opts_start_struct()
  2014-02-10 15:28   ` Eric Blake
@ 2014-02-13  9:30     ` Paolo Bonzini
  0 siblings, 0 replies; 21+ messages in thread
From: Paolo Bonzini @ 2014-02-13  9:30 UTC (permalink / raw)
  To: Eric Blake, Markus Armbruster, qemu-devel
  Cc: kwolf, peter.maydell, mdroth, aliguori

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Il 10/02/2014 16:28, Eric Blake ha scritto:
| On 02/10/2014 07:20 AM, Markus Armbruster wrote:
|> Argument is null when visiting an unboxed struct.  I can't see
|> such a visit in the current code.  Fix it anyway.
|
| Is this a sign of missing testsuite coverage?

Yes, likely.

Paolo

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.22 (GNU/Linux)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBAgAGBQJS/JDBAAoJEBvWZb6bTYbyAq4QAIH0kuK64lI9F0QeSYdC7vXZ
UFbccRz3sZXl7VBZXPpJNUOtEYsw/UXYYxEKXWedVUTWF7YWORe6fzd377Eti2w1
O8roausYt6J1czWnoufp8hsjBQJz72ydxEIDRWK1ip+8V0ZEqlbO4TSRRkZXNz1b
dFn5A3TsW0nKGLyZiD8LxA5mdI3WLAuUDV3zWXQstovLFrG4/cqQv4zyyIRh7zG6
bDzPx4zmswRynedwcet2i8atZFhgdWvjx1OouuKLqMK/9aRVuThwiKPwWjyrwhkr
o4QKEdHlNZZbCvbrqB+4XizRyqhW61uf3JylPcH/SGgLGXHxLyutciC4FosJE5js
CPpsq5edPWJM07eKYiisBwt4CU6P+8hrhMtJ+Yo1P3WyMgdwGTQHyqDk/ZDUq+pM
3Hmwi36DALBSnIfmeTndgzVXbPtJe4W87ndBmx9UpXNnUDzgkVd0Kfje+NU7lsLv
tgROyQmhhoc/e5VuClV6C/2tILsx8gEGEacbSS/FTnZGUlnoTSlpenGrSLLcCHpy
alkmNDP/D+reYE7BV9zvSojBJOPNNKS0qQ1Y5528+sr8XsbuaaL3UQCE0oQHjCAK
iPYyfkzCyTgB3iFHVxunEQ+j6oaMkbY28YJTnIUsr6jOWpWlT3pW3VMEekmjcZi2
CF0f7RztKQtHglYyuFgW
=IAMx
-----END PGP SIGNATURE-----

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code
  2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
                   ` (12 preceding siblings ...)
  2014-02-10 14:20 ` [Qemu-devel] [PATCH 13/13] qapi: Add missing null check to opts_start_struct() Markus Armbruster
@ 2014-02-13  9:31 ` Paolo Bonzini
  2014-02-13 13:41   ` Luiz Capitulino
  13 siblings, 1 reply; 21+ messages in thread
From: Paolo Bonzini @ 2014-02-13  9:31 UTC (permalink / raw)
  To: Markus Armbruster, qemu-devel
  Cc: kwolf, peter.maydell, mdroth, Luiz Capitulino, aliguori

Il 10/02/2014 15:20, Markus Armbruster ha scritto:
> Coverity is unhappy with the generated code.  Nothing serious, just
> heaps of valid DEADCODE defects topped off with a few bogus
> FORWARD_NULL defects.
>
> I had a look at the generator, and decided I don't want to mess with
> it without decent test coverage.  Unfortunately, a few features have
> been added without tests.  My first seven patches make the tests catch
> up.  tests/qapi-schema/qapi-schema-test.json now covers all mcgen() in
> scripts/qapi*.py, except for a few in qapi-commands.py that are
> conditional on -m.
>
> The next four patches clean up the generated code.
>
> I also reviewed null checks in visitor implementations.  The final two
> patches address the issues I found there.
>
> v2:
> * Previously separate patch "qapi: Fix licensing of scripts" revised
>   and included as "[PATCH v2 08/13] qapi: Fix licensing of scripts"
> * Style cleanups
> * New PATCH 12/13 and 13/13
>
> Markus Armbruster (13):
>   tests/qapi-schema: Actually check successful QMP command response
>   tests/qapi-schema: Cover optional command arguments
>   tests/qapi-schema: Cover simple argument types
>   tests/qapi-schema: Cover anonymous union types
>   tests/qapi-schema: Cover complex types with base
>   tests/qapi-schema: Cover union types with base
>   tests/qapi-schema: Cover flat union types
>   qapi: Fix licensing of scripts
>   qapi: Drop nonsensical header guard in generated qapi-visit.c
>   qapi: Drop unused code in qapi-commands.py
>   qapi: Clean up null checking in generated visitors
>   qapi: Clean up superfluous null check in qapi_dealloc_type_str()
>   qapi: Add missing null check to opts_start_struct()
>
>  qapi/opts-visitor.c                     |  4 +-
>  qapi/qapi-dealloc-visitor.c             |  4 +-
>  scripts/qapi-commands.py                | 24 +---------
>  scripts/qapi-types.py                   |  4 +-
>  scripts/qapi-visit.py                   | 20 ++++-----
>  scripts/qapi.py                         |  4 +-
>  tests/qapi-schema/qapi-schema-test.json | 24 +++++++++-
>  tests/qapi-schema/qapi-schema-test.out  | 19 +++++---
>  tests/test-qmp-commands.c               | 78 +++++++++++++++++++++++++++------
>  tests/test-qmp-input-strict.c           | 69 ++++++++++++++++++++++++++++-
>  tests/test-qmp-input-visitor.c          | 45 +++++++++++++++++--
>  tests/test-qmp-output-visitor.c         | 67 ++++++++++++++++++++++++++--
>  tests/test-visitor-serialization.c      | 14 +++---
>  13 files changed, 299 insertions(+), 77 deletions(-)
>

Thanks Markus!

Luiz, should this go in through your tree?

Paolo

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code
  2014-02-13  9:31 ` [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Paolo Bonzini
@ 2014-02-13 13:41   ` Luiz Capitulino
  2014-02-13 13:57     ` Luiz Capitulino
  0 siblings, 1 reply; 21+ messages in thread
From: Luiz Capitulino @ 2014-02-13 13:41 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: kwolf, peter.maydell, qemu-devel, mdroth, Markus Armbruster, aliguori

On Thu, 13 Feb 2014 10:31:17 +0100
Paolo Bonzini <pbonzini@redhat.com> wrote:

> Il 10/02/2014 15:20, Markus Armbruster ha scritto:
> > Coverity is unhappy with the generated code.  Nothing serious, just
> > heaps of valid DEADCODE defects topped off with a few bogus
> > FORWARD_NULL defects.
> >
> > I had a look at the generator, and decided I don't want to mess with
> > it without decent test coverage.  Unfortunately, a few features have
> > been added without tests.  My first seven patches make the tests catch
> > up.  tests/qapi-schema/qapi-schema-test.json now covers all mcgen() in
> > scripts/qapi*.py, except for a few in qapi-commands.py that are
> > conditional on -m.
> >
> > The next four patches clean up the generated code.
> >
> > I also reviewed null checks in visitor implementations.  The final two
> > patches address the issues I found there.
> >
> > v2:
> > * Previously separate patch "qapi: Fix licensing of scripts" revised
> >   and included as "[PATCH v2 08/13] qapi: Fix licensing of scripts"
> > * Style cleanups
> > * New PATCH 12/13 and 13/13
> >
> > Markus Armbruster (13):
> >   tests/qapi-schema: Actually check successful QMP command response
> >   tests/qapi-schema: Cover optional command arguments
> >   tests/qapi-schema: Cover simple argument types
> >   tests/qapi-schema: Cover anonymous union types
> >   tests/qapi-schema: Cover complex types with base
> >   tests/qapi-schema: Cover union types with base
> >   tests/qapi-schema: Cover flat union types
> >   qapi: Fix licensing of scripts
> >   qapi: Drop nonsensical header guard in generated qapi-visit.c
> >   qapi: Drop unused code in qapi-commands.py
> >   qapi: Clean up null checking in generated visitors
> >   qapi: Clean up superfluous null check in qapi_dealloc_type_str()
> >   qapi: Add missing null check to opts_start_struct()
> >
> >  qapi/opts-visitor.c                     |  4 +-
> >  qapi/qapi-dealloc-visitor.c             |  4 +-
> >  scripts/qapi-commands.py                | 24 +---------
> >  scripts/qapi-types.py                   |  4 +-
> >  scripts/qapi-visit.py                   | 20 ++++-----
> >  scripts/qapi.py                         |  4 +-
> >  tests/qapi-schema/qapi-schema-test.json | 24 +++++++++-
> >  tests/qapi-schema/qapi-schema-test.out  | 19 +++++---
> >  tests/test-qmp-commands.c               | 78 +++++++++++++++++++++++++++------
> >  tests/test-qmp-input-strict.c           | 69 ++++++++++++++++++++++++++++-
> >  tests/test-qmp-input-visitor.c          | 45 +++++++++++++++++--
> >  tests/test-qmp-output-visitor.c         | 67 ++++++++++++++++++++++++++--
> >  tests/test-visitor-serialization.c      | 14 +++---
> >  13 files changed, 299 insertions(+), 77 deletions(-)
> >
> 
> Thanks Markus!
> 
> Luiz, should this go in through your tree?

It could. Markus, what's your plan for this series? Is anyone going to
pick it up?

^ permalink raw reply	[flat|nested] 21+ messages in thread

* Re: [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code
  2014-02-13 13:41   ` Luiz Capitulino
@ 2014-02-13 13:57     ` Luiz Capitulino
  0 siblings, 0 replies; 21+ messages in thread
From: Luiz Capitulino @ 2014-02-13 13:57 UTC (permalink / raw)
  To: Paolo Bonzini
  Cc: kwolf, peter.maydell, qemu-devel, mdroth, Markus Armbruster, aliguori

On Thu, 13 Feb 2014 08:41:48 -0500
Luiz Capitulino <lcapitulino@redhat.com> wrote:

> On Thu, 13 Feb 2014 10:31:17 +0100
> Paolo Bonzini <pbonzini@redhat.com> wrote:
> 
> > Il 10/02/2014 15:20, Markus Armbruster ha scritto:
> > > Coverity is unhappy with the generated code.  Nothing serious, just
> > > heaps of valid DEADCODE defects topped off with a few bogus
> > > FORWARD_NULL defects.
> > >
> > > I had a look at the generator, and decided I don't want to mess with
> > > it without decent test coverage.  Unfortunately, a few features have
> > > been added without tests.  My first seven patches make the tests catch
> > > up.  tests/qapi-schema/qapi-schema-test.json now covers all mcgen() in
> > > scripts/qapi*.py, except for a few in qapi-commands.py that are
> > > conditional on -m.
> > >
> > > The next four patches clean up the generated code.
> > >
> > > I also reviewed null checks in visitor implementations.  The final two
> > > patches address the issues I found there.
> > >
> > > v2:
> > > * Previously separate patch "qapi: Fix licensing of scripts" revised
> > >   and included as "[PATCH v2 08/13] qapi: Fix licensing of scripts"
> > > * Style cleanups
> > > * New PATCH 12/13 and 13/13
> > >
> > > Markus Armbruster (13):
> > >   tests/qapi-schema: Actually check successful QMP command response
> > >   tests/qapi-schema: Cover optional command arguments
> > >   tests/qapi-schema: Cover simple argument types
> > >   tests/qapi-schema: Cover anonymous union types
> > >   tests/qapi-schema: Cover complex types with base
> > >   tests/qapi-schema: Cover union types with base
> > >   tests/qapi-schema: Cover flat union types
> > >   qapi: Fix licensing of scripts
> > >   qapi: Drop nonsensical header guard in generated qapi-visit.c
> > >   qapi: Drop unused code in qapi-commands.py
> > >   qapi: Clean up null checking in generated visitors
> > >   qapi: Clean up superfluous null check in qapi_dealloc_type_str()
> > >   qapi: Add missing null check to opts_start_struct()
> > >
> > >  qapi/opts-visitor.c                     |  4 +-
> > >  qapi/qapi-dealloc-visitor.c             |  4 +-
> > >  scripts/qapi-commands.py                | 24 +---------
> > >  scripts/qapi-types.py                   |  4 +-
> > >  scripts/qapi-visit.py                   | 20 ++++-----
> > >  scripts/qapi.py                         |  4 +-
> > >  tests/qapi-schema/qapi-schema-test.json | 24 +++++++++-
> > >  tests/qapi-schema/qapi-schema-test.out  | 19 +++++---
> > >  tests/test-qmp-commands.c               | 78 +++++++++++++++++++++++++++------
> > >  tests/test-qmp-input-strict.c           | 69 ++++++++++++++++++++++++++++-
> > >  tests/test-qmp-input-visitor.c          | 45 +++++++++++++++++--
> > >  tests/test-qmp-output-visitor.c         | 67 ++++++++++++++++++++++++++--
> > >  tests/test-visitor-serialization.c      | 14 +++---
> > >  13 files changed, 299 insertions(+), 77 deletions(-)
> > >
> > 
> > Thanks Markus!
> > 
> > Luiz, should this go in through your tree?
> 
> It could. Markus, what's your plan for this series? Is anyone going to
> pick it up?

Turns out it conflicts with something on my tree (probably Wenchao's series).

Can you please rebase on top of it Markus?

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2014-02-13 13:58 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-02-10 14:20 [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Markus Armbruster
2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 01/13] tests/qapi-schema: Actually check successful QMP command response Markus Armbruster
2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 02/13] tests/qapi-schema: Cover optional command arguments Markus Armbruster
2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 03/13] tests/qapi-schema: Cover simple argument types Markus Armbruster
2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 04/13] tests/qapi-schema: Cover anonymous union types Markus Armbruster
2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 05/13] tests/qapi-schema: Cover complex types with base Markus Armbruster
2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 06/13] tests/qapi-schema: Cover union " Markus Armbruster
2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 07/13] tests/qapi-schema: Cover flat union types Markus Armbruster
2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 08/13] qapi: Fix licensing of scripts Markus Armbruster
2014-02-10 15:26   ` Eric Blake
2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 09/13] qapi: Drop nonsensical header guard in generated qapi-visit.c Markus Armbruster
2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 10/13] qapi: Drop unused code in qapi-commands.py Markus Armbruster
2014-02-10 14:20 ` [Qemu-devel] [PATCH v2 11/13] qapi: Clean up null checking in generated visitors Markus Armbruster
2014-02-10 14:20 ` [Qemu-devel] [PATCH 12/13] qapi: Clean up superfluous null check in qapi_dealloc_type_str() Markus Armbruster
2014-02-10 15:27   ` Eric Blake
2014-02-10 14:20 ` [Qemu-devel] [PATCH 13/13] qapi: Add missing null check to opts_start_struct() Markus Armbruster
2014-02-10 15:28   ` Eric Blake
2014-02-13  9:30     ` Paolo Bonzini
2014-02-13  9:31 ` [Qemu-devel] [PATCH v2 00/13] qapi: Test coverage & clean up generated code Paolo Bonzini
2014-02-13 13:41   ` Luiz Capitulino
2014-02-13 13:57     ` Luiz Capitulino

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.