xref: /qemu/tests/qapi-schema/test-qapi.py (revision 6402cbbb)
1#
2# QAPI parser test harness
3#
4# Copyright (c) 2013 Red Hat Inc.
5#
6# Authors:
7#  Markus Armbruster <armbru@redhat.com>
8#
9# This work is licensed under the terms of the GNU GPL, version 2 or later.
10# See the COPYING file in the top-level directory.
11#
12
13from qapi import *
14from pprint import pprint
15import os
16import sys
17
18
19class QAPISchemaTestVisitor(QAPISchemaVisitor):
20    def visit_enum_type(self, name, info, values, prefix):
21        print 'enum %s %s' % (name, values)
22        if prefix:
23            print '    prefix %s' % prefix
24
25    def visit_object_type(self, name, info, base, members, variants):
26        print 'object %s' % name
27        if base:
28            print '    base %s' % base.name
29        for m in members:
30            print '    member %s: %s optional=%s' % \
31                (m.name, m.type.name, m.optional)
32        self._print_variants(variants)
33
34    def visit_alternate_type(self, name, info, variants):
35        print 'alternate %s' % name
36        self._print_variants(variants)
37
38    def visit_command(self, name, info, arg_type, ret_type,
39                      gen, success_response, boxed):
40        print 'command %s %s -> %s' % \
41            (name, arg_type and arg_type.name, ret_type and ret_type.name)
42        print '   gen=%s success_response=%s boxed=%s' % \
43            (gen, success_response, boxed)
44
45    def visit_event(self, name, info, arg_type, boxed):
46        print 'event %s %s' % (name, arg_type and arg_type.name)
47        print '   boxed=%s' % boxed
48
49    @staticmethod
50    def _print_variants(variants):
51        if variants:
52            print '    tag %s' % variants.tag_member.name
53            for v in variants.variants:
54                print '    case %s: %s' % (v.name, v.type.name)
55
56schema = QAPISchema(sys.argv[1])
57schema.visit(QAPISchemaTestVisitor())
58
59for doc in schema.docs:
60    if doc.symbol:
61        print 'doc symbol=%s' % doc.symbol
62    else:
63        print 'doc freeform'
64    print '    body=\n%s' % doc.body
65    for arg, section in doc.args.iteritems():
66        print '    arg=%s\n%s' % (arg, section)
67    for section in doc.sections:
68        print '    section=%s\n%s' % (section.name, section)
69