xref: /qemu/tests/unit/check-qom-interface.c (revision 2cd09e47aa522dfc7bb206f13d6dccb68dd09887)
114389dbdSIgor Mammedov /*
214389dbdSIgor Mammedov  * QOM interface test.
314389dbdSIgor Mammedov  *
414389dbdSIgor Mammedov  * Copyright (C) 2013 Red Hat Inc.
514389dbdSIgor Mammedov  *
614389dbdSIgor Mammedov  * Authors:
714389dbdSIgor Mammedov  *  Igor Mammedov <imammedo@redhat.com>
814389dbdSIgor Mammedov  *
914389dbdSIgor Mammedov  * This work is licensed under the terms of the GNU LGPL, version 2.1 or later.
1014389dbdSIgor Mammedov  * See the COPYING.LIB file in the top-level directory.
1114389dbdSIgor Mammedov  */
12681c28a3SPeter Maydell #include "qemu/osdep.h"
1314389dbdSIgor Mammedov 
1414389dbdSIgor Mammedov #include "qom/object.h"
1514389dbdSIgor Mammedov #include "qemu/module.h"
1614389dbdSIgor Mammedov 
1714389dbdSIgor Mammedov 
1814389dbdSIgor Mammedov #define TYPE_TEST_IF "test-interface"
19db1015e9SEduardo Habkost typedef struct TestIfClass TestIfClass;
208110fa1dSEduardo Habkost DECLARE_CLASS_CHECKERS(TestIfClass, TEST_IF,
218110fa1dSEduardo Habkost                        TYPE_TEST_IF)
2214389dbdSIgor Mammedov #define TEST_IF(obj) \
2314389dbdSIgor Mammedov      INTERFACE_CHECK(TestIf, (obj), TYPE_TEST_IF)
2414389dbdSIgor Mammedov 
25aa1b35b9SMarc-André Lureau typedef struct TestIf TestIf;
2614389dbdSIgor Mammedov 
27db1015e9SEduardo Habkost struct TestIfClass {
2814389dbdSIgor Mammedov     InterfaceClass parent_class;
2914389dbdSIgor Mammedov 
3014389dbdSIgor Mammedov     uint32_t test;
31db1015e9SEduardo Habkost };
3214389dbdSIgor Mammedov 
3314389dbdSIgor Mammedov static const TypeInfo test_if_info = {
3414389dbdSIgor Mammedov     .name          = TYPE_TEST_IF,
3514389dbdSIgor Mammedov     .parent        = TYPE_INTERFACE,
3614389dbdSIgor Mammedov     .class_size = sizeof(TestIfClass),
3714389dbdSIgor Mammedov };
3814389dbdSIgor Mammedov 
3914389dbdSIgor Mammedov #define PATTERN 0xFAFBFCFD
4014389dbdSIgor Mammedov 
test_class_init(ObjectClass * oc,const void * data)4112d1a768SPhilippe Mathieu-Daudé static void test_class_init(ObjectClass *oc, const void *data)
4214389dbdSIgor Mammedov {
4314389dbdSIgor Mammedov     TestIfClass *tc = TEST_IF_CLASS(oc);
4414389dbdSIgor Mammedov 
4514389dbdSIgor Mammedov     g_assert(tc);
4614389dbdSIgor Mammedov     tc->test = PATTERN;
4714389dbdSIgor Mammedov }
4814389dbdSIgor Mammedov 
4914389dbdSIgor Mammedov #define TYPE_DIRECT_IMPL "direct-impl"
5014389dbdSIgor Mammedov 
5114389dbdSIgor Mammedov static const TypeInfo direct_impl_info = {
5214389dbdSIgor Mammedov     .name = TYPE_DIRECT_IMPL,
5314389dbdSIgor Mammedov     .parent = TYPE_OBJECT,
5414389dbdSIgor Mammedov     .class_init = test_class_init,
55*2cd09e47SPhilippe Mathieu-Daudé     .interfaces = (const InterfaceInfo[]) {
5614389dbdSIgor Mammedov         { TYPE_TEST_IF },
5714389dbdSIgor Mammedov         { }
5814389dbdSIgor Mammedov     }
5914389dbdSIgor Mammedov };
6014389dbdSIgor Mammedov 
6114389dbdSIgor Mammedov #define TYPE_INTERMEDIATE_IMPL "intermediate-impl"
6214389dbdSIgor Mammedov 
6314389dbdSIgor Mammedov static const TypeInfo intermediate_impl_info = {
6414389dbdSIgor Mammedov     .name = TYPE_INTERMEDIATE_IMPL,
6514389dbdSIgor Mammedov     .parent = TYPE_DIRECT_IMPL,
6614389dbdSIgor Mammedov };
6714389dbdSIgor Mammedov 
test_interface_impl(const char * type)6814389dbdSIgor Mammedov static void test_interface_impl(const char *type)
6914389dbdSIgor Mammedov {
7014389dbdSIgor Mammedov     Object *obj = object_new(type);
7114389dbdSIgor Mammedov     TestIf *iobj = TEST_IF(obj);
7214389dbdSIgor Mammedov     TestIfClass *ioc = TEST_IF_GET_CLASS(iobj);
7314389dbdSIgor Mammedov 
7414389dbdSIgor Mammedov     g_assert(iobj);
7514389dbdSIgor Mammedov     g_assert(ioc->test == PATTERN);
76265804b5SMarc-André Lureau     object_unref(obj);
7714389dbdSIgor Mammedov }
7814389dbdSIgor Mammedov 
interface_direct_test(void)7914389dbdSIgor Mammedov static void interface_direct_test(void)
8014389dbdSIgor Mammedov {
8114389dbdSIgor Mammedov     test_interface_impl(TYPE_DIRECT_IMPL);
8214389dbdSIgor Mammedov }
8314389dbdSIgor Mammedov 
interface_intermediate_test(void)8414389dbdSIgor Mammedov static void interface_intermediate_test(void)
8514389dbdSIgor Mammedov {
8614389dbdSIgor Mammedov     test_interface_impl(TYPE_INTERMEDIATE_IMPL);
8714389dbdSIgor Mammedov }
8814389dbdSIgor Mammedov 
main(int argc,char ** argv)8914389dbdSIgor Mammedov int main(int argc, char **argv)
9014389dbdSIgor Mammedov {
9114389dbdSIgor Mammedov     g_test_init(&argc, &argv, NULL);
9214389dbdSIgor Mammedov 
9314389dbdSIgor Mammedov     module_call_init(MODULE_INIT_QOM);
9414389dbdSIgor Mammedov     type_register_static(&test_if_info);
9514389dbdSIgor Mammedov     type_register_static(&direct_impl_info);
9614389dbdSIgor Mammedov     type_register_static(&intermediate_impl_info);
9714389dbdSIgor Mammedov 
9814389dbdSIgor Mammedov     g_test_add_func("/qom/interface/direct_impl", interface_direct_test);
9914389dbdSIgor Mammedov     g_test_add_func("/qom/interface/intermediate_impl",
10014389dbdSIgor Mammedov                     interface_intermediate_test);
10114389dbdSIgor Mammedov 
10214389dbdSIgor Mammedov     return g_test_run();
10314389dbdSIgor Mammedov }
104