]>
Commit | Line | Data |
---|---|---|
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' } |