Browse Source
Add basic regression testing for QOM Interface usage. Test checks casting to interface type/class for following cases: - interface implementation in leaf class - interface implementation in intermediate (parent) class Signed-off-by: Igor Mammedov <imammedo@redhat.com> Signed-off-by: Andreas Färber <afaerber@suse.de>pull/4/merge
committed by
Andreas Färber
2 changed files with 110 additions and 1 deletions
@ -0,0 +1,105 @@ |
|||
/*
|
|||
* QOM interface test. |
|||
* |
|||
* Copyright (C) 2013 Red Hat Inc. |
|||
* |
|||
* Authors: |
|||
* Igor Mammedov <imammedo@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_obj; |
|||
} TestIf; |
|||
|
|||
typedef struct TestIfClass { |
|||
InterfaceClass parent_class; |
|||
|
|||
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 *ioc = TEST_IF_GET_CLASS(iobj); |
|||
|
|||
g_assert(iobj); |
|||
g_assert(ioc->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("/qom/interface/direct_impl", interface_direct_test); |
|||
g_test_add_func("/qom/interface/intermediate_impl", |
|||
interface_intermediate_test); |
|||
|
|||
return g_test_run(); |
|||
} |
|||
Loading…
Reference in new issue