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