xref: /qemu/tests/unit/check-qom-interface.c (revision aa1b35b975d83a1ee3b5d1a1ae200a59ca44f8d2)
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"
1914389dbdSIgor Mammedov #define TEST_IF_CLASS(klass) \
2014389dbdSIgor Mammedov      OBJECT_CLASS_CHECK(TestIfClass, (klass), TYPE_TEST_IF)
2114389dbdSIgor Mammedov #define TEST_IF_GET_CLASS(obj) \
2214389dbdSIgor Mammedov      OBJECT_GET_CLASS(TestIfClass, (obj), TYPE_TEST_IF)
2314389dbdSIgor Mammedov #define TEST_IF(obj) \
2414389dbdSIgor Mammedov      INTERFACE_CHECK(TestIf, (obj), TYPE_TEST_IF)
2514389dbdSIgor Mammedov 
26*aa1b35b9SMarc-André Lureau typedef struct TestIf TestIf;
2714389dbdSIgor Mammedov 
2814389dbdSIgor Mammedov typedef struct TestIfClass {
2914389dbdSIgor Mammedov     InterfaceClass parent_class;
3014389dbdSIgor Mammedov 
3114389dbdSIgor Mammedov     uint32_t test;
3214389dbdSIgor Mammedov } TestIfClass;
3314389dbdSIgor Mammedov 
3414389dbdSIgor Mammedov static const TypeInfo test_if_info = {
3514389dbdSIgor Mammedov     .name          = TYPE_TEST_IF,
3614389dbdSIgor Mammedov     .parent        = TYPE_INTERFACE,
3714389dbdSIgor Mammedov     .class_size = sizeof(TestIfClass),
3814389dbdSIgor Mammedov };
3914389dbdSIgor Mammedov 
4014389dbdSIgor Mammedov #define PATTERN 0xFAFBFCFD
4114389dbdSIgor Mammedov 
4214389dbdSIgor Mammedov static void test_class_init(ObjectClass *oc, void *data)
4314389dbdSIgor Mammedov {
4414389dbdSIgor Mammedov     TestIfClass *tc = TEST_IF_CLASS(oc);
4514389dbdSIgor Mammedov 
4614389dbdSIgor Mammedov     g_assert(tc);
4714389dbdSIgor Mammedov     tc->test = PATTERN;
4814389dbdSIgor Mammedov }
4914389dbdSIgor Mammedov 
5014389dbdSIgor Mammedov #define TYPE_DIRECT_IMPL "direct-impl"
5114389dbdSIgor Mammedov 
5214389dbdSIgor Mammedov static const TypeInfo direct_impl_info = {
5314389dbdSIgor Mammedov     .name = TYPE_DIRECT_IMPL,
5414389dbdSIgor Mammedov     .parent = TYPE_OBJECT,
5514389dbdSIgor Mammedov     .class_init = test_class_init,
5614389dbdSIgor Mammedov     .interfaces = (InterfaceInfo[]) {
5714389dbdSIgor Mammedov         { TYPE_TEST_IF },
5814389dbdSIgor Mammedov         { }
5914389dbdSIgor Mammedov     }
6014389dbdSIgor Mammedov };
6114389dbdSIgor Mammedov 
6214389dbdSIgor Mammedov #define TYPE_INTERMEDIATE_IMPL "intermediate-impl"
6314389dbdSIgor Mammedov 
6414389dbdSIgor Mammedov static const TypeInfo intermediate_impl_info = {
6514389dbdSIgor Mammedov     .name = TYPE_INTERMEDIATE_IMPL,
6614389dbdSIgor Mammedov     .parent = TYPE_DIRECT_IMPL,
6714389dbdSIgor Mammedov };
6814389dbdSIgor Mammedov 
6914389dbdSIgor Mammedov static void test_interface_impl(const char *type)
7014389dbdSIgor Mammedov {
7114389dbdSIgor Mammedov     Object *obj = object_new(type);
7214389dbdSIgor Mammedov     TestIf *iobj = TEST_IF(obj);
7314389dbdSIgor Mammedov     TestIfClass *ioc = TEST_IF_GET_CLASS(iobj);
7414389dbdSIgor Mammedov 
7514389dbdSIgor Mammedov     g_assert(iobj);
7614389dbdSIgor Mammedov     g_assert(ioc->test == PATTERN);
77265804b5SMarc-André Lureau     object_unref(obj);
7814389dbdSIgor Mammedov }
7914389dbdSIgor Mammedov 
8014389dbdSIgor Mammedov static void interface_direct_test(void)
8114389dbdSIgor Mammedov {
8214389dbdSIgor Mammedov     test_interface_impl(TYPE_DIRECT_IMPL);
8314389dbdSIgor Mammedov }
8414389dbdSIgor Mammedov 
8514389dbdSIgor Mammedov static void interface_intermediate_test(void)
8614389dbdSIgor Mammedov {
8714389dbdSIgor Mammedov     test_interface_impl(TYPE_INTERMEDIATE_IMPL);
8814389dbdSIgor Mammedov }
8914389dbdSIgor Mammedov 
9014389dbdSIgor Mammedov int main(int argc, char **argv)
9114389dbdSIgor Mammedov {
9214389dbdSIgor Mammedov     g_test_init(&argc, &argv, NULL);
9314389dbdSIgor Mammedov 
9414389dbdSIgor Mammedov     module_call_init(MODULE_INIT_QOM);
9514389dbdSIgor Mammedov     type_register_static(&test_if_info);
9614389dbdSIgor Mammedov     type_register_static(&direct_impl_info);
9714389dbdSIgor Mammedov     type_register_static(&intermediate_impl_info);
9814389dbdSIgor Mammedov 
9914389dbdSIgor Mammedov     g_test_add_func("/qom/interface/direct_impl", interface_direct_test);
10014389dbdSIgor Mammedov     g_test_add_func("/qom/interface/intermediate_impl",
10114389dbdSIgor Mammedov                     interface_intermediate_test);
10214389dbdSIgor Mammedov 
10314389dbdSIgor Mammedov     return g_test_run();
10414389dbdSIgor Mammedov }
105