Eric Blake <ebl...@redhat.com> writes: > On 3/17/20 6:54 AM, Markus Armbruster wrote: >> This policy suppresses deprecated bits in output, and thus permits >> "testing the future". Implement it for QMP command results. Example: >> when QEMU is run with -compat deprecated-output=hide, then >> >> {"execute": "query-cpus-fast"} >> >> yields >> >> {"return": [{"thread-id": 9805, "props": {"core-id": 0, "thread-id": 0, >> "socket-id": 0}, "qom-path": "/machine/unattached/device[0]", "cpu-index": >> 0, "target": "x86_64"}]} >> >> instead of >> >> {"return": [{"arch": "x86", "thread-id": 22436, "props": {"core-id": 0, >> "thread-id": 0, "socket-id": 0}, "qom-path": >> "/machine/unattached/device[0]", "cpu-index": 0, "target": "x86_64"}]} >> >> Note the suppression of deprecated member "arch". >> >> Signed-off-by: Markus Armbruster <arm...@redhat.com> >> --- > >> +++ b/tests/test-qmp-cmds.c >> @@ -1,4 +1,5 @@ >> #include "qemu/osdep.h" >> +#include "qapi/compat-policy.h" >> #include "qapi/qmp/qdict.h" >> #include "qapi/qmp/qjson.h" >> #include "qapi/qmp/qnum.h" >> @@ -45,12 +46,17 @@ void qmp_user_def_cmd1(UserDefOne * ud1, Error **errp) >> { >> } >> -void qmp_test_features0(FeatureStruct0 *fs0, FeatureStruct1 *fs1, >> - FeatureStruct2 *fs2, FeatureStruct3 *fs3, >> - FeatureStruct4 *fs4, CondFeatureStruct1 *cfs1, >> - CondFeatureStruct2 *cfs2, CondFeatureStruct3 *cfs3, >> - Error **errp) >> +FeatureStruct1 *qmp_test_features0(bool has_fs0, FeatureStruct0 *fs0, >> + bool has_fs1, FeatureStruct1 *fs1, >> + bool has_fs2, FeatureStruct2 *fs2, >> + bool has_fs3, FeatureStruct3 *fs3, >> + bool has_fs4, FeatureStruct4 *fs4, >> + bool has_cfs1, CondFeatureStruct1 *cfs1, >> + bool has_cfs2, CondFeatureStruct2 *cfs2, >> + bool has_cfs3, CondFeatureStruct3 *cfs3, >> + Error **errp) >> { >> + return g_new(FeatureStruct1, 1); > > Should this be using g_new0, rather than random contents?
Accident. It's not actually used. >> } >> void qmp_test_command_features1(Error **errp) >> @@ -271,6 +277,30 @@ static void test_dispatch_cmd_io(void) >> qobject_unref(ret3); >> } >> +static void test_dispatch_cmd_ret_deprecated(void) >> +{ >> + const char *cmd = "{ 'execute': 'test-features0' }"; >> + QDict *ret; >> + >> + memset(&compat_policy, 0, sizeof(compat_policy)); >> + >> + /* default accept */ >> + ret = qobject_to(QDict, do_qmp_dispatch(false, cmd)); >> + assert(ret && qdict_size(ret) == 1); >> + qobject_unref(ret); >> + >> + compat_policy.has_deprecated_output = true; >> + compat_policy.deprecated_output = COMPAT_POLICY_OUTPUT_ACCEPT; > > Of course, if we ever enable defaults in QAPI, we can get rid of > has_deprecated_output by recording proper defaults for bools. But > that's a different project ;) Yes. The has_FOO have been annoying me since forever. I just never get around to doing anything about it. >> + ret = qobject_to(QDict, do_qmp_dispatch(false, cmd)); >> + assert(ret && qdict_size(ret) == 1); >> + qobject_unref(ret); >> + >> + compat_policy.deprecated_output = COMPAT_POLICY_OUTPUT_HIDE; >> + ret = qobject_to(QDict, do_qmp_dispatch(false, cmd)); >> + assert(ret && qdict_size(ret) == 0); >> + qobject_unref(ret); >> +} >> + > > Otherwise, > Reviewed-by: Eric Blake <ebl...@redhat.com> Thanks!