xref: /qemu/tests/qapi-schema/test-qapi.py (revision 8aa3a33e442fc49fd67e4c8df8869d257c41c77e)
198626572SMarkus Armbruster#
298626572SMarkus Armbruster# QAPI parser test harness
398626572SMarkus Armbruster#
498626572SMarkus Armbruster# Copyright (c) 2013 Red Hat Inc.
598626572SMarkus Armbruster#
698626572SMarkus Armbruster# Authors:
798626572SMarkus Armbruster#  Markus Armbruster <armbru@redhat.com>
898626572SMarkus Armbruster#
998626572SMarkus Armbruster# This work is licensed under the terms of the GNU GPL, version 2 or later.
1098626572SMarkus Armbruster# See the COPYING file in the top-level directory.
1198626572SMarkus Armbruster#
1298626572SMarkus Armbruster
13ef9d9108SDaniel P. Berrangefrom __future__ import print_function
1498626572SMarkus Armbrusterimport sys
15181feaf3SMarkus Armbrusterfrom qapi.common import QAPIError, QAPISchema, QAPISchemaVisitor
1698626572SMarkus Armbruster
1798626572SMarkus Armbruster
18156402e5SMarkus Armbrusterclass QAPISchemaTestVisitor(QAPISchemaVisitor):
19cf40a0a5SMarkus Armbruster
20cf40a0a5SMarkus Armbruster    def visit_module(self, name):
21cf40a0a5SMarkus Armbruster        print('module %s' % name)
22cf40a0a5SMarkus Armbruster
23cf40a0a5SMarkus Armbruster    def visit_include(self, name, info):
24cf40a0a5SMarkus Armbruster        print('include %s' % name)
25cf40a0a5SMarkus Armbruster
261962bd39SMarc-André Lureau    def visit_enum_type(self, name, info, ifcond, members, prefix):
271e381b65SMarc-André Lureau        print('enum %s' % name)
28156402e5SMarkus Armbruster        if prefix:
29ef9d9108SDaniel P. Berrange            print('    prefix %s' % prefix)
301e381b65SMarc-André Lureau        for m in members:
311e381b65SMarc-André Lureau            print('    member %s' % m.name)
326cc32b0eSMarc-André Lureau            self._print_if(m.ifcond, indent=8)
33fbf09a2fSMarc-André Lureau        self._print_if(ifcond)
34156402e5SMarkus Armbruster
35ca0ac758SMarkus Armbruster    def visit_array_type(self, name, info, ifcond, element_type):
36ca0ac758SMarkus Armbruster        if not info:
37ca0ac758SMarkus Armbruster            return              # suppress built-in arrays
38ca0ac758SMarkus Armbruster        print('array %s %s' % (name, element_type.name))
39ca0ac758SMarkus Armbruster        self._print_if(ifcond)
40ca0ac758SMarkus Armbruster
416a8c0b51SKevin Wolf    def visit_object_type(self, name, info, ifcond, base, members, variants,
426a8c0b51SKevin Wolf                          features):
43ef9d9108SDaniel P. Berrange        print('object %s' % name)
44156402e5SMarkus Armbruster        if base:
45ef9d9108SDaniel P. Berrange            print('    base %s' % base.name)
46156402e5SMarkus Armbruster        for m in members:
47b736e25aSMarkus Armbruster            print('    member %s: %s optional=%s'
48b736e25aSMarkus Armbruster                  % (m.name, m.type.name, m.optional))
49ccadd6bcSMarc-André Lureau            self._print_if(m.ifcond, 8)
50156402e5SMarkus Armbruster        self._print_variants(variants)
51fbf09a2fSMarc-André Lureau        self._print_if(ifcond)
52*8aa3a33eSKevin Wolf        if features:
53*8aa3a33eSKevin Wolf            for f in features:
54*8aa3a33eSKevin Wolf                print('    feature %s' % f.name)
55*8aa3a33eSKevin Wolf                self._print_if(f.ifcond, 8)
56156402e5SMarkus Armbruster
57fbf09a2fSMarc-André Lureau    def visit_alternate_type(self, name, info, ifcond, variants):
58ef9d9108SDaniel P. Berrange        print('alternate %s' % name)
59156402e5SMarkus Armbruster        self._print_variants(variants)
60fbf09a2fSMarc-André Lureau        self._print_if(ifcond)
61156402e5SMarkus Armbruster
62fbf09a2fSMarc-André Lureau    def visit_command(self, name, info, ifcond, arg_type, ret_type, gen,
63d6fe3d02SIgor Mammedov                      success_response, boxed, allow_oob, allow_preconfig):
64b736e25aSMarkus Armbruster        print('command %s %s -> %s'
65b736e25aSMarkus Armbruster              % (name, arg_type and arg_type.name,
66b736e25aSMarkus Armbruster                 ret_type and ret_type.name))
67b736e25aSMarkus Armbruster        print('   gen=%s success_response=%s boxed=%s oob=%s preconfig=%s'
68b736e25aSMarkus Armbruster              % (gen, success_response, boxed, allow_oob, allow_preconfig))
69fbf09a2fSMarc-André Lureau        self._print_if(ifcond)
70156402e5SMarkus Armbruster
71fbf09a2fSMarc-André Lureau    def visit_event(self, name, info, ifcond, arg_type, boxed):
72ef9d9108SDaniel P. Berrange        print('event %s %s' % (name, arg_type and arg_type.name))
73ef9d9108SDaniel P. Berrange        print('   boxed=%s' % boxed)
74fbf09a2fSMarc-André Lureau        self._print_if(ifcond)
75156402e5SMarkus Armbruster
76156402e5SMarkus Armbruster    @staticmethod
77156402e5SMarkus Armbruster    def _print_variants(variants):
78156402e5SMarkus Armbruster        if variants:
79ef9d9108SDaniel P. Berrange            print('    tag %s' % variants.tag_member.name)
80156402e5SMarkus Armbruster            for v in variants.variants:
81ef9d9108SDaniel P. Berrange                print('    case %s: %s' % (v.name, v.type.name))
82a2724280SMarc-André Lureau                QAPISchemaTestVisitor._print_if(v.ifcond, indent=8)
83156402e5SMarkus Armbruster
84fbf09a2fSMarc-André Lureau    @staticmethod
85fbf09a2fSMarc-André Lureau    def _print_if(ifcond, indent=4):
86fbf09a2fSMarc-André Lureau        if ifcond:
87fbf09a2fSMarc-André Lureau            print('%sif %s' % (' ' * indent, ifcond))
88fbf09a2fSMarc-André Lureau
89181feaf3SMarkus Armbruster
90181feaf3SMarkus Armbrustertry:
91156402e5SMarkus Armbruster    schema = QAPISchema(sys.argv[1])
92181feaf3SMarkus Armbrusterexcept QAPIError as err:
93181feaf3SMarkus Armbruster    print(err, file=sys.stderr)
94181feaf3SMarkus Armbruster    exit(1)
95181feaf3SMarkus Armbruster
96156402e5SMarkus Armbrusterschema.visit(QAPISchemaTestVisitor())
97818c3318SMarkus Armbruster
98818c3318SMarkus Armbrusterfor doc in schema.docs:
99818c3318SMarkus Armbruster    if doc.symbol:
100ef9d9108SDaniel P. Berrange        print('doc symbol=%s' % doc.symbol)
101818c3318SMarkus Armbruster    else:
102ef9d9108SDaniel P. Berrange        print('doc freeform')
103ef9d9108SDaniel P. Berrange    print('    body=\n%s' % doc.body.text)
1042f848044SDaniel P. Berrange    for arg, section in doc.args.items():
105ef9d9108SDaniel P. Berrange        print('    arg=%s\n%s' % (arg, section.text))
106818c3318SMarkus Armbruster    for section in doc.sections:
107ef9d9108SDaniel P. Berrange        print('    section=%s\n%s' % (section.name, section.text))
108