The various schemas included in QEMU use a JSON-based format which is, however, strictly speaking not valid JSON. As a consequence, when vim tries to apply syntax highlight rules for JSON (as guessed from the file name), the result is an unreadable mess which mostly consist of red markers pointing out supposed errors in, well, pretty much everything. Using Python syntax highlighting produces much better results, and in fact these files already start with specially-formatted comments that instruct Emacs to process them as if they were Python files. This commit adds the equivalent special comments for vim. Signed-off-by: Andrea Bolognani <abologna@redhat.com> Message-Id: <20200729185024.121766-1-abologna@redhat.com> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Reviewed-by: John Snow <jsnow@redhat.com> Signed-off-by: Markus Armbruster <armbru@redhat.com>
327 lines
12 KiB
Python
327 lines
12 KiB
Python
# *-*- Mode: Python -*-*
|
|
# vim: filetype=python
|
|
|
|
# This file is a stress test of supported qapi constructs that must
|
|
# parse and compile correctly.
|
|
|
|
# Whitelists to permit QAPI rule violations
|
|
{ 'pragma': {
|
|
# Commands allowed to return a non-dictionary:
|
|
'returns-whitelist': [
|
|
'guest-get-time',
|
|
'guest-sync' ] } }
|
|
|
|
{ 'struct': 'TestStruct',
|
|
'data': { 'integer': {'type': 'int'}, 'boolean': 'bool', 'string': 'str' } }
|
|
|
|
# for testing enums
|
|
{ 'struct': 'NestedEnumsOne',
|
|
'data': { 'enum1': 'EnumOne', # Intentional forward reference
|
|
'*enum2': 'EnumOne', 'enum3': 'EnumOne', '*enum4': 'EnumOne' } }
|
|
|
|
# An empty enum, although unusual, is currently acceptable
|
|
{ 'enum': 'MyEnum', 'data': [ ] }
|
|
|
|
# Likewise for an empty struct, including an empty base
|
|
{ 'struct': 'Empty1', 'data': { } }
|
|
{ 'struct': 'Empty2', 'base': 'Empty1', 'data': { } }
|
|
|
|
# Likewise for an empty flat union
|
|
{ 'union': 'Union',
|
|
'base': { 'type': 'EnumOne' }, 'discriminator': 'type',
|
|
'data': { } }
|
|
|
|
{ 'command': 'user_def_cmd0', 'data': 'Empty2', 'returns': 'Empty2' }
|
|
|
|
# for testing override of default naming heuristic
|
|
{ 'enum': 'QEnumTwo',
|
|
'prefix': 'QENUM_TWO',
|
|
'data': [ 'value1', 'value2' ] }
|
|
|
|
# for testing nested structs
|
|
{ 'struct': 'UserDefOne',
|
|
'base': 'UserDefZero', # intentional forward reference
|
|
'data': { 'string': 'str',
|
|
'*enum1': 'EnumOne' } } # intentional forward reference
|
|
|
|
{ 'enum': 'EnumOne',
|
|
'data': [ 'value1', 'value2', 'value3', 'value4' ] }
|
|
|
|
{ 'struct': 'UserDefZero',
|
|
'data': { 'integer': 'int' } }
|
|
|
|
{ 'struct': 'UserDefTwoDictDict',
|
|
'data': { 'userdef': 'UserDefOne', 'string': 'str' } }
|
|
|
|
{ 'struct': 'UserDefTwoDict',
|
|
'data': { 'string1': 'str',
|
|
'dict2': 'UserDefTwoDictDict',
|
|
'*dict3': 'UserDefTwoDictDict' } }
|
|
|
|
{ 'struct': 'UserDefTwo',
|
|
'data': { 'string0': 'str',
|
|
'dict1': 'UserDefTwoDict' } }
|
|
|
|
{ 'struct': 'UserDefThree',
|
|
'data': { 'string0': 'str' } }
|
|
|
|
# dummy struct to force generation of array types not otherwise mentioned
|
|
{ 'struct': 'ForceArrays',
|
|
'data': { 'unused1':['UserDefOne'], 'unused2':['UserDefTwo'],
|
|
'unused3':['TestStruct'] } }
|
|
|
|
# for testing unions
|
|
# Among other things, test that a name collision between branches does
|
|
# not cause any problems (since only one branch can be in use at a time),
|
|
# by intentionally using two branches that both have a C member 'a_b'
|
|
{ 'struct': 'UserDefA',
|
|
'data': { 'boolean': 'bool', '*a_b': 'int' } }
|
|
|
|
{ 'struct': 'UserDefB',
|
|
'data': { 'intb': 'int', '*a-b': 'bool' } }
|
|
|
|
{ 'union': 'UserDefFlatUnion',
|
|
'base': 'UserDefUnionBase', # intentional forward reference
|
|
'discriminator': 'enum1',
|
|
'data': { 'value1' : {'type': 'UserDefA'},
|
|
'value2' : 'UserDefB',
|
|
'value3' : 'UserDefB'
|
|
# 'value4' defaults to empty
|
|
} }
|
|
|
|
{ 'struct': 'UserDefUnionBase',
|
|
'base': 'UserDefZero',
|
|
'data': { 'string': 'str', 'enum1': 'EnumOne' } }
|
|
|
|
# this variant of UserDefFlatUnion defaults to a union that uses members with
|
|
# allocated types to test corner cases in the cleanup/dealloc visitor
|
|
{ 'union': 'UserDefFlatUnion2',
|
|
'base': { '*integer': 'int', 'string': 'str', 'enum1': 'QEnumTwo' },
|
|
'discriminator': 'enum1',
|
|
'data': { 'value1' : 'UserDefC', # intentional forward reference
|
|
'value2' : 'UserDefB' } }
|
|
|
|
{ 'struct': 'WrapAlternate',
|
|
'data': { 'alt': 'UserDefAlternate' } }
|
|
{ 'alternate': 'UserDefAlternate',
|
|
'data': { 'udfu': {'type': 'UserDefFlatUnion'}, 'e': 'EnumOne', 'i': 'int',
|
|
'n': 'null' } }
|
|
|
|
{ 'struct': 'UserDefC',
|
|
'data': { 'string1': 'str', 'string2': 'str' } }
|
|
|
|
# for testing use of 'number' within alternates
|
|
{ 'alternate': 'AltEnumBool', 'data': { 'e': 'EnumOne', 'b': 'bool' } }
|
|
{ 'alternate': 'AltEnumNum', 'data': { 'e': 'EnumOne', 'n': 'number' } }
|
|
{ 'alternate': 'AltNumEnum', 'data': { 'n': 'number', 'e': 'EnumOne' } }
|
|
{ 'alternate': 'AltEnumInt', 'data': { 'e': 'EnumOne', 'i': 'int' } }
|
|
|
|
# for testing use of 'str' within alternates
|
|
{ 'alternate': 'AltStrObj', 'data': { 's': 'str', 'o': 'TestStruct' } }
|
|
|
|
# for testing lists
|
|
{ 'union': 'UserDefListUnion',
|
|
'data': { 'integer': ['int'],
|
|
's8': ['int8'],
|
|
's16': ['int16'],
|
|
's32': ['int32'],
|
|
's64': ['int64'],
|
|
'u8': ['uint8'],
|
|
'u16': ['uint16'],
|
|
'u32': ['uint32'],
|
|
'u64': ['uint64'],
|
|
'number': ['number'],
|
|
'boolean': ['bool'],
|
|
'string': ['str'],
|
|
'sizes': ['size'],
|
|
'any': ['any'],
|
|
'user': ['Status'] } } # intentional forward ref. to sub-module
|
|
|
|
# for testing sub-modules
|
|
{ 'include': 'include/sub-module.json' }
|
|
|
|
# testing commands
|
|
{ 'command': 'user_def_cmd', 'data': {} }
|
|
{ 'command': 'user_def_cmd1', 'data': {'ud1a': 'UserDefOne'} }
|
|
{ 'command': 'user_def_cmd2',
|
|
'data': {'ud1a': {'type': 'UserDefOne'}, '*ud1b': 'UserDefOne'},
|
|
'returns': 'UserDefTwo' }
|
|
|
|
{ 'command': 'cmd-success-response', 'data': {}, 'success-response': false }
|
|
|
|
# Returning a non-dictionary requires a name from the whitelist
|
|
{ 'command': 'guest-get-time', 'data': {'a': 'int', '*b': 'int' },
|
|
'returns': 'int' }
|
|
{ 'command': 'guest-sync', 'data': { 'arg': 'any' }, 'returns': 'any' }
|
|
{ 'command': 'boxed-struct', 'boxed': true, 'data': 'UserDefZero' }
|
|
{ 'command': 'boxed-union', 'data': 'UserDefListUnion', 'boxed': true }
|
|
{ 'command': 'boxed-empty', 'boxed': true, 'data': 'Empty1' }
|
|
|
|
# Smoke test on out-of-band and allow-preconfig-test
|
|
{ 'command': 'test-flags-command', 'allow-oob': true, 'allow-preconfig': true }
|
|
|
|
# For testing integer range flattening in opts-visitor. The following schema
|
|
# corresponds to the option format:
|
|
#
|
|
# -userdef i64=3-6,i64=-5--1,u64=2,u16=1,u16=7-12
|
|
#
|
|
# For simplicity, this example doesn't use [type=]discriminator nor optargs
|
|
# specific to discriminator values.
|
|
{ 'struct': 'UserDefOptions',
|
|
'data': {
|
|
'*i64' : [ 'int' ],
|
|
'*u64' : [ 'uint64' ],
|
|
'*u16' : [ 'uint16' ],
|
|
'*i64x': 'int' ,
|
|
'*u64x': 'uint64' } }
|
|
|
|
# testing event
|
|
{ 'struct': 'EventStructOne',
|
|
'data': { 'struct1': {'type': 'UserDefOne'}, 'string': 'str', '*enum2': 'EnumOne' } }
|
|
|
|
{ 'event': 'EVENT_A' }
|
|
{ 'event': 'EVENT_B',
|
|
'data': { } }
|
|
{ 'event': 'EVENT_C',
|
|
'data': { '*a': 'int', '*b': 'UserDefOne', 'c': 'str' } }
|
|
{ 'event': 'EVENT_D',
|
|
'data': { 'a' : 'EventStructOne', 'b' : 'str', '*c': 'str', '*enum3': 'EnumOne' } }
|
|
{ 'event': 'EVENT_E', 'boxed': true, 'data': 'UserDefZero' }
|
|
{ 'event': 'EVENT_F', 'boxed': true, 'data': 'UserDefFlatUnion' }
|
|
{ 'event': 'EVENT_G', 'boxed': true, 'data': 'Empty1' }
|
|
|
|
# test that we correctly compile downstream extensions, as well as munge
|
|
# ticklish names
|
|
# also test union and alternate with just one branch
|
|
{ 'enum': '__org.qemu_x-Enum', 'data': [ '__org.qemu_x-value' ] }
|
|
{ 'struct': '__org.qemu_x-Base',
|
|
'data': { '__org.qemu_x-member1': '__org.qemu_x-Enum' } }
|
|
{ 'struct': '__org.qemu_x-Struct', 'base': '__org.qemu_x-Base',
|
|
'data': { '__org.qemu_x-member2': 'str', '*wchar-t': 'int' } }
|
|
{ 'union': '__org.qemu_x-Union1', 'data': { '__org.qemu_x-branch': 'str' } }
|
|
{ 'alternate': '__org.qemu_x-Alt1', 'data': { '__org.qemu_x-branch': 'str' } }
|
|
{ 'struct': '__org.qemu_x-Struct2',
|
|
'data': { 'array': ['__org.qemu_x-Union1'] } }
|
|
{ 'union': '__org.qemu_x-Union2', 'base': '__org.qemu_x-Base',
|
|
'discriminator': '__org.qemu_x-member1',
|
|
'data': { '__org.qemu_x-value': '__org.qemu_x-Struct2' } }
|
|
{ 'alternate': '__org.qemu_x-Alt',
|
|
'data': { '__org.qemu_x-branch': '__org.qemu_x-Base' } }
|
|
{ 'event': '__ORG.QEMU_X-EVENT', 'data': '__org.qemu_x-Struct' }
|
|
{ 'command': '__org.qemu_x-command',
|
|
'data': { 'a': ['__org.qemu_x-Enum'], 'b': ['__org.qemu_x-Struct'],
|
|
'c': '__org.qemu_x-Union2', 'd': '__org.qemu_x-Alt' },
|
|
'returns': '__org.qemu_x-Union1' }
|
|
|
|
# test 'if' condition handling
|
|
|
|
{ 'struct': 'TestIfStruct', 'data':
|
|
{ 'foo': 'int',
|
|
'bar': { 'type': 'int', 'if': 'defined(TEST_IF_STRUCT_BAR)'} },
|
|
'if': 'defined(TEST_IF_STRUCT)' }
|
|
|
|
{ 'enum': 'TestIfEnum', 'data':
|
|
[ 'foo', { 'name' : 'bar', 'if': 'defined(TEST_IF_ENUM_BAR)' } ],
|
|
'if': 'defined(TEST_IF_ENUM)' }
|
|
|
|
{ 'union': 'TestIfUnion', 'data':
|
|
{ 'foo': 'TestStruct',
|
|
'union_bar': { 'type': 'str', 'if': 'defined(TEST_IF_UNION_BAR)'} },
|
|
'if': 'defined(TEST_IF_UNION) && defined(TEST_IF_STRUCT)' }
|
|
|
|
{ 'command': 'TestIfUnionCmd', 'data': { 'union_cmd_arg': 'TestIfUnion' },
|
|
'if': 'defined(TEST_IF_UNION)' }
|
|
|
|
{ 'alternate': 'TestIfAlternate', 'data':
|
|
{ 'foo': 'int',
|
|
'bar': { 'type': 'TestStruct', 'if': 'defined(TEST_IF_ALT_BAR)'} },
|
|
'if': 'defined(TEST_IF_ALT) && defined(TEST_IF_STRUCT)' }
|
|
|
|
{ 'command': 'TestIfAlternateCmd', 'data': { 'alt_cmd_arg': 'TestIfAlternate' },
|
|
'if': 'defined(TEST_IF_ALT)' }
|
|
|
|
{ 'command': 'TestIfCmd', 'data':
|
|
{ 'foo': 'TestIfStruct',
|
|
'bar': { 'type': 'TestIfEnum', 'if': 'defined(TEST_IF_CMD_BAR)' } },
|
|
'returns': 'UserDefThree',
|
|
'if': ['defined(TEST_IF_CMD)', 'defined(TEST_IF_STRUCT)'] }
|
|
|
|
{ 'command': 'TestCmdReturnDefThree', 'returns': 'UserDefThree' }
|
|
|
|
{ 'event': 'TestIfEvent', 'data':
|
|
{ 'foo': 'TestIfStruct',
|
|
'bar': { 'type': ['TestIfEnum'], 'if': 'defined(TEST_IF_EVT_BAR)' } },
|
|
'if': 'defined(TEST_IF_EVT) && defined(TEST_IF_STRUCT)' }
|
|
|
|
# test 'features'
|
|
|
|
{ 'struct': 'FeatureStruct0',
|
|
'data': { 'foo': 'int' },
|
|
'features': [] }
|
|
{ 'struct': 'FeatureStruct1',
|
|
'data': { 'foo': { 'type': 'int', 'features': [ 'deprecated' ] } },
|
|
'features': [ 'feature1' ] }
|
|
{ 'struct': 'FeatureStruct2',
|
|
'data': { 'foo': 'int' },
|
|
'features': [ { 'name': 'feature1' } ] }
|
|
{ 'struct': 'FeatureStruct3',
|
|
'data': { 'foo': 'int' },
|
|
'features': [ 'feature1', 'feature2' ] }
|
|
{ 'struct': 'FeatureStruct4',
|
|
'data': { 'namespace-test': 'int' },
|
|
'features': [ 'namespace-test', 'int', 'name', 'if' ] }
|
|
|
|
{ 'struct': 'CondFeatureStruct1',
|
|
'data': { 'foo': 'int' },
|
|
'features': [ { 'name': 'feature1', 'if': 'defined(TEST_IF_FEATURE_1)'} ] }
|
|
{ 'struct': 'CondFeatureStruct2',
|
|
'data': { 'foo': 'int' },
|
|
'features': [ { 'name': 'feature1', 'if': 'defined(TEST_IF_FEATURE_1)'},
|
|
{ 'name': 'feature2', 'if': 'defined(TEST_IF_FEATURE_2)'} ] }
|
|
{ 'struct': 'CondFeatureStruct3',
|
|
'data': { 'foo': 'int' },
|
|
'features': [ { 'name': 'feature1', 'if': [ 'defined(TEST_IF_COND_1)',
|
|
'defined(TEST_IF_COND_2)'] } ] }
|
|
|
|
{ 'enum': 'FeatureEnum1',
|
|
'data': [ 'eins', 'zwei', 'drei' ],
|
|
'features': [ 'feature1' ] }
|
|
|
|
{ 'union': 'FeatureUnion1',
|
|
'base': { 'tag': 'FeatureEnum1' },
|
|
'discriminator': 'tag',
|
|
'data': { 'eins': 'FeatureStruct1' },
|
|
'features': [ 'feature1' ] }
|
|
|
|
{ 'alternate': 'FeatureAlternate1',
|
|
'data': { 'eins': 'FeatureStruct1' },
|
|
'features': [ 'feature1' ] }
|
|
|
|
{ 'command': 'test-features0',
|
|
'data': { 'fs0': 'FeatureStruct0',
|
|
'fs1': 'FeatureStruct1',
|
|
'fs2': 'FeatureStruct2',
|
|
'fs3': 'FeatureStruct3',
|
|
'fs4': 'FeatureStruct4',
|
|
'cfs1': 'CondFeatureStruct1',
|
|
'cfs2': 'CondFeatureStruct2',
|
|
'cfs3': 'CondFeatureStruct3' },
|
|
'features': [] }
|
|
|
|
{ 'command': 'test-command-features1',
|
|
'features': [ 'deprecated' ] }
|
|
{ 'command': 'test-command-features3',
|
|
'features': [ 'feature1', 'feature2' ] }
|
|
|
|
{ 'command': 'test-command-cond-features1',
|
|
'features': [ { 'name': 'feature1', 'if': 'defined(TEST_IF_FEATURE_1)'} ] }
|
|
{ 'command': 'test-command-cond-features2',
|
|
'features': [ { 'name': 'feature1', 'if': 'defined(TEST_IF_FEATURE_1)'},
|
|
{ 'name': 'feature2', 'if': 'defined(TEST_IF_FEATURE_2)'} ] }
|
|
{ 'command': 'test-command-cond-features3',
|
|
'features': [ { 'name': 'feature1', 'if': [ 'defined(TEST_IF_COND_1)',
|
|
'defined(TEST_IF_COND_2)'] } ] }
|
|
|
|
{ 'event': 'TEST-EVENT-FEATURES1',
|
|
'features': [ 'deprecated' ] }
|