qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PULL 01/25] tests/qapi-schema: Test for reserved names, em


From: Markus Armbruster
Subject: [Qemu-devel] [PULL 01/25] tests/qapi-schema: Test for reserved names, empty struct
Date: Fri, 30 Oct 2015 16:42:30 +0100

From: Eric Blake <address@hidden>

Add some testsuite coverage to ensure future patches are on
the right track:

Our current C representation of qapi arrays is done by appending
'List' to the element name; but we are not preventing the
creation of an object type with the same name.  Add
reserved-type-list.json to test this.  Then rename
enum-union-clash.json to reserved-type-kind.json to cover the
reservation that we DO detect, and shorten it to match the fact
that the name is reserved even if there is no clash.

We are failing to detect a collision between a dictionary member
and the implicit 'has_*' flag for another optional member. The
easiest fix would be for a future patch to reserve the entire
"has[-_]" namespace for member names (the collision is also
possible for branch names within flat unions, but only as long as
branch names can collide with (non-variant) members; however,
since future patches are about to remove that, it is not worth
testing here). Add reserved-member-has.json to test this.

A similar collision exists between a dictionary member where
c_name() munges what might otherwise be a reserved name to start
with 'q_', and another member explicitly starts with "q[-_]".
Again, the easiest solution for a future patch will be reserving
the entire namespace, but here for commands as well as members.
Add reserved-member-q.json and reserved-command-q.json to test
this; separate tests since arguably our munging of command 'unix'
to 'qmp_q_unix()' could be done without a q_, which is different
than the munging of a member 'unix' to 'foo.q_unix'.

Finally, our testsuite does not have any compilation coverage
of struct inheritance with empty qapi structs.  Update
qapi-schema-test.json to test this.

Note that there is currently no technical reason to forbid type
name patterns from member names, or member name patterns from
types, since the two are not in the same namespace in C and
won't collide; but it's not worth adding positive tests of these
corner cases at this time, especially while there is other churn
pending in patches that rearrange which collisions actually
happen.

Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
[Commit message tweaked slightly]
Signed-off-by: Markus Armbruster <address@hidden>
---
 tests/Makefile                                                     | 6 +++++-
 tests/qapi-schema/enum-union-clash.err                             | 1 -
 tests/qapi-schema/qapi-schema-test.json                            | 4 ++++
 tests/qapi-schema/qapi-schema-test.out                             | 3 +++
 tests/qapi-schema/{enum-union-clash.out => reserved-command-q.err} | 0
 tests/qapi-schema/reserved-command-q.exit                          | 1 +
 tests/qapi-schema/reserved-command-q.json                          | 7 +++++++
 tests/qapi-schema/reserved-command-q.out                           | 5 +++++
 tests/qapi-schema/reserved-member-has.err                          | 0
 tests/qapi-schema/reserved-member-has.exit                         | 1 +
 tests/qapi-schema/reserved-member-has.json                         | 6 ++++++
 tests/qapi-schema/reserved-member-has.out                          | 6 ++++++
 tests/qapi-schema/reserved-member-q.err                            | 0
 tests/qapi-schema/reserved-member-q.exit                           | 1 +
 tests/qapi-schema/reserved-member-q.json                           | 6 ++++++
 tests/qapi-schema/reserved-member-q.out                            | 4 ++++
 tests/qapi-schema/reserved-type-kind.err                           | 1 +
 .../qapi-schema/{enum-union-clash.exit => reserved-type-kind.exit} | 0
 .../qapi-schema/{enum-union-clash.json => reserved-type-kind.json} | 2 --
 tests/qapi-schema/reserved-type-kind.out                           | 0
 tests/qapi-schema/reserved-type-list.err                           | 0
 tests/qapi-schema/reserved-type-list.exit                          | 1 +
 tests/qapi-schema/reserved-type-list.json                          | 5 +++++
 tests/qapi-schema/reserved-type-list.out                           | 3 +++
 24 files changed, 59 insertions(+), 4 deletions(-)
 delete mode 100644 tests/qapi-schema/enum-union-clash.err
 rename tests/qapi-schema/{enum-union-clash.out => reserved-command-q.err} 
(100%)
 create mode 100644 tests/qapi-schema/reserved-command-q.exit
 create mode 100644 tests/qapi-schema/reserved-command-q.json
 create mode 100644 tests/qapi-schema/reserved-command-q.out
 create mode 100644 tests/qapi-schema/reserved-member-has.err
 create mode 100644 tests/qapi-schema/reserved-member-has.exit
 create mode 100644 tests/qapi-schema/reserved-member-has.json
 create mode 100644 tests/qapi-schema/reserved-member-has.out
 create mode 100644 tests/qapi-schema/reserved-member-q.err
 create mode 100644 tests/qapi-schema/reserved-member-q.exit
 create mode 100644 tests/qapi-schema/reserved-member-q.json
 create mode 100644 tests/qapi-schema/reserved-member-q.out
 create mode 100644 tests/qapi-schema/reserved-type-kind.err
 rename tests/qapi-schema/{enum-union-clash.exit => reserved-type-kind.exit} 
(100%)
 rename tests/qapi-schema/{enum-union-clash.json => reserved-type-kind.json} 
(69%)
 create mode 100644 tests/qapi-schema/reserved-type-kind.out
 create mode 100644 tests/qapi-schema/reserved-type-list.err
 create mode 100644 tests/qapi-schema/reserved-type-list.exit
 create mode 100644 tests/qapi-schema/reserved-type-list.json
 create mode 100644 tests/qapi-schema/reserved-type-list.out

diff --git a/tests/Makefile b/tests/Makefile
index 0739bfe..652294c 100644
--- a/tests/Makefile
+++ b/tests/Makefile
@@ -265,7 +265,6 @@ qapi-schema += enum-dict-member.json
 qapi-schema += enum-int-member.json
 qapi-schema += enum-max-member.json
 qapi-schema += enum-missing-data.json
-qapi-schema += enum-union-clash.json
 qapi-schema += enum-wrong-data.json
 qapi-schema += escape-outside-string.json
 qapi-schema += escape-too-big.json
@@ -316,6 +315,11 @@ qapi-schema += redefined-builtin.json
 qapi-schema += redefined-command.json
 qapi-schema += redefined-event.json
 qapi-schema += redefined-type.json
+qapi-schema += reserved-command-q.json
+qapi-schema += reserved-member-has.json
+qapi-schema += reserved-member-q.json
+qapi-schema += reserved-type-kind.json
+qapi-schema += reserved-type-list.json
 qapi-schema += returns-alternate.json
 qapi-schema += returns-array-bad.json
 qapi-schema += returns-dict.json
diff --git a/tests/qapi-schema/enum-union-clash.err 
b/tests/qapi-schema/enum-union-clash.err
deleted file mode 100644
index c04e1a8..0000000
--- a/tests/qapi-schema/enum-union-clash.err
+++ /dev/null
@@ -1 +0,0 @@
-tests/qapi-schema/enum-union-clash.json:2: enum 'UnionKind' should not end in 
'Kind'
diff --git a/tests/qapi-schema/qapi-schema-test.json 
b/tests/qapi-schema/qapi-schema-test.json
index 4e2d7c2..48e104b 100644
--- a/tests/qapi-schema/qapi-schema-test.json
+++ b/tests/qapi-schema/qapi-schema-test.json
@@ -11,6 +11,10 @@
 # An empty enum, although unusual, is currently acceptable
 { 'enum': 'MyEnum', 'data': [ ] }
 
+# Likewise for an empty struct, including an empty base
+{ 'struct': 'Empty1', 'data': { } }
+{ 'struct': 'Empty2', 'base': 'Empty1', 'data': { } }
+
 # for testing override of default naming heuristic
 { 'enum': 'QEnumTwo',
   'prefix': 'QENUM_TWO',
diff --git a/tests/qapi-schema/qapi-schema-test.out 
b/tests/qapi-schema/qapi-schema-test.out
index a6c80e0..a7e9aab 100644
--- a/tests/qapi-schema/qapi-schema-test.out
+++ b/tests/qapi-schema/qapi-schema-test.out
@@ -81,6 +81,9 @@ event EVENT_A None
 event EVENT_B None
 event EVENT_C :obj-EVENT_C-arg
 event EVENT_D :obj-EVENT_D-arg
+object Empty1
+object Empty2
+    base Empty1
 enum EnumOne ['value1', 'value2', 'value3']
 object EventStructOne
     member struct1: UserDefOne optional=False
diff --git a/tests/qapi-schema/enum-union-clash.out 
b/tests/qapi-schema/reserved-command-q.err
similarity index 100%
rename from tests/qapi-schema/enum-union-clash.out
rename to tests/qapi-schema/reserved-command-q.err
diff --git a/tests/qapi-schema/reserved-command-q.exit 
b/tests/qapi-schema/reserved-command-q.exit
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/tests/qapi-schema/reserved-command-q.exit
@@ -0,0 +1 @@
+0
diff --git a/tests/qapi-schema/reserved-command-q.json 
b/tests/qapi-schema/reserved-command-q.json
new file mode 100644
index 0000000..be9944c
--- /dev/null
+++ b/tests/qapi-schema/reserved-command-q.json
@@ -0,0 +1,7 @@
+# C entity name collision
+# FIXME - This parses, but fails to compile, because it attempts to declare
+# two 'qmp_q_unix' functions (one for 'q-unix', the other because c_name()
+# munges 'unix' to 'q_unix' to avoid reserved word collisions). We should
+# reject attempts to explicitly use 'q_' names, to reserve it for qapi.
+{ 'command': 'unix' }
+{ 'command': 'q-unix' }
diff --git a/tests/qapi-schema/reserved-command-q.out 
b/tests/qapi-schema/reserved-command-q.out
new file mode 100644
index 0000000..b31b38f
--- /dev/null
+++ b/tests/qapi-schema/reserved-command-q.out
@@ -0,0 +1,5 @@
+object :empty
+command q-unix None -> None
+   gen=True success_response=True
+command unix None -> None
+   gen=True success_response=True
diff --git a/tests/qapi-schema/reserved-member-has.err 
b/tests/qapi-schema/reserved-member-has.err
new file mode 100644
index 0000000..e69de29
diff --git a/tests/qapi-schema/reserved-member-has.exit 
b/tests/qapi-schema/reserved-member-has.exit
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/tests/qapi-schema/reserved-member-has.exit
@@ -0,0 +1 @@
+0
diff --git a/tests/qapi-schema/reserved-member-has.json 
b/tests/qapi-schema/reserved-member-has.json
new file mode 100644
index 0000000..a2197de
--- /dev/null
+++ b/tests/qapi-schema/reserved-member-has.json
@@ -0,0 +1,6 @@
+# C member name collision
+# FIXME - This parses, but fails to compile, because the C struct is given
+# two 'has_a' members, one from the flag for optional 'a', and the other
+# from member 'has-a'.  Either reject this at parse time, or munge the C
+# names to avoid the collision.
+{ 'command': 'oops', 'data': { '*a': 'str', 'has-a': 'str' } }
diff --git a/tests/qapi-schema/reserved-member-has.out 
b/tests/qapi-schema/reserved-member-has.out
new file mode 100644
index 0000000..5a18b6b
--- /dev/null
+++ b/tests/qapi-schema/reserved-member-has.out
@@ -0,0 +1,6 @@
+object :empty
+object :obj-oops-arg
+    member a: str optional=True
+    member has-a: str optional=False
+command oops :obj-oops-arg -> None
+   gen=True success_response=True
diff --git a/tests/qapi-schema/reserved-member-q.err 
b/tests/qapi-schema/reserved-member-q.err
new file mode 100644
index 0000000..e69de29
diff --git a/tests/qapi-schema/reserved-member-q.exit 
b/tests/qapi-schema/reserved-member-q.exit
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/tests/qapi-schema/reserved-member-q.exit
@@ -0,0 +1 @@
+0
diff --git a/tests/qapi-schema/reserved-member-q.json 
b/tests/qapi-schema/reserved-member-q.json
new file mode 100644
index 0000000..1602ed3
--- /dev/null
+++ b/tests/qapi-schema/reserved-member-q.json
@@ -0,0 +1,6 @@
+# C member name collision
+# FIXME - This parses, but fails to compile, because it attempts to declare
+# two 'q_unix' members (one for 'q-unix', the other because c_name()
+# munges 'unix' to 'q_unix' to avoid reserved word collisions). We should
+# reject attempts to explicitly use 'q_' names, to reserve it for qapi.
+{ 'struct': 'Foo', 'data': { 'unix':'int', 'q-unix':'bool' } }
diff --git a/tests/qapi-schema/reserved-member-q.out 
b/tests/qapi-schema/reserved-member-q.out
new file mode 100644
index 0000000..0d8685a
--- /dev/null
+++ b/tests/qapi-schema/reserved-member-q.out
@@ -0,0 +1,4 @@
+object :empty
+object Foo
+    member unix: int optional=False
+    member q-unix: bool optional=False
diff --git a/tests/qapi-schema/reserved-type-kind.err 
b/tests/qapi-schema/reserved-type-kind.err
new file mode 100644
index 0000000..0a38efa
--- /dev/null
+++ b/tests/qapi-schema/reserved-type-kind.err
@@ -0,0 +1 @@
+tests/qapi-schema/reserved-type-kind.json:2: enum 'UnionKind' should not end 
in 'Kind'
diff --git a/tests/qapi-schema/enum-union-clash.exit 
b/tests/qapi-schema/reserved-type-kind.exit
similarity index 100%
rename from tests/qapi-schema/enum-union-clash.exit
rename to tests/qapi-schema/reserved-type-kind.exit
diff --git a/tests/qapi-schema/enum-union-clash.json 
b/tests/qapi-schema/reserved-type-kind.json
similarity index 69%
rename from tests/qapi-schema/enum-union-clash.json
rename to tests/qapi-schema/reserved-type-kind.json
index 593282b..9ecaba1 100644
--- a/tests/qapi-schema/enum-union-clash.json
+++ b/tests/qapi-schema/reserved-type-kind.json
@@ -1,4 +1,2 @@
 # we reject types that would conflict with implicit union enum
 { 'enum': 'UnionKind', 'data': [ 'oops' ] }
-{ 'union': 'Union',
-  'data': { 'a': 'int' } }
diff --git a/tests/qapi-schema/reserved-type-kind.out 
b/tests/qapi-schema/reserved-type-kind.out
new file mode 100644
index 0000000..e69de29
diff --git a/tests/qapi-schema/reserved-type-list.err 
b/tests/qapi-schema/reserved-type-list.err
new file mode 100644
index 0000000..e69de29
diff --git a/tests/qapi-schema/reserved-type-list.exit 
b/tests/qapi-schema/reserved-type-list.exit
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/tests/qapi-schema/reserved-type-list.exit
@@ -0,0 +1 @@
+0
diff --git a/tests/qapi-schema/reserved-type-list.json 
b/tests/qapi-schema/reserved-type-list.json
new file mode 100644
index 0000000..5b7d0f9
--- /dev/null
+++ b/tests/qapi-schema/reserved-type-list.json
@@ -0,0 +1,5 @@
+# Potential C name collision
+# FIXME - This parses and compiles on its own, but prevents the user from
+# creating a type named 'Foo' and using ['Foo'] for an array.  We should
+# reject the use of any type names ending in 'List'.
+{ 'struct': 'FooList', 'data': { 's': 'str' } }
diff --git a/tests/qapi-schema/reserved-type-list.out 
b/tests/qapi-schema/reserved-type-list.out
new file mode 100644
index 0000000..0406bfe
--- /dev/null
+++ b/tests/qapi-schema/reserved-type-list.out
@@ -0,0 +1,3 @@
+object :empty
+object FooList
+    member s: str optional=False
-- 
2.4.3




reply via email to

[Prev in Thread] Current Thread [Next in Thread]