xref: /qemu/tests/unit/check-qom-interface.c (revision 14389dbd0281e901176319f5868166c706485c5e)
1*14389dbdSIgor Mammedov /*
2*14389dbdSIgor Mammedov  * QOM interface test.
3*14389dbdSIgor Mammedov  *
4*14389dbdSIgor Mammedov  * Copyright (C) 2013 Red Hat Inc.
5*14389dbdSIgor Mammedov  *
6*14389dbdSIgor Mammedov  * Authors:
7*14389dbdSIgor Mammedov  *  Igor Mammedov <imammedo@redhat.com>
8*14389dbdSIgor Mammedov  *
9*14389dbdSIgor Mammedov  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
10*14389dbdSIgor Mammedov  * See the COPYING.LIB file in the top-level directory.
11*14389dbdSIgor Mammedov  */
12*14389dbdSIgor Mammedov #include <glib.h>
13*14389dbdSIgor Mammedov 
14*14389dbdSIgor Mammedov #include "qom/object.h"
15*14389dbdSIgor Mammedov #include "qemu/module.h"
16*14389dbdSIgor Mammedov 
17*14389dbdSIgor Mammedov 
18*14389dbdSIgor Mammedov #define TYPE_TEST_IF "test-interface"
19*14389dbdSIgor Mammedov #define TEST_IF_CLASS(klass) \
20*14389dbdSIgor Mammedov      OBJECT_CLASS_CHECK(TestIfClass, (klass), TYPE_TEST_IF)
21*14389dbdSIgor Mammedov #define TEST_IF_GET_CLASS(obj) \
22*14389dbdSIgor Mammedov      OBJECT_GET_CLASS(TestIfClass, (obj), TYPE_TEST_IF)
23*14389dbdSIgor Mammedov #define TEST_IF(obj) \
24*14389dbdSIgor Mammedov      INTERFACE_CHECK(TestIf, (obj), TYPE_TEST_IF)
25*14389dbdSIgor Mammedov 
26*14389dbdSIgor Mammedov typedef struct TestIf {
27*14389dbdSIgor Mammedov     Object parent_obj;
28*14389dbdSIgor Mammedov } TestIf;
29*14389dbdSIgor Mammedov 
30*14389dbdSIgor Mammedov typedef struct TestIfClass {
31*14389dbdSIgor Mammedov     InterfaceClass parent_class;
32*14389dbdSIgor Mammedov 
33*14389dbdSIgor Mammedov     uint32_t test;
34*14389dbdSIgor Mammedov } TestIfClass;
35*14389dbdSIgor Mammedov 
36*14389dbdSIgor Mammedov static const TypeInfo test_if_info = {
37*14389dbdSIgor Mammedov     .name          = TYPE_TEST_IF,
38*14389dbdSIgor Mammedov     .parent        = TYPE_INTERFACE,
39*14389dbdSIgor Mammedov     .class_size = sizeof(TestIfClass),
40*14389dbdSIgor Mammedov };
41*14389dbdSIgor Mammedov 
42*14389dbdSIgor Mammedov #define PATTERN 0xFAFBFCFD
43*14389dbdSIgor Mammedov 
44*14389dbdSIgor Mammedov static void test_class_init(ObjectClass *oc, void *data)
45*14389dbdSIgor Mammedov {
46*14389dbdSIgor Mammedov     TestIfClass *tc = TEST_IF_CLASS(oc);
47*14389dbdSIgor Mammedov 
48*14389dbdSIgor Mammedov     g_assert(tc);
49*14389dbdSIgor Mammedov     tc->test = PATTERN;
50*14389dbdSIgor Mammedov }
51*14389dbdSIgor Mammedov 
52*14389dbdSIgor Mammedov #define TYPE_DIRECT_IMPL "direct-impl"
53*14389dbdSIgor Mammedov 
54*14389dbdSIgor Mammedov static const TypeInfo direct_impl_info = {
55*14389dbdSIgor Mammedov     .name = TYPE_DIRECT_IMPL,
56*14389dbdSIgor Mammedov     .parent = TYPE_OBJECT,
57*14389dbdSIgor Mammedov     .class_init = test_class_init,
58*14389dbdSIgor Mammedov     .interfaces = (InterfaceInfo[]) {
59*14389dbdSIgor Mammedov         { TYPE_TEST_IF },
60*14389dbdSIgor Mammedov         { }
61*14389dbdSIgor Mammedov     }
62*14389dbdSIgor Mammedov };
63*14389dbdSIgor Mammedov 
64*14389dbdSIgor Mammedov #define TYPE_INTERMEDIATE_IMPL "intermediate-impl"
65*14389dbdSIgor Mammedov 
66*14389dbdSIgor Mammedov static const TypeInfo intermediate_impl_info = {
67*14389dbdSIgor Mammedov     .name = TYPE_INTERMEDIATE_IMPL,
68*14389dbdSIgor Mammedov     .parent = TYPE_DIRECT_IMPL,
69*14389dbdSIgor Mammedov };
70*14389dbdSIgor Mammedov 
71*14389dbdSIgor Mammedov static void test_interface_impl(const char *type)
72*14389dbdSIgor Mammedov {
73*14389dbdSIgor Mammedov     Object *obj = object_new(type);
74*14389dbdSIgor Mammedov     TestIf *iobj = TEST_IF(obj);
75*14389dbdSIgor Mammedov     TestIfClass *ioc = TEST_IF_GET_CLASS(iobj);
76*14389dbdSIgor Mammedov 
77*14389dbdSIgor Mammedov     g_assert(iobj);
78*14389dbdSIgor Mammedov     g_assert(ioc->test == PATTERN);
79*14389dbdSIgor Mammedov }
80*14389dbdSIgor Mammedov 
81*14389dbdSIgor Mammedov static void interface_direct_test(void)
82*14389dbdSIgor Mammedov {
83*14389dbdSIgor Mammedov     test_interface_impl(TYPE_DIRECT_IMPL);
84*14389dbdSIgor Mammedov }
85*14389dbdSIgor Mammedov 
86*14389dbdSIgor Mammedov static void interface_intermediate_test(void)
87*14389dbdSIgor Mammedov {
88*14389dbdSIgor Mammedov     test_interface_impl(TYPE_INTERMEDIATE_IMPL);
89*14389dbdSIgor Mammedov }
90*14389dbdSIgor Mammedov 
91*14389dbdSIgor Mammedov int main(int argc, char **argv)
92*14389dbdSIgor Mammedov {
93*14389dbdSIgor Mammedov     g_test_init(&argc, &argv, NULL);
94*14389dbdSIgor Mammedov 
95*14389dbdSIgor Mammedov     module_call_init(MODULE_INIT_QOM);
96*14389dbdSIgor Mammedov     type_register_static(&test_if_info);
97*14389dbdSIgor Mammedov     type_register_static(&direct_impl_info);
98*14389dbdSIgor Mammedov     type_register_static(&intermediate_impl_info);
99*14389dbdSIgor Mammedov 
100*14389dbdSIgor Mammedov     g_test_add_func("/qom/interface/direct_impl", interface_direct_test);
101*14389dbdSIgor Mammedov     g_test_add_func("/qom/interface/intermediate_impl",
102*14389dbdSIgor Mammedov                     interface_intermediate_test);
103*14389dbdSIgor Mammedov 
104*14389dbdSIgor Mammedov     return g_test_run();
105*14389dbdSIgor Mammedov }
106