Browse Source

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>
Eric Blake 10 years ago
parent
commit
9050c65b71
45 changed files with 72 additions and 3 deletions
  1. 5 3
      tests/Makefile
  2. 0 0
      tests/qapi-schema/bad-base.err
  3. 1 0
      tests/qapi-schema/bad-base.exit
  4. 3 0
      tests/qapi-schema/bad-base.json
  5. 4 0
      tests/qapi-schema/bad-base.out
  6. 0 0
      tests/qapi-schema/bad-ident.err
  7. 1 0
      tests/qapi-schema/bad-ident.exit
  8. 2 0
      tests/qapi-schema/bad-ident.json
  9. 3 0
      tests/qapi-schema/bad-ident.out
  10. 1 0
      tests/qapi-schema/bad-type-bool.err
  11. 1 0
      tests/qapi-schema/bad-type-bool.exit
  12. 3 0
      tests/qapi-schema/bad-type-bool.json
  13. 0 0
      tests/qapi-schema/bad-type-bool.out
  14. 0 0
      tests/qapi-schema/bad-type-dict.err
  15. 1 0
      tests/qapi-schema/bad-type-dict.exit
  16. 2 0
      tests/qapi-schema/bad-type-dict.json
  17. 3 0
      tests/qapi-schema/bad-type-dict.out
  18. 1 0
      tests/qapi-schema/bad-type-int.err
  19. 1 0
      tests/qapi-schema/bad-type-int.exit
  20. 3 0
      tests/qapi-schema/bad-type-int.json
  21. 0 0
      tests/qapi-schema/bad-type-int.out
  22. 1 0
      tests/qapi-schema/double-data.err
  23. 1 0
      tests/qapi-schema/double-data.exit
  24. 2 0
      tests/qapi-schema/double-data.json
  25. 0 0
      tests/qapi-schema/double-data.out
  26. 0 0
      tests/qapi-schema/double-type.err
  27. 1 0
      tests/qapi-schema/double-type.exit
  28. 2 0
      tests/qapi-schema/double-type.json
  29. 3 0
      tests/qapi-schema/double-type.out
  30. 0 0
      tests/qapi-schema/event-case.err
  31. 1 0
      tests/qapi-schema/event-case.exit
  32. 3 0
      tests/qapi-schema/event-case.json
  33. 3 0
      tests/qapi-schema/event-case.out
  34. 0 0
      tests/qapi-schema/ident-with-escape.err
  35. 1 0
      tests/qapi-schema/ident-with-escape.exit
  36. 4 0
      tests/qapi-schema/ident-with-escape.json
  37. 3 0
      tests/qapi-schema/ident-with-escape.out
  38. 0 0
      tests/qapi-schema/missing-type.err
  39. 1 0
      tests/qapi-schema/missing-type.exit
  40. 2 0
      tests/qapi-schema/missing-type.json
  41. 3 0
      tests/qapi-schema/missing-type.out
  42. 0 0
      tests/qapi-schema/unknown-expr-key.err
  43. 1 0
      tests/qapi-schema/unknown-expr-key.exit
  44. 2 0
      tests/qapi-schema/unknown-expr-key.json
  45. 3 0
      tests/qapi-schema/unknown-expr-key.out

+ 5 - 3
tests/Makefile

@@ -210,8 +210,10 @@ check-qapi-schema-y := $(addprefix tests/qapi-schema/, \
 	comments.json empty.json enum-empty.json enum-missing-data.json \
 	comments.json empty.json enum-empty.json enum-missing-data.json \
 	enum-wrong-data.json enum-int-member.json enum-dict-member.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-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-colon.json missing-comma-list.json \
 	missing-comma-object.json non-objects.json \
 	missing-comma-object.json non-objects.json \
 	qapi-schema-test.json quoted-structural-chars.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-simple.json include-relpath.json include-format-err.json \
 	include-non-file.json include-no-file.json include-before-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-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 \
 GENERATED_HEADERS += tests/test-qapi-types.h tests/test-qapi-visit.h \
 		     tests/test-qmp-commands.h tests/test-qapi-event.h
 		     tests/test-qmp-commands.h tests/test-qapi-event.h

+ 0 - 0
tests/qapi-schema/bad-base.err


+ 1 - 0
tests/qapi-schema/bad-base.exit

@@ -0,0 +1 @@
+0

+ 3 - 0
tests/qapi-schema/bad-base.json

@@ -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' } }

+ 4 - 0
tests/qapi-schema/bad-base.out

@@ -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')]))])]

+ 0 - 0
tests/qapi-schema/bad-ident.err


+ 1 - 0
tests/qapi-schema/bad-ident.exit

@@ -0,0 +1 @@
+0

+ 2 - 0
tests/qapi-schema/bad-ident.json

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

+ 3 - 0
tests/qapi-schema/bad-ident.out

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

+ 1 - 0
tests/qapi-schema/bad-type-bool.err

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

+ 1 - 0
tests/qapi-schema/bad-type-bool.exit

@@ -0,0 +1 @@
+1

+ 3 - 0
tests/qapi-schema/bad-type-bool.json

@@ -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': { } }

+ 0 - 0
tests/qapi-schema/bad-type-bool.out


+ 0 - 0
tests/qapi-schema/bad-type-dict.err


+ 1 - 0
tests/qapi-schema/bad-type-dict.exit

@@ -0,0 +1 @@
+0

+ 2 - 0
tests/qapi-schema/bad-type-dict.json

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

+ 3 - 0
tests/qapi-schema/bad-type-dict.out

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

+ 1 - 0
tests/qapi-schema/bad-type-int.err

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

+ 1 - 0
tests/qapi-schema/bad-type-int.exit

@@ -0,0 +1 @@
+1

+ 3 - 0
tests/qapi-schema/bad-type-int.json

@@ -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': { } }

+ 0 - 0
tests/qapi-schema/bad-type-int.out


+ 1 - 0
tests/qapi-schema/double-data.err

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

+ 1 - 0
tests/qapi-schema/double-data.exit

@@ -0,0 +1 @@
+1

+ 2 - 0
tests/qapi-schema/double-data.json

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

+ 0 - 0
tests/qapi-schema/double-data.out


+ 0 - 0
tests/qapi-schema/double-type.err


+ 1 - 0
tests/qapi-schema/double-type.exit

@@ -0,0 +1 @@
+0

+ 2 - 0
tests/qapi-schema/double-type.json

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

+ 3 - 0
tests/qapi-schema/double-type.out

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

+ 0 - 0
tests/qapi-schema/event-case.err


+ 1 - 0
tests/qapi-schema/event-case.exit

@@ -0,0 +1 @@
+0

+ 3 - 0
tests/qapi-schema/event-case.json

@@ -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' }

+ 3 - 0
tests/qapi-schema/event-case.out

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

+ 0 - 0
tests/qapi-schema/ident-with-escape.err


+ 1 - 0
tests/qapi-schema/ident-with-escape.exit

@@ -0,0 +1 @@
+0

+ 4 - 0
tests/qapi-schema/ident-with-escape.json

@@ -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' } }

+ 3 - 0
tests/qapi-schema/ident-with-escape.out

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

+ 0 - 0
tests/qapi-schema/missing-type.err


+ 1 - 0
tests/qapi-schema/missing-type.exit

@@ -0,0 +1 @@
+0

+ 2 - 0
tests/qapi-schema/missing-type.json

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

+ 3 - 0
tests/qapi-schema/missing-type.out

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

+ 0 - 0
tests/qapi-schema/unknown-expr-key.err


+ 1 - 0
tests/qapi-schema/unknown-expr-key.exit

@@ -0,0 +1 @@
+0

+ 2 - 0
tests/qapi-schema/unknown-expr-key.json

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

+ 3 - 0
tests/qapi-schema/unknown-expr-key.out

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