| /* | 
 |  * 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(); | 
 | } |