On Fri, Dec 20, 2013 at 9:08 PM, Igor Mammedov <imamm...@redhat.com> wrote: > --- > tests/Makefile | 3 + > tests/check-qom-interface.c | 102 > +++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 105 insertions(+), 0 deletions(-) > create mode 100644 tests/check-qom-interface.c > > diff --git a/tests/Makefile b/tests/Makefile > index 379cdd9..dfb6cce 100644 > --- a/tests/Makefile > +++ b/tests/Makefile > @@ -52,6 +52,8 @@ check-unit-y += tests/test-int128$(EXESUF) > gcov-files-test-int128-y = > check-unit-y += tests/test-bitops$(EXESUF) > check-unit-y += tests/test-qdev-global-props$(EXESUF) > +check-unit-y = tests/check-qom-interface$(EXESUF) > +gcov-files-check-qdict-y = object/object.c > > check-block-$(CONFIG_POSIX) += tests/qemu-iotests-quick.sh > > @@ -205,6 +207,7 @@ tests/qom-test$(EXESUF): tests/qom-test.o > tests/blockdev-test$(EXESUF): tests/blockdev-test.o $(libqos-pc-obj-y) > tests/qdev-monitor-test$(EXESUF): tests/qdev-monitor-test.o > $(libqos-pc-obj-y) > tests/qemu-iotests/socket_scm_helper$(EXESUF): > tests/qemu-iotests/socket_scm_helper.o > +tests/check-qom-interface$(EXESUF): tests/check-qom-interface.o qom/object.o > qom/qom-qobject.o libqemuutil.a libqemustub.a > > # QTest rules > > diff --git a/tests/check-qom-interface.c b/tests/check-qom-interface.c > new file mode 100644 > index 0000000..6d59606 > --- /dev/null > +++ b/tests/check-qom-interface.c > @@ -0,0 +1,102 @@ > +/* > + * OQM interfacei test. > + * > + * Copyright (C) 2013 Red Hat Inc. > + * > + * Authors: > + * Igor Mammedov <imamm...@redhat.com> > + * > + * This work is licensed under the terms of the GNU LGPL, version 2.1 or > later. > + * See the COPYING.LIB file in the top-level directory. > + */ > +#include <glib.h> > + > +#include "qom/object.h" > +#include "qemu/module.h" > + > + > +#define TYPE_TEST_IF "test-interface" > +#define TEST_IF_CLASS(klass) \ > + OBJECT_CLASS_CHECK(TestIfClass, (klass), TYPE_TEST_IF) > +#define TEST_IF_GET_CLASS(obj) \ > + OBJECT_GET_CLASS(TestIfClass, (obj), TYPE_TEST_IF) > +#define TEST_IF(obj) \ > + INTERFACE_CHECK(TestIf, (obj), TYPE_TEST_IF) > + > +typedef struct TestIf { > + Object Parent;
parent_obj > +} TestIf; > + > +typedef struct TestIfClass { > + InterfaceClass parent; parent_class? Regards, Peter > + > + uint32_t test; > +} TestIfClass; > + > +static const TypeInfo test_if_info = { > + .name = TYPE_TEST_IF, > + .parent = TYPE_INTERFACE, > + .class_size = sizeof(TestIfClass), > +}; > + > +#define PATTERN 0xFAFBFCFD > +static void test_class_init(ObjectClass *oc, void *data) > +{ > + TestIfClass *tc = TEST_IF_CLASS(oc); > + > + g_assert(tc); > + tc->test = PATTERN; > +} > + > +#define TYPE_DIRECT_IMPL "direct-impl" > +static const TypeInfo direct_impl_info = { > + .name = TYPE_DIRECT_IMPL, > + .parent = TYPE_OBJECT, > + .class_init = test_class_init, > + .interfaces = (InterfaceInfo[]) { > + { TYPE_TEST_IF }, > + { } > + } > +}; > + > +#define TYPE_INTERMEDIATE_IMPL "intermediate-impl" > +static const TypeInfo intermediate_impl_info = { > + .name = TYPE_INTERMEDIATE_IMPL, > + .parent = TYPE_DIRECT_IMPL, > +}; > + > +static void test_interface_impl(const char *type) > +{ > + Object *obj = object_new(type); > + TestIf *iobj = TEST_IF(obj); > + TestIfClass *ico = TEST_IF_GET_CLASS(iobj); > + > + g_assert(iobj); > + g_assert(ico->test == PATTERN); > +} > + > +static void interface_direct_test(void) > +{ > + test_interface_impl(TYPE_DIRECT_IMPL); > +} > + > +static void interface_intermediate_test(void) > +{ > + test_interface_impl(TYPE_INTERMEDIATE_IMPL); > +} > + > +int main(int argc, char **argv) > +{ > + g_test_init(&argc, &argv, NULL); > + > + module_call_init(MODULE_INIT_QOM); > + type_register_static(&test_if_info); > + type_register_static(&direct_impl_info); > + type_register_static(&intermediate_impl_info); > + > + g_test_add_func("/interface/direct_impl", interface_direct_test); > + g_test_add_func("/interface/intermediate_impl", > + interface_intermediate_test); > + > + return g_test_run(); > +} > -- > 1.7.1 > >