xref: /qemu/tests/qapi-schema/test-qapi.py (revision 6a8c0b51025314cdb1a8b4be24d45e690f1217dd)
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
41*6a8c0b51SKevin Wolf    def visit_object_type(self, name, info, ifcond, base, members, variants,
42*6a8c0b51SKevin 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)
52156402e5SMarkus Armbruster
53fbf09a2fSMarc-André Lureau    def visit_alternate_type(self, name, info, ifcond, variants):
54ef9d9108SDaniel P. Berrange        print('alternate %s' % name)
55156402e5SMarkus Armbruster        self._print_variants(variants)
56fbf09a2fSMarc-André Lureau        self._print_if(ifcond)
57156402e5SMarkus Armbruster
58fbf09a2fSMarc-André Lureau    def visit_command(self, name, info, ifcond, arg_type, ret_type, gen,
59d6fe3d02SIgor Mammedov                      success_response, boxed, allow_oob, allow_preconfig):
60b736e25aSMarkus Armbruster        print('command %s %s -> %s'
61b736e25aSMarkus Armbruster              % (name, arg_type and arg_type.name,
62b736e25aSMarkus Armbruster                 ret_type and ret_type.name))
63b736e25aSMarkus Armbruster        print('   gen=%s success_response=%s boxed=%s oob=%s preconfig=%s'
64b736e25aSMarkus Armbruster              % (gen, success_response, boxed, allow_oob, allow_preconfig))
65fbf09a2fSMarc-André Lureau        self._print_if(ifcond)
66156402e5SMarkus Armbruster
67fbf09a2fSMarc-André Lureau    def visit_event(self, name, info, ifcond, arg_type, boxed):
68ef9d9108SDaniel P. Berrange        print('event %s %s' % (name, arg_type and arg_type.name))
69ef9d9108SDaniel P. Berrange        print('   boxed=%s' % boxed)
70fbf09a2fSMarc-André Lureau        self._print_if(ifcond)
71156402e5SMarkus Armbruster
72156402e5SMarkus Armbruster    @staticmethod
73156402e5SMarkus Armbruster    def _print_variants(variants):
74156402e5SMarkus Armbruster        if variants:
75ef9d9108SDaniel P. Berrange            print('    tag %s' % variants.tag_member.name)
76156402e5SMarkus Armbruster            for v in variants.variants:
77ef9d9108SDaniel P. Berrange                print('    case %s: %s' % (v.name, v.type.name))
78a2724280SMarc-André Lureau                QAPISchemaTestVisitor._print_if(v.ifcond, indent=8)
79156402e5SMarkus Armbruster
80fbf09a2fSMarc-André Lureau    @staticmethod
81fbf09a2fSMarc-André Lureau    def _print_if(ifcond, indent=4):
82fbf09a2fSMarc-André Lureau        if ifcond:
83fbf09a2fSMarc-André Lureau            print('%sif %s' % (' ' * indent, ifcond))
84fbf09a2fSMarc-André Lureau
85181feaf3SMarkus Armbruster
86181feaf3SMarkus Armbrustertry:
87156402e5SMarkus Armbruster    schema = QAPISchema(sys.argv[1])
88181feaf3SMarkus Armbrusterexcept QAPIError as err:
89181feaf3SMarkus Armbruster    print(err, file=sys.stderr)
90181feaf3SMarkus Armbruster    exit(1)
91181feaf3SMarkus Armbruster
92156402e5SMarkus Armbrusterschema.visit(QAPISchemaTestVisitor())
93818c3318SMarkus Armbruster
94818c3318SMarkus Armbrusterfor doc in schema.docs:
95818c3318SMarkus Armbruster    if doc.symbol:
96ef9d9108SDaniel P. Berrange        print('doc symbol=%s' % doc.symbol)
97818c3318SMarkus Armbruster    else:
98ef9d9108SDaniel P. Berrange        print('doc freeform')
99ef9d9108SDaniel P. Berrange    print('    body=\n%s' % doc.body.text)
1002f848044SDaniel P. Berrange    for arg, section in doc.args.items():
101ef9d9108SDaniel P. Berrange        print('    arg=%s\n%s' % (arg, section.text))
102818c3318SMarkus Armbruster    for section in doc.sections:
103ef9d9108SDaniel P. Berrange        print('    section=%s\n%s' % (section.name, section.text))
104