Skip to content

Commit

Permalink
qapi: Implement deprecated-output=hide for QMP event data
Browse files Browse the repository at this point in the history
This policy suppresses deprecated bits in output, and thus permits
"testing the future".  Implement it for QMP event data: suppress
deprecated members.

No QMP event data is deprecated right now.

Signed-off-by: Markus Armbruster <armbru@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Message-Id: <20210318155519.1224118-6-armbru@redhat.com>
  • Loading branch information
Markus Armbruster committed Mar 19, 2021
1 parent 278fc2f commit a291a38
Show file tree
Hide file tree
Showing 4 changed files with 32 additions and 3 deletions.
9 changes: 6 additions & 3 deletions scripts/qapi/events.py
Expand Up @@ -126,7 +126,7 @@ def gen_event_send(name: str,
if have_args:
assert arg_type is not None
ret += mcgen('''
v = qobject_output_visitor_new(&obj);
v = qobject_output_visitor_new_qmp(&obj);
''')
if not arg_type.is_implicit():
ret += mcgen('''
Expand All @@ -145,7 +145,11 @@ def gen_event_send(name: str,
ret += mcgen('''
visit_complete(v, &obj);
qdict_put_obj(qmp, "data", obj);
if (qdict_size(qobject_to(QDict, obj))) {
qdict_put_obj(qmp, "data", obj);
} else {
qobject_unref(obj);
}
''')

ret += mcgen('''
Expand Down Expand Up @@ -188,7 +192,6 @@ def _begin_user_module(self, name: str) -> None:
#include "qapi/compat-policy.h"
#include "qapi/error.h"
#include "qapi/qmp/qdict.h"
#include "qapi/qobject-output-visitor.h"
#include "qapi/qmp-event.h"
''',
Expand Down
3 changes: 3 additions & 0 deletions tests/qapi-schema/qapi-schema-test.json
Expand Up @@ -324,5 +324,8 @@
'features': [ { 'name': 'feature1', 'if': [ 'defined(TEST_IF_COND_1)',
'defined(TEST_IF_COND_2)'] } ] }

{ 'event': 'TEST-EVENT-FEATURES0',
'data': 'FeatureStruct1' }

{ 'event': 'TEST-EVENT-FEATURES1',
'features': [ 'deprecated' ] }
2 changes: 2 additions & 0 deletions tests/qapi-schema/qapi-schema-test.out
Expand Up @@ -440,6 +440,8 @@ command test-command-cond-features3 None -> None
gen=True success_response=True boxed=False oob=False preconfig=False
feature feature1
if ['defined(TEST_IF_COND_1)', 'defined(TEST_IF_COND_2)']
event TEST-EVENT-FEATURES0 FeatureStruct1
boxed=False
event TEST-EVENT-FEATURES1 None
boxed=False
feature deprecated
Expand Down
21 changes: 21 additions & 0 deletions tests/unit/test-qmp-event.c
Expand Up @@ -159,6 +159,26 @@ static void test_event_deprecated(TestEventData *data, const void *unused)
qobject_unref(data->expect);
}

static void test_event_deprecated_data(TestEventData *data, const void *unused)
{
memset(&compat_policy, 0, sizeof(compat_policy));

data->expect = qdict_from_jsonf_nofail("{ 'event': 'TEST-EVENT-FEATURES0',"
" 'data': { 'foo': 42 } }");
qapi_event_send_test_event_features0(42);
g_assert(data->emitted);

qobject_unref(data->expect);

compat_policy.has_deprecated_output = true;
compat_policy.deprecated_output = COMPAT_POLICY_OUTPUT_HIDE;
data->expect = qdict_from_jsonf_nofail("{ 'event': 'TEST-EVENT-FEATURES0' }");
qapi_event_send_test_event_features0(42);
g_assert(data->emitted);

qobject_unref(data->expect);
}

int main(int argc, char **argv)
{
g_test_init(&argc, &argv, NULL);
Expand All @@ -168,6 +188,7 @@ int main(int argc, char **argv)
event_test_add("/event/event_c", test_event_c);
event_test_add("/event/event_d", test_event_d);
event_test_add("/event/deprecated", test_event_deprecated);
event_test_add("/event/deprecated_data", test_event_deprecated_data);
g_test_run();

return 0;
Expand Down

0 comments on commit a291a38

Please sign in to comment.