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