user-creatable types will now be forbidden from registering instance properties, but check-qom-proplist reuse the same type for testing user_creatable_add_opts() and for testing class/instance property enumeration.
To address those conflicting requirements, add two subclasses of TYPE_DUMMY: one that's user-creatable and another one that has instance properties. Most test that set the "bv" property will use the new TYPE_DUMMY_WITH_INSTANCE_PROPS type, but test_dummy_createcmdl() will now TYPE_DUMMY_USER_CREATABLE. Signed-off-by: Eduardo Habkost <ehabk...@redhat.com> --- The patch [RFC] qom: Lock properties of all TYPE_USER_CREATABLE types will break check-qom-proplist, unless this patch is applied first. --- tests/check-qom-proplist.c | 59 +++++++++++++++++++++++++++----------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/tests/check-qom-proplist.c b/tests/check-qom-proplist.c index fba30c20b2..e9d0eec0c2 100644 --- a/tests/check-qom-proplist.c +++ b/tests/check-qom-proplist.c @@ -124,14 +124,6 @@ static char *dummy_get_sv(Object *obj, } -static void dummy_init(Object *obj) -{ - object_property_add_bool(obj, "bv", - dummy_get_bv, - dummy_set_bv); -} - - static void dummy_class_init(ObjectClass *cls, void *data) { object_class_property_add_str(cls, "sv", @@ -155,15 +147,48 @@ static void dummy_finalize(Object *obj) g_free(dobj->sv); } - static const TypeInfo dummy_info = { .name = TYPE_DUMMY, .parent = TYPE_OBJECT, .instance_size = sizeof(DummyObject), - .instance_init = dummy_init, .instance_finalize = dummy_finalize, .class_size = sizeof(DummyObjectClass), .class_init = dummy_class_init, +}; + +static void dummy_with_instance_props_init(Object *obj) +{ + object_property_add_bool(obj, "bv", + dummy_get_bv, + dummy_set_bv); +} + +/* Subclass of TYPE_DUMMY, but with a instance-level "bv" property */ +#define TYPE_DUMMY_WITH_INSTANCE_PROPS "qemu-dummy-with-intance-props" + +static const TypeInfo dummy_with_instance_props_info = { + .name = TYPE_DUMMY_WITH_INSTANCE_PROPS, + .parent = TYPE_DUMMY, + .instance_init = dummy_with_instance_props_init, +}; + +static void dummy_user_creatable_class_init(ObjectClass *cls, void *data) +{ + object_class_property_add_bool(cls, "bv", + dummy_get_bv, + dummy_set_bv); +} + +/* + * Subclass of TYPE_DUMMY, but user-creatable and with a class-level + * "bv" property + */ +#define TYPE_DUMMY_USER_CREATABLE "qemu-dummy-user-creatable" + +static const TypeInfo dummy_user_creatable_info = { + .name = TYPE_DUMMY_USER_CREATABLE, + .parent = TYPE_DUMMY, + .class_init = dummy_user_creatable_class_init, .interfaces = (InterfaceInfo[]) { { TYPE_USER_CREATABLE }, { } @@ -341,7 +366,7 @@ static void test_dummy_createv(void) Error *err = NULL; Object *parent = object_get_objects_root(); DummyObject *dobj = DUMMY_OBJECT( - object_new_with_props(TYPE_DUMMY, + object_new_with_props(TYPE_DUMMY_WITH_INSTANCE_PROPS, parent, "dummy0", &err, @@ -370,7 +395,7 @@ static Object *new_helper(Error **errp, Object *obj; va_start(vargs, parent); - obj = object_new_with_propv(TYPE_DUMMY, + obj = object_new_with_propv(TYPE_DUMMY_WITH_INSTANCE_PROPS, parent, "dummy0", errp, @@ -409,7 +434,7 @@ static void test_dummy_createcmdl(void) QemuOpts *opts; DummyObject *dobj; Error *err = NULL; - const char *params = TYPE_DUMMY \ + const char *params = TYPE_DUMMY_USER_CREATABLE \ ",id=dev0," \ "bv=yes,sv=Hiss hiss hiss,av=platypus"; @@ -449,7 +474,7 @@ static void test_dummy_badenum(void) Error *err = NULL; Object *parent = object_get_objects_root(); Object *dobj = - object_new_with_props(TYPE_DUMMY, + object_new_with_props(TYPE_DUMMY_WITH_INSTANCE_PROPS, parent, "dummy0", &err, @@ -541,7 +566,7 @@ static void test_dummy_iterator(void) "bv"}; /* instance property */ Object *parent = object_get_objects_root(); DummyObject *dobj = DUMMY_OBJECT( - object_new_with_props(TYPE_DUMMY, + object_new_with_props(TYPE_DUMMY_WITH_INSTANCE_PROPS, parent, "dummy0", &error_abort, @@ -560,7 +585,7 @@ static void test_dummy_class_iterator(void) { const char *expected[] = { "type", "av", "sv", "u8v" }; ObjectPropertyIterator iter; - ObjectClass *klass = object_class_by_name(TYPE_DUMMY); + ObjectClass *klass = object_class_by_name(TYPE_DUMMY_WITH_INSTANCE_PROPS); object_class_property_iter_init(&iter, klass); test_dummy_prop_iterator(&iter, expected, ARRAY_SIZE(expected)); @@ -626,6 +651,8 @@ int main(int argc, char **argv) module_call_init(MODULE_INIT_QOM); type_register_static(&dummy_info); + type_register_static(&dummy_with_instance_props_info); + type_register_static(&dummy_user_creatable_info); type_register_static(&dummy_dev_info); type_register_static(&dummy_bus_info); type_register_static(&dummy_backend_info); -- 2.26.2 -- Eduardo