The previous test demonstrated that the generator choked if an enum forgot 'data', and silently ignored an enum where 'data' was the wrong type. Fix both cases to give a sane error message.
* scripts/qapi.py (parse_schema): Avoid bad deref. (check_exprs): Check for array on enums. * tests/qapi-schema/enum-missing-data.err: Update expected results. * tests/qapi-schema/enum-wrong-data.*: Likewise. Signed-off-by: Eric Blake <ebl...@redhat.com> --- scripts/qapi.py | 16 ++++++++++++---- tests/qapi-schema/enum-missing-data.err | 7 +------ tests/qapi-schema/enum-wrong-data.err | 1 + tests/qapi-schema/enum-wrong-data.exit | 2 +- tests/qapi-schema/enum-wrong-data.out | 3 --- 5 files changed, 15 insertions(+), 14 deletions(-) diff --git a/scripts/qapi.py b/scripts/qapi.py index f2c6d1f..11f70db 100644 --- a/scripts/qapi.py +++ b/scripts/qapi.py @@ -2,7 +2,7 @@ # QAPI helper library # # Copyright IBM, Corp. 2011 -# Copyright (c) 2013 Red Hat Inc. +# Copyright (c) 2013-2014 Red Hat Inc. # # Authors: # Anthony Liguori <aligu...@us.ibm.com> @@ -319,10 +319,18 @@ def check_union(expr, expr_info): def check_exprs(schema): for expr_elem in schema.exprs: expr = expr_elem['expr'] + info = expr_elem['info'] + members = expr.get('data') + if expr.has_key('union'): - check_union(expr, expr_elem['info']) + check_union(expr, info) if expr.has_key('event'): - check_event(expr, expr_elem['info']) + check_event(expr, info) + if expr.has_key('enum'): + if not isinstance(members, list): + raise QAPIExprError(info, + "enum '%s' requires an array for 'data'" + % expr.get('enum')) def parse_schema(input_file): try: @@ -335,7 +343,7 @@ def parse_schema(input_file): for expr_elem in schema.exprs: expr = expr_elem['expr'] - if expr.has_key('enum'): + if expr.has_key('enum') and expr.has_key('data'): add_enum(expr['enum'], expr['data']) elif expr.has_key('union'): add_union(expr) diff --git a/tests/qapi-schema/enum-missing-data.err b/tests/qapi-schema/enum-missing-data.err index 1fec213..4912aab 100644 --- a/tests/qapi-schema/enum-missing-data.err +++ b/tests/qapi-schema/enum-missing-data.err @@ -1,6 +1 @@ -Traceback (most recent call last): - File "tests/qapi-schema/test-qapi.py", line 19, in <module> - exprs = parse_schema(sys.argv[1]) - File "scripts/qapi.py", line 339, in parse_schema - add_enum(expr['enum'], expr['data']) -KeyError: 'data' +tests/qapi-schema/enum-missing-data.json:1: enum 'MyEnum' requires an array for 'data' diff --git a/tests/qapi-schema/enum-wrong-data.err b/tests/qapi-schema/enum-wrong-data.err index e69de29..857f0bd 100644 --- a/tests/qapi-schema/enum-wrong-data.err +++ b/tests/qapi-schema/enum-wrong-data.err @@ -0,0 +1 @@ +tests/qapi-schema/enum-wrong-data.json:1: enum 'MyEnum' requires an array for 'data' diff --git a/tests/qapi-schema/enum-wrong-data.exit b/tests/qapi-schema/enum-wrong-data.exit index 573541a..d00491f 100644 --- a/tests/qapi-schema/enum-wrong-data.exit +++ b/tests/qapi-schema/enum-wrong-data.exit @@ -1 +1 @@ -0 +1 diff --git a/tests/qapi-schema/enum-wrong-data.out b/tests/qapi-schema/enum-wrong-data.out index 28d2211..e69de29 100644 --- a/tests/qapi-schema/enum-wrong-data.out +++ b/tests/qapi-schema/enum-wrong-data.out @@ -1,3 +0,0 @@ -[OrderedDict([('enum', 'MyEnum'), ('data', OrderedDict([('value', 'str')]))])] -[{'enum_name': 'MyEnum', 'enum_values': OrderedDict([('value', 'str')])}] -[] -- 1.9.3