qapi: Add some expr tests

Demonstrate that the qapi generator doesn't deal well with
expressions that aren't up to par. Later patches will improve
the expected results as the generator is made stricter.  Only
a few of the the added tests actually behave sanely at
rejecting obvious problems or demonstrating success.

Note that in some cases, we reject bad QAPI merely because our
pseudo-JSON parser does not yet know how to parse numbers.  This
series does not address that, but when a later series adds support
for numeric defaults of integer fields, the testsuite will ensure
that we don't lose the error (and hopefully that the error
message quality is improved).

Signed-off-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Markus Armbruster <armbru@redhat.com>
Signed-off-by: Markus Armbruster <armbru@redhat.com>
This commit is contained in:
Eric Blake 2015-05-04 09:05:14 -06:00 committed by Markus Armbruster
parent ab916faddd
commit 9050c65b71
45 changed files with 72 additions and 3 deletions

View File

@ -210,8 +210,10 @@ check-qapi-schema-y := $(addprefix tests/qapi-schema/, \
comments.json empty.json enum-empty.json enum-missing-data.json \
enum-wrong-data.json enum-int-member.json enum-dict-member.json \
enum-clash-member.json enum-max-member.json enum-union-clash.json \
enum-bad-name.json \
funny-char.json indented-expr.json \
enum-bad-name.json funny-char.json indented-expr.json \
missing-type.json bad-ident.json ident-with-escape.json \
double-type.json bad-base.json bad-type-bool.json bad-type-int.json \
bad-type-dict.json double-data.json unknown-expr-key.json \
missing-colon.json missing-comma-list.json \
missing-comma-object.json non-objects.json \
qapi-schema-test.json quoted-structural-chars.json \
@ -232,7 +234,7 @@ check-qapi-schema-y := $(addprefix tests/qapi-schema/, \
include-simple.json include-relpath.json include-format-err.json \
include-non-file.json include-no-file.json include-before-err.json \
include-nested-err.json include-self-cycle.json include-cycle.json \
include-repetition.json event-nest-struct.json)
include-repetition.json event-nest-struct.json event-case.json)
GENERATED_HEADERS += tests/test-qapi-types.h tests/test-qapi-visit.h \
tests/test-qmp-commands.h tests/test-qapi-event.h

View File

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,3 @@
# FIXME: we should reject a base that is not a struct
{ 'union': 'Union', 'data': { 'a': 'int', 'b': 'str' } }
{ 'type': 'MyType', 'base': 'Union', 'data': { 'c': 'int' } }

View File

@ -0,0 +1,4 @@
[OrderedDict([('union', 'Union'), ('data', OrderedDict([('a', 'int'), ('b', 'str')]))]),
OrderedDict([('type', 'MyType'), ('base', 'Union'), ('data', OrderedDict([('c', 'int')]))])]
[{'enum_name': 'UnionKind', 'enum_values': None}]
[OrderedDict([('type', 'MyType'), ('base', 'Union'), ('data', OrderedDict([('c', 'int')]))])]

View File

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,2 @@
# FIXME: we should reject creating a type name with bad name
{ 'type': '*oops', 'data': { 'i': 'int' } }

View File

@ -0,0 +1,3 @@
[OrderedDict([('type', '*oops'), ('data', OrderedDict([('i', 'int')]))])]
[]
[OrderedDict([('type', '*oops'), ('data', OrderedDict([('i', 'int')]))])]

View File

@ -0,0 +1 @@
tests/qapi-schema/bad-type-bool.json:3:11: Stray "t"

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,3 @@
# we reject an expression with a metatype that is not a string
# FIXME: once the parser understands bool inputs, improve the error message
{ 'type': true, 'data': { } }

View File

View File

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,2 @@
# FIXME: we should reject an expression with a metatype that is not a string
{ 'command': { } }

View File

@ -0,0 +1,3 @@
[OrderedDict([('command', OrderedDict())])]
[]
[]

View File

@ -0,0 +1 @@
tests/qapi-schema/bad-type-int.json:3:11: Stray "1"

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,3 @@
# we reject an expression with a metatype that is not a string
# FIXME: once the parser understands integer inputs, improve the error message
{ 'type': 1, 'data': { } }

View File

View File

@ -0,0 +1 @@
tests/qapi-schema/double-data.json:2:39: Duplicate key "data"

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,2 @@
# we reject an expression with duplicate top-level keys
{ 'type': 'bar', 'data': { }, 'data': { 'string': 'str'} }

View File

View File

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,2 @@
# FIXME: we should reject an expression with ambiguous metatype
{ 'command': 'foo', 'type': 'bar', 'data': { } }

View File

@ -0,0 +1,3 @@
[OrderedDict([('command', 'foo'), ('type', 'bar'), ('data', OrderedDict())])]
[]
[OrderedDict([('command', 'foo'), ('type', 'bar'), ('data', OrderedDict())])]

View File

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,3 @@
# TODO: might be nice to enforce naming conventions; but until then this works
# even though events should usually be ALL_CAPS
{ 'event': 'oops' }

View File

@ -0,0 +1,3 @@
[OrderedDict([('event', 'oops')])]
[]
[]

View File

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,4 @@
# FIXME: we should allow escape sequences in strings, if they map back to ASCII
# { 'command': 'fooA', 'data': { 'bar1': 'str' } }
{ 'c\u006fmmand': '\u0066\u006f\u006FA',
'd\u0061ta': { '\u0062\u0061\u00721': '\u0073\u0074\u0072' } }

View File

@ -0,0 +1,3 @@
[OrderedDict([('cu006fmmand', 'u0066u006fu006FA'), ('du0061ta', OrderedDict([('u0062u0061u00721', 'u0073u0074u0072')]))])]
[]
[]

View File

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,2 @@
# FIXME: we should reject an expression with missing metatype
{ 'data': { } }

View File

@ -0,0 +1,3 @@
[OrderedDict([('data', OrderedDict())])]
[]
[]

View File

View File

@ -0,0 +1 @@
0

View File

@ -0,0 +1,2 @@
# FIXME: we should reject an expression with unknown top-level keys
{ 'type': 'bar', 'data': { 'string': 'str'}, 'bogus': { } }

View File

@ -0,0 +1,3 @@
[OrderedDict([('type', 'bar'), ('data', OrderedDict([('string', 'str')])), ('bogus', OrderedDict())])]
[]
[OrderedDict([('type', 'bar'), ('data', OrderedDict([('string', 'str')])), ('bogus', OrderedDict())])]