diff mbox series

[PATCH-for-10.1,3/6] qom: Test object_class_implements_type()

Message ID 20250320154722.27349-4-philmd@linaro.org
State New
Headers show
Series qom: Add object_class_implements_type() | expand

Commit Message

Philippe Mathieu-Daudé March 20, 2025, 3:47 p.m. UTC
Test TYPE_INDIRECT_IMPL (indirectly) implements
TYPE_TEST_IF (via TYPE_TEST_IF2A or TYPE_TEST_IF2B
interface).

Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
 tests/unit/check-qom-interface.c | 40 ++++++++++++++++++++++++++++++++
 1 file changed, 40 insertions(+)
diff mbox series

Patch

diff --git a/tests/unit/check-qom-interface.c b/tests/unit/check-qom-interface.c
index c99be97ed8b..c43a63e8b3c 100644
--- a/tests/unit/check-qom-interface.c
+++ b/tests/unit/check-qom-interface.c
@@ -36,6 +36,19 @@  static const TypeInfo test_if_info = {
     .class_size = sizeof(TestIfClass),
 };
 
+#define TYPE_TEST_IF2A "test-interface-level2a"
+#define TYPE_TEST_IF2B "test-interface-level2b"
+
+static const TypeInfo test_if2a_info = {
+    .name          = TYPE_TEST_IF2A,
+    .parent        = TYPE_TEST_IF,
+};
+
+static const TypeInfo test_if2b_info = {
+    .name          = TYPE_TEST_IF2B,
+    .parent        = TYPE_TEST_IF,
+};
+
 #define PATTERN 0xFAFBFCFD
 
 static void test_class_init(ObjectClass *oc, void *data)
@@ -58,6 +71,18 @@  static const TypeInfo direct_impl_info = {
     }
 };
 
+#define TYPE_INDIRECT_IMPL "indirect-impl"
+
+static const TypeInfo indirect_impl_info = {
+    .name = TYPE_INDIRECT_IMPL,
+    .parent = TYPE_DIRECT_IMPL,
+    .interfaces = (InterfaceInfo[]) {
+        { TYPE_TEST_IF2A },
+        { TYPE_TEST_IF2B },
+        { }
+    }
+};
+
 #define TYPE_INTERMEDIATE_IMPL "intermediate-impl"
 
 static const TypeInfo intermediate_impl_info = {
@@ -86,18 +111,33 @@  static void interface_intermediate_test(void)
     test_interface_impl(TYPE_INTERMEDIATE_IMPL);
 }
 
+static void interface_ambiguous_test(void)
+{
+    Object *obj = object_new(TYPE_INDIRECT_IMPL);
+    ObjectClass *klass = object_get_class(obj);
+
+    g_assert(object_class_implements_type(klass, TYPE_TEST_IF2A));
+    g_assert(object_class_implements_type(klass, TYPE_TEST_IF2B));
+    g_assert(object_class_implements_type(klass, TYPE_TEST_IF));
+    object_unref(obj);
+}
+
 int main(int argc, char **argv)
 {
     g_test_init(&argc, &argv, NULL);
 
     module_call_init(MODULE_INIT_QOM);
     type_register_static(&test_if_info);
+    type_register_static(&test_if2a_info);
+    type_register_static(&test_if2b_info);
     type_register_static(&direct_impl_info);
+    type_register_static(&indirect_impl_info);
     type_register_static(&intermediate_impl_info);
 
     g_test_add_func("/qom/interface/direct_impl", interface_direct_test);
     g_test_add_func("/qom/interface/intermediate_impl",
                     interface_intermediate_test);
+    g_test_add_func("/qom/interface/ambiguous_impl", interface_ambiguous_test);
 
     return g_test_run();
 }