xref: /qemu/tests/qapi-schema/test-qapi.py (revision d6fe3d02e9a2ce7b63a0723d0b71f3013f59d705)
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
26156402e5SMarkus Armbruster    def visit_enum_type(self, name, info, values, prefix):
27ef9d9108SDaniel P. Berrange        print('enum %s %s' % (name, values))
28156402e5SMarkus Armbruster        if prefix:
29ef9d9108SDaniel P. Berrange            print('    prefix %s' % prefix)
30156402e5SMarkus Armbruster
31156402e5SMarkus Armbruster    def visit_object_type(self, name, info, base, members, variants):
32ef9d9108SDaniel P. Berrange        print('object %s' % name)
33156402e5SMarkus Armbruster        if base:
34ef9d9108SDaniel P. Berrange            print('    base %s' % base.name)
35156402e5SMarkus Armbruster        for m in members:
36ef9d9108SDaniel P. Berrange            print('    member %s: %s optional=%s' % \
37ef9d9108SDaniel P. Berrange                  (m.name, m.type.name, m.optional))
38156402e5SMarkus Armbruster        self._print_variants(variants)
39156402e5SMarkus Armbruster
40156402e5SMarkus Armbruster    def visit_alternate_type(self, name, info, variants):
41ef9d9108SDaniel P. Berrange        print('alternate %s' % name)
42156402e5SMarkus Armbruster        self._print_variants(variants)
43156402e5SMarkus Armbruster
44*d6fe3d02SIgor Mammedov    def visit_command(self, name, info, arg_type, ret_type, gen,
45*d6fe3d02SIgor Mammedov                      success_response, boxed, allow_oob, allow_preconfig):
46ef9d9108SDaniel P. Berrange        print('command %s %s -> %s' % \
47ef9d9108SDaniel P. Berrange              (name, arg_type and arg_type.name, ret_type and ret_type.name))
484bebca1eSPeter Xu        print('   gen=%s success_response=%s boxed=%s oob=%s' % \
494bebca1eSPeter Xu              (gen, success_response, boxed, allow_oob))
50156402e5SMarkus Armbruster
5148825ca4SEric Blake    def visit_event(self, name, info, arg_type, boxed):
52ef9d9108SDaniel P. Berrange        print('event %s %s' % (name, arg_type and arg_type.name))
53ef9d9108SDaniel P. Berrange        print('   boxed=%s' % boxed)
54156402e5SMarkus Armbruster
55156402e5SMarkus Armbruster    @staticmethod
56156402e5SMarkus Armbruster    def _print_variants(variants):
57156402e5SMarkus Armbruster        if variants:
58ef9d9108SDaniel P. Berrange            print('    tag %s' % variants.tag_member.name)
59156402e5SMarkus Armbruster            for v in variants.variants:
60ef9d9108SDaniel P. Berrange                print('    case %s: %s' % (v.name, v.type.name))
61156402e5SMarkus Armbruster
62181feaf3SMarkus Armbruster
63181feaf3SMarkus Armbrustertry:
64156402e5SMarkus Armbruster    schema = QAPISchema(sys.argv[1])
65181feaf3SMarkus Armbrusterexcept QAPIError as err:
66181feaf3SMarkus Armbruster    print(err, file=sys.stderr)
67181feaf3SMarkus Armbruster    exit(1)
68181feaf3SMarkus Armbruster
69156402e5SMarkus Armbrusterschema.visit(QAPISchemaTestVisitor())
70818c3318SMarkus Armbruster
71818c3318SMarkus Armbrusterfor doc in schema.docs:
72818c3318SMarkus Armbruster    if doc.symbol:
73ef9d9108SDaniel P. Berrange        print('doc symbol=%s' % doc.symbol)
74818c3318SMarkus Armbruster    else:
75ef9d9108SDaniel P. Berrange        print('doc freeform')
76ef9d9108SDaniel P. Berrange    print('    body=\n%s' % doc.body.text)
772f848044SDaniel P. Berrange    for arg, section in doc.args.items():
78ef9d9108SDaniel P. Berrange        print('    arg=%s\n%s' % (arg, section.text))
79818c3318SMarkus Armbruster    for section in doc.sections:
80ef9d9108SDaniel P. Berrange        print('    section=%s\n%s' % (section.name, section.text))
81