From 24793bdf281a152360a605680b04223a775aa187 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Thu, 6 Aug 2020 19:45:24 +0200 Subject: [PATCH] qemumonitorjsontest: Add a last-resort warning if object-add/device_add are QAPIfied When netdev-add was qapified it took us by surprise and we had to scramble to fix the internals to format conformant monitor arguments. Add a last-resort early warning system if this happens to object-add or device_add. Hopefully qemu developers notify us sooner than this. Signed-off-by: Peter Krempa Reviewed-by: Daniel Henrique Barboza --- tests/qemumonitorjsontest.c | 53 +++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c index 77e70c1dc4..bc25958e70 100644 --- a/tests/qemumonitorjsontest.c +++ b/tests/qemumonitorjsontest.c @@ -2888,6 +2888,55 @@ testQAPISchemaValidate(const void *opaque) } +/** + * testQAPISchemaObjectDeviceAdd: + * + * Purpose of this test is to add a last-resort notification that 'object-add' + * and 'device_add' are not covered by the QMP schema by surprise. Ideally QEMU + * developers will notify us before they switch so we have time to adapt our + * generators first. This didn't work out when netdev-add was converted. + * + * We validate that the QMP schema describes only the expected types and nothing + * else assuming that no new field will be added until final conversion. + */ +static int +testQAPISchemaObjectDeviceAdd(const void *opaque) +{ + virHashTablePtr schema = (virHashTablePtr) opaque; + virJSONValuePtr entry; + + if (virQEMUQAPISchemaPathGet("device_add/arg-type", schema, &entry) < 0) { + fprintf(stderr, "schema for 'device_add' not found\n"); + return -1; + } + + if (testQEMUSchemaEntryMatchTemplate(entry, + "str:driver", + "str:bus", + "str:id", + NULL) < 0) { + VIR_TEST_VERBOSE("device_add has unexpected members in schema"); + return -1; + } + + if (virQEMUQAPISchemaPathGet("object-add/arg-type", schema, &entry) < 0) { + fprintf(stderr, "schema for 'objectadd' not found\n"); + return -1; + } + + if (testQEMUSchemaEntryMatchTemplate(entry, + "str:qom-type", + "str:id", + "any:props", + NULL) < 0) { + VIR_TEST_VERBOSE("object-add has unexpected members in schema"); + return -1; + } + + return 0; +} + + static void testQueryJobsPrintJob(virBufferPtr buf, qemuMonitorJobInfoPtr job) @@ -3380,6 +3429,10 @@ mymain(void) #undef DO_TEST_QAPI_VALIDATE + if (virTestRun("validate that object-add and device_add don't have schema", + testQAPISchemaObjectDeviceAdd, qapiData.schema) < 0) + ret = -1; + #define DO_TEST_QUERY_JOBS(name) \ do { \ struct testQueryJobsData data = { name, driver.xmlopt}; \