]> git.proxmox.com Git - mirror_qemu.git/blame - tests/qapi-schema/qapi-schema-test.json
qapi: add qapi2texi script
[mirror_qemu.git] / tests / qapi-schema / qapi-schema-test.json
CommitLineData
501e5104
MR
1# *-*- Mode: Python -*-*
2
625b251c
EB
3# This file is a stress test of supported qapi constructs that must
4# parse and compile correctly.
5
3313b612
MAL
6##
7# = Section
8# == subsection
9#
10# Some text foo with *strong* and _emphasis_
11# 1. with a list
12# 2. like that @foo
13#
14# And some code:
15# | $ echo foo
16# | -> do this
17# | <- get that
18#
19# Note: is not a meta
20##
21
22##
23# @TestStruct:
24#
25# body with @var
26#
27# @integer: foo
28# blah
29#
30# bao
31#
32# @boolean: bar
33# @string: baz
34#
35# Example:
36#
37# -> { "execute": ... }
38# <- { "return": ... }
39#
40# Since: 2.3
41# Note: a note
42#
43##
748053c9
EB
44{ 'struct': 'TestStruct',
45 'data': { 'integer': 'int', 'boolean': 'bool', 'string': 'str' } }
46
3313b612
MAL
47##
48# @NestedEnumsOne:
501e5104 49# for testing enums
3313b612 50##
895a2a80 51{ 'struct': 'NestedEnumsOne',
70478cef
EB
52 'data': { 'enum1': 'EnumOne', # Intentional forward reference
53 '*enum2': 'EnumOne', 'enum3': 'EnumOne', '*enum4': 'EnumOne' } }
501e5104 54
3313b612
MAL
55##
56# @MyEnum:
625b251c 57# An empty enum, although unusual, is currently acceptable
3313b612 58##
625b251c
EB
59{ 'enum': 'MyEnum', 'data': [ ] }
60
3313b612
MAL
61##
62# @Empty1:
19767083 63# Likewise for an empty struct, including an empty base
3313b612 64##
19767083 65{ 'struct': 'Empty1', 'data': { } }
3313b612
MAL
66##
67# @Empty2:
68##
19767083
EB
69{ 'struct': 'Empty2', 'base': 'Empty1', 'data': { } }
70
3313b612
MAL
71##
72# @user_def_cmd0:
73##
972a1101
EB
74{ 'command': 'user_def_cmd0', 'data': 'Empty2', 'returns': 'Empty2' }
75
3313b612
MAL
76##
77# @QEnumTwo:
351d36e4 78# for testing override of default naming heuristic
3313b612 79##
351d36e4
DB
80{ 'enum': 'QEnumTwo',
81 'prefix': 'QENUM_TWO',
82 'data': [ 'value1', 'value2' ] }
83
3313b612
MAL
84##
85# @UserDefOne:
501e5104 86# for testing nested structs
3313b612 87##
895a2a80 88{ 'struct': 'UserDefOne',
8c3f8e77 89 'base': 'UserDefZero', # intentional forward reference
70478cef
EB
90 'data': { 'string': 'str',
91 '*enum1': 'EnumOne' } } # intentional forward reference
92
3313b612
MAL
93##
94# @EnumOne:
95##
70478cef
EB
96{ 'enum': 'EnumOne',
97 'data': [ 'value1', 'value2', 'value3' ] }
501e5104 98
3313b612
MAL
99##
100# @UserDefZero:
101##
8c3f8e77
MA
102{ 'struct': 'UserDefZero',
103 'data': { 'integer': 'int' } }
104
3313b612
MAL
105##
106# @UserDefTwoDictDict:
107##
6446a592
EB
108{ 'struct': 'UserDefTwoDictDict',
109 'data': { 'userdef': 'UserDefOne', 'string': 'str' } }
110
3313b612
MAL
111##
112# @UserDefTwoDict:
113##
6446a592
EB
114{ 'struct': 'UserDefTwoDict',
115 'data': { 'string1': 'str',
116 'dict2': 'UserDefTwoDictDict',
117 '*dict3': 'UserDefTwoDictDict' } }
118
3313b612
MAL
119##
120# @UserDefTwo:
121##
895a2a80 122{ 'struct': 'UserDefTwo',
f294f82a 123 'data': { 'string0': 'str',
6446a592 124 'dict1': 'UserDefTwoDict' } }
f294f82a 125
3313b612
MAL
126##
127# @ForceArrays:
9f08c8ec 128# dummy struct to force generation of array types not otherwise mentioned
3313b612 129##
9f08c8ec 130{ 'struct': 'ForceArrays',
748053c9
EB
131 'data': { 'unused1':['UserDefOne'], 'unused2':['UserDefTwo'],
132 'unused3':['TestStruct'] } }
9f08c8ec 133
3313b612
MAL
134##
135# @UserDefA:
dc8fb6df 136# for testing unions
d220fbcd
EB
137# Among other things, test that a name collision between branches does
138# not cause any problems (since only one branch can be in use at a time),
139# by intentionally using two branches that both have a C member 'a_b'
3313b612 140##
895a2a80 141{ 'struct': 'UserDefA',
d220fbcd 142 'data': { 'boolean': 'bool', '*a_b': 'int' } }
dc8fb6df 143
3313b612
MAL
144##
145# @UserDefB:
146##
895a2a80 147{ 'struct': 'UserDefB',
d220fbcd 148 'data': { 'intb': 'int', '*a-b': 'bool' } }
dc8fb6df 149
3313b612
MAL
150##
151# @UserDefFlatUnion:
152##
2fc00432 153{ 'union': 'UserDefFlatUnion',
8c3f8e77 154 'base': 'UserDefUnionBase', # intentional forward reference
5223070c 155 'discriminator': 'enum1',
8c3f8e77
MA
156 'data': { 'value1' : 'UserDefA',
157 'value2' : 'UserDefB',
158 'value3' : 'UserDefB' } }
2fc00432 159
3313b612
MAL
160##
161# @UserDefUnionBase:
162##
8c3f8e77 163{ 'struct': 'UserDefUnionBase',
80e60a19 164 'base': 'UserDefZero',
8c3f8e77
MA
165 'data': { 'string': 'str', 'enum1': 'EnumOne' } }
166
3313b612
MAL
167##
168# @UserDefFlatUnion2:
14f00c6c 169# this variant of UserDefFlatUnion defaults to a union that uses members with
cb55111b 170# allocated types to test corner cases in the cleanup/dealloc visitor
3313b612 171##
cb55111b 172{ 'union': 'UserDefFlatUnion2',
ac4338f8 173 'base': { '*integer': 'int', 'string': 'str', 'enum1': 'QEnumTwo' },
cb55111b 174 'discriminator': 'enum1',
8c3f8e77 175 'data': { 'value1' : 'UserDefC', # intentional forward reference
9d3524b3 176 'value2' : 'UserDefB' } }
cb55111b 177
3313b612
MAL
178##
179# @WrapAlternate:
180##
68d07839
EB
181{ 'struct': 'WrapAlternate',
182 'data': { 'alt': 'UserDefAlternate' } }
3313b612
MAL
183##
184# @UserDefAlternate:
185##
ab916fad 186{ 'alternate': 'UserDefAlternate',
68d07839 187 'data': { 'udfu': 'UserDefFlatUnion', 's': 'str', 'i': 'int' } }
2c38b600 188
3313b612
MAL
189##
190# @UserDefC:
191##
8c3f8e77
MA
192{ 'struct': 'UserDefC',
193 'data': { 'string1': 'str', 'string2': 'str' } }
194
9c51b441 195# for testing use of 'number' within alternates
3313b612
MAL
196##
197# @AltStrBool:
198##
9c51b441 199{ 'alternate': 'AltStrBool', 'data': { 's': 'str', 'b': 'bool' } }
3313b612
MAL
200##
201# @AltStrNum:
202##
9c51b441 203{ 'alternate': 'AltStrNum', 'data': { 's': 'str', 'n': 'number' } }
3313b612
MAL
204##
205# @AltNumStr:
206##
9c51b441 207{ 'alternate': 'AltNumStr', 'data': { 'n': 'number', 's': 'str' } }
3313b612
MAL
208##
209# @AltStrInt:
210##
9c51b441 211{ 'alternate': 'AltStrInt', 'data': { 's': 'str', 'i': 'int' } }
3313b612
MAL
212##
213# @AltIntNum:
214##
9c51b441 215{ 'alternate': 'AltIntNum', 'data': { 'i': 'int', 'n': 'number' } }
3313b612
MAL
216##
217# @AltNumInt:
218##
9c51b441
EB
219{ 'alternate': 'AltNumInt', 'data': { 'n': 'number', 'i': 'int' } }
220
3313b612
MAL
221##
222# @UserDefNativeListUnion:
83c84667 223# for testing native lists
3313b612 224##
83c84667
MR
225{ 'union': 'UserDefNativeListUnion',
226 'data': { 'integer': ['int'],
227 's8': ['int8'],
228 's16': ['int16'],
229 's32': ['int32'],
230 's64': ['int64'],
231 'u8': ['uint8'],
232 'u16': ['uint16'],
233 'u32': ['uint32'],
234 'u64': ['uint64'],
235 'number': ['number'],
236 'boolean': ['bool'],
cb17f79e 237 'string': ['str'],
28770e05
MA
238 'sizes': ['size'],
239 'any': ['any'] } }
83c84667 240
501e5104 241# testing commands
3313b612
MAL
242##
243# @user_def_cmd:
244##
501e5104 245{ 'command': 'user_def_cmd', 'data': {} }
3313b612
MAL
246##
247# @user_def_cmd1:
248##
501e5104 249{ 'command': 'user_def_cmd1', 'data': {'ud1a': 'UserDefOne'} }
3313b612
MAL
250##
251# @user_def_cmd2:
252##
ab22ad96
MA
253{ 'command': 'user_def_cmd2',
254 'data': {'ud1a': 'UserDefOne', '*ud1b': 'UserDefOne'},
255 'returns': 'UserDefTwo' }
cae95eae 256
3313b612
MAL
257##
258# Another comment
259##
260
261##
262# @guest-get-time:
263#
264# @guest-get-time body
265#
266# @a: an integer
267# @b: #optional integer
268#
269# Returns: returns something
270#
271# Example:
272#
273# -> { "execute": "guest-get-time", ... }
274# <- { "return": "42" }
275#
276##
277
cae95eae
EB
278# Returning a non-dictionary requires a name from the whitelist
279{ 'command': 'guest-get-time', 'data': {'a': 'int', '*b': 'int' },
c2216a8a 280 'returns': 'int' }
3313b612
MAL
281##
282# @guest-sync:
283##
28770e05 284{ 'command': 'guest-sync', 'data': { 'arg': 'any' }, 'returns': 'any' }
3313b612
MAL
285##
286# @boxed-struct:
287##
c818408e 288{ 'command': 'boxed-struct', 'boxed': true, 'data': 'UserDefZero' }
3313b612
MAL
289##
290# @boxed-union:
291##
c818408e 292{ 'command': 'boxed-union', 'data': 'UserDefNativeListUnion', 'boxed': true }
3953e3a5 293
3313b612
MAL
294##
295# @UserDefOptions:
296#
3953e3a5
LE
297# For testing integer range flattening in opts-visitor. The following schema
298# corresponds to the option format:
299#
300# -userdef i64=3-6,i64=-5--1,u64=2,u16=1,u16=7-12
301#
302# For simplicity, this example doesn't use [type=]discriminator nor optargs
303# specific to discriminator values.
3313b612 304##
895a2a80 305{ 'struct': 'UserDefOptions',
3953e3a5
LE
306 'data': {
307 '*i64' : [ 'int' ],
308 '*u64' : [ 'uint64' ],
309 '*u16' : [ 'uint16' ],
310 '*i64x': 'int' ,
311 '*u64x': 'uint64' } }
f6dadb02
WX
312
313# testing event
3313b612
MAL
314##
315# @EventStructOne:
316##
895a2a80 317{ 'struct': 'EventStructOne',
f6dadb02
WX
318 'data': { 'struct1': 'UserDefOne', 'string': 'str', '*enum2': 'EnumOne' } }
319
3313b612
MAL
320##
321# @EVENT_A:
322##
f6dadb02 323{ 'event': 'EVENT_A' }
3313b612
MAL
324##
325# @EVENT_B:
326##
f6dadb02
WX
327{ 'event': 'EVENT_B',
328 'data': { } }
3313b612
MAL
329##
330# @EVENT_C:
331##
f6dadb02
WX
332{ 'event': 'EVENT_C',
333 'data': { '*a': 'int', '*b': 'UserDefOne', 'c': 'str' } }
3313b612
MAL
334##
335# @EVENT_D:
336##
f6dadb02
WX
337{ 'event': 'EVENT_D',
338 'data': { 'a' : 'EventStructOne', 'b' : 'str', '*c': 'str', '*enum3': 'EnumOne' } }
3313b612
MAL
339##
340# @EVENT_E:
341##
c818408e 342{ 'event': 'EVENT_E', 'boxed': true, 'data': 'UserDefZero' }
3313b612
MAL
343##
344# @EVENT_F:
345##
c818408e 346{ 'event': 'EVENT_F', 'boxed': true, 'data': 'UserDefAlternate' }
fce384b8 347
c43567c1
EB
348# test that we correctly compile downstream extensions, as well as munge
349# ticklish names
3313b612
MAL
350##
351# @__org.qemu_x-Enum:
352##
fce384b8 353{ 'enum': '__org.qemu_x-Enum', 'data': [ '__org.qemu_x-value' ] }
3313b612
MAL
354##
355# @__org.qemu_x-Base:
356##
83a02706
EB
357{ 'struct': '__org.qemu_x-Base',
358 'data': { '__org.qemu_x-member1': '__org.qemu_x-Enum' } }
3313b612
MAL
359##
360# @__org.qemu_x-Struct:
361##
83a02706 362{ 'struct': '__org.qemu_x-Struct', 'base': '__org.qemu_x-Base',
c43567c1 363 'data': { '__org.qemu_x-member2': 'str', '*wchar-t': 'int' } }
3313b612
MAL
364##
365# @__org.qemu_x-Union1:
366##
bb337290 367{ 'union': '__org.qemu_x-Union1', 'data': { '__org.qemu_x-branch': 'str' } }
3313b612
MAL
368##
369# @__org.qemu_x-Struct2:
370##
857af5f0
EB
371{ 'struct': '__org.qemu_x-Struct2',
372 'data': { 'array': ['__org.qemu_x-Union1'] } }
3313b612
MAL
373##
374# @__org.qemu_x-Union2:
375##
857af5f0
EB
376{ 'union': '__org.qemu_x-Union2', 'base': '__org.qemu_x-Base',
377 'discriminator': '__org.qemu_x-member1',
378 'data': { '__org.qemu_x-value': '__org.qemu_x-Struct2' } }
3313b612
MAL
379##
380# @__org.qemu_x-Alt:
381##
d1f07c86
EB
382{ 'alternate': '__org.qemu_x-Alt',
383 'data': { '__org.qemu_x-branch': 'str', 'b': '__org.qemu_x-Base' } }
3313b612
MAL
384##
385# @__ORG.QEMU_X-EVENT:
386##
e3c4c3d7 387{ 'event': '__ORG.QEMU_X-EVENT', 'data': '__org.qemu_x-Struct' }
3313b612
MAL
388##
389# @__org.qemu_x-command:
390##
e3c4c3d7
EB
391{ 'command': '__org.qemu_x-command',
392 'data': { 'a': ['__org.qemu_x-Enum'], 'b': ['__org.qemu_x-Struct'],
393 'c': '__org.qemu_x-Union2', 'd': '__org.qemu_x-Alt' },
394 'returns': '__org.qemu_x-Union1' }