| /* |
| * QOM interface test. |
| * |
| * Copyright (C) 2013 Red Hat Inc. |
| * |
| * Authors: |
| * Igor Mammedov <imammedo@redhat.com> |
| * |
| * This work is licensed under the terms of the GNU LGPL, version 2.1 or later. |
| * See the COPYING.LIB file in the top-level directory. |
| */ |
| #include <glib.h> |
| |
| #include "qom/object.h" |
| #include "qemu/module.h" |
| |
| |
| #define TYPE_TEST_IF "test-interface" |
| #define TEST_IF_CLASS(klass) \ |
| OBJECT_CLASS_CHECK(TestIfClass, (klass), TYPE_TEST_IF) |
| #define TEST_IF_GET_CLASS(obj) \ |
| OBJECT_GET_CLASS(TestIfClass, (obj), TYPE_TEST_IF) |
| #define TEST_IF(obj) \ |
| INTERFACE_CHECK(TestIf, (obj), TYPE_TEST_IF) |
| |
| typedef struct TestIf { |
| Object parent_obj; |
| } TestIf; |
| |
| typedef struct TestIfClass { |
| InterfaceClass parent_class; |
| |
| uint32_t test; |
| } TestIfClass; |
| |
| static const TypeInfo test_if_info = { |
| .name = TYPE_TEST_IF, |
| .parent = TYPE_INTERFACE, |
| .class_size = sizeof(TestIfClass), |
| }; |
| |
| #define PATTERN 0xFAFBFCFD |
| |
| static void test_class_init(ObjectClass *oc, void *data) |
| { |
| TestIfClass *tc = TEST_IF_CLASS(oc); |
| |
| g_assert(tc); |
| tc->test = PATTERN; |
| } |
| |
| #define TYPE_DIRECT_IMPL "direct-impl" |
| |
| static const TypeInfo direct_impl_info = { |
| .name = TYPE_DIRECT_IMPL, |
| .parent = TYPE_OBJECT, |
| .class_init = test_class_init, |
| .interfaces = (InterfaceInfo[]) { |
| { TYPE_TEST_IF }, |
| { } |
| } |
| }; |
| |
| #define TYPE_INTERMEDIATE_IMPL "intermediate-impl" |
| |
| static const TypeInfo intermediate_impl_info = { |
| .name = TYPE_INTERMEDIATE_IMPL, |
| .parent = TYPE_DIRECT_IMPL, |
| }; |
| |
| static void test_interface_impl(const char *type) |
| { |
| Object *obj = object_new(type); |
| TestIf *iobj = TEST_IF(obj); |
| TestIfClass *ioc = TEST_IF_GET_CLASS(iobj); |
| |
| g_assert(iobj); |
| g_assert(ioc->test == PATTERN); |
| } |
| |
| static void interface_direct_test(void) |
| { |
| test_interface_impl(TYPE_DIRECT_IMPL); |
| } |
| |
| static void interface_intermediate_test(void) |
| { |
| test_interface_impl(TYPE_INTERMEDIATE_IMPL); |
| } |
| |
| 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(&direct_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); |
| |
| return g_test_run(); |
| } |