Migrate the dummy object's string and enum properties from the legacy object_class_property_add_str/enum() helpers to the new QAPI-aware object_class_property_add_qapi/qapi_enum() registration.
Add test cases verifying that the qapi_type metadata is correctly populated on properties registered through the new API, and that it remains NULL for properties using the old-style registration. Signed-off-by: Marc-André Lureau <[email protected]> --- tests/unit/check-qom-proplist.c | 94 ++++++++++++++++++++++++++++++++++------- 1 file changed, 78 insertions(+), 16 deletions(-) diff --git a/tests/unit/check-qom-proplist.c b/tests/unit/check-qom-proplist.c index ee3c6fb32b1..7f10befe687 100644 --- a/tests/unit/check-qom-proplist.c +++ b/tests/unit/check-qom-proplist.c @@ -21,6 +21,7 @@ #include "qemu/osdep.h" #include "qapi/error.h" +#include "qapi/qapi-type-info.h" #include "qapi/qobject-input-visitor.h" #include "qobject/qdict.h" #include "qobject/qobject.h" @@ -108,22 +109,21 @@ static int dummy_get_av(Object *obj, } -static void dummy_set_sv(Object *obj, - const char *value, - Error **errp) +static void dummy_set_sv(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) { DummyObject *dobj = DUMMY_OBJECT(obj); - g_free(dobj->sv); - dobj->sv = g_strdup(value); + g_clear_pointer(&dobj->sv, g_free); + visit_type_str(v, name, &dobj->sv, errp); } -static char *dummy_get_sv(Object *obj, - Error **errp) +static void dummy_get_sv(Object *obj, Visitor *v, const char *name, + void *opaque, Error **errp) { DummyObject *dobj = DUMMY_OBJECT(obj); - return g_strdup(dobj->sv); + visit_type_str(v, name, &dobj->sv, errp); } @@ -135,16 +135,28 @@ static void dummy_init(Object *obj) } +static const QAPITypeInfo dummy_animal_qapi_type_info = { + .name = "DummyAnimal", + .schema_name = "DummyAnimalSchema", + .lookup = &dummy_animal_map, +}; + +static const QAPITypeInfo dummy_str_qapi_type_info = { + .name = "str", + .schema_name = "StrSchema", +}; + static void dummy_class_init(ObjectClass *cls, const void *data) { - object_class_property_add_str(cls, "sv", - dummy_get_sv, - dummy_set_sv); - object_class_property_add_enum(cls, "av", - "DummyAnimal", - &dummy_animal_map, - dummy_get_av, - dummy_set_av); + object_class_property_add_qapi(cls, "sv", &dummy_str_qapi_type_info, + dummy_get_sv, dummy_set_sv, + NULL, NULL); + object_class_property_add_qapi_enum(cls, QAPI_ENUM_PROP( + .name = "av", + .qapi_type = &dummy_animal_qapi_type_info, + .get = dummy_get_av, + .set = dummy_set_av, + )); } @@ -648,6 +660,54 @@ static void test_qom_partial_path(void) object_unparent(cont1); } +static void test_dummy_qapi_enum(void) +{ + ObjectProperty *prop; + Object *parent = object_get_objects_root(); + DummyObject *dobj = DUMMY_OBJECT( + object_new_with_props(TYPE_DUMMY, + parent, + "dummy0", + &error_abort, + "av", "platypus", + NULL)); + + g_assert(dobj->av == DUMMY_PLATYPUS); + + prop = object_property_find(OBJECT(dobj), "av"); + g_assert(prop); + g_assert(prop->qapi_type == &dummy_animal_qapi_type_info); + g_assert_cmpstr(prop->qapi_type->name, ==, "DummyAnimal"); + g_assert_cmpstr(prop->qapi_type->schema_name, ==, "DummyAnimalSchema"); + g_assert(prop->qapi_type->lookup == &dummy_animal_map); + + object_unparent(OBJECT(dobj)); +} + +static void test_dummy_qapi_prop(void) +{ + ObjectProperty *prop; + Object *parent = object_get_objects_root(); + DummyObject *dobj = DUMMY_OBJECT( + object_new_with_props(TYPE_DUMMY, + parent, + "dummy0", + &error_abort, + "sv", "hello", + NULL)); + + g_assert_cmpstr(dobj->sv, ==, "hello"); + + prop = object_property_find(OBJECT(dobj), "sv"); + g_assert(prop); + g_assert(prop->qapi_type == &dummy_str_qapi_type_info); + g_assert_cmpstr(prop->qapi_type->name, ==, "str"); + g_assert_cmpstr(prop->qapi_type->schema_name, ==, "StrSchema"); + g_assert(prop->qapi_type->lookup == NULL); + + object_unparent(OBJECT(dobj)); +} + int main(int argc, char **argv) { g_test_init(&argc, &argv, NULL); @@ -666,6 +726,8 @@ int main(int argc, char **argv) g_test_add_func("/qom/proplist/iterator", test_dummy_iterator); g_test_add_func("/qom/proplist/class_iterator", test_dummy_class_iterator); g_test_add_func("/qom/proplist/delchild", test_dummy_delchild); + g_test_add_func("/qom/proplist/qapi_enum", test_dummy_qapi_enum); + g_test_add_func("/qom/proplist/qapi_prop", test_dummy_qapi_prop); g_test_add_func("/qom/resolve/partial", test_qom_partial_path); return g_test_run(); -- 2.54.0
