summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2020-11-18 11:03:41 +0100
committerThomas Haller <thaller@redhat.com>2020-11-18 11:41:26 +0100
commit13fc9134fa32dfa6e41a8395661a5d99c9023cd1 (patch)
tree63ad4f0d4f5ab094fde40b33e9f726a6d2f6cb89
parentf40ec3344d6805d0804eeb69929e326e3a4a8f01 (diff)
downloadNetworkManager-13fc9134fa32dfa6e41a8395661a5d99c9023cd1.tar.gz
libnm/tests: add unit test for more consistency check of NMObject type information
The type information of NMObject is entirely static. And there are certain conditions how this information should be. Add some more checks. We need priv_ptr_offset set if (and only if) we also have property_ao_info or property_o_info registered.
-rw-r--r--libnm/tests/test-libnm.c91
1 files changed, 77 insertions, 14 deletions
diff --git a/libnm/tests/test-libnm.c b/libnm/tests/test-libnm.c
index 06f0d5bd4f..27f0a7cc01 100644
--- a/libnm/tests/test-libnm.c
+++ b/libnm/tests/test-libnm.c
@@ -2848,22 +2848,85 @@ test_nml_dbus_meta(void)
if (klass) {
if (NM_IS_OBJECT_CLASS(klass)) {
- NMObjectClass * nm_object_class = NM_OBJECT_CLASS(klass);
- const _NMObjectClassFieldInfo *p_prev;
- const _NMObjectClassFieldInfo *p;
-
- p_prev = NULL;
- for (p = nm_object_class->property_o_info; p; p_prev = p, p = p->parent) {
- g_assert(p->num > 0);
- g_assert(NM_IS_OBJECT_CLASS(p->klass));
- g_assert(g_type_is_a(gtype, G_TYPE_FROM_CLASS(p->klass)));
- g_assert(p->klass->property_o_info == p);
- if (p_prev) {
- g_assert(g_type_is_a(G_TYPE_FROM_CLASS(p_prev->klass),
- G_TYPE_FROM_CLASS(p->klass)));
- g_assert(p_prev->klass != p->klass);
+ NMObjectClass *nm_object_class = NM_OBJECT_CLASS(klass);
+
+ if (nm_object_class->property_o_info || nm_object_class->property_ao_info) {
+ int ii;
+
+ for (ii = 0; ii < 2; ii++) {
+ const _NMObjectClassFieldInfo *p_prev = NULL;
+ const _NMObjectClassFieldInfo *p0 = ii == 0
+ ? nm_object_class->property_o_info
+ : nm_object_class->property_ao_info;
+ const _NMObjectClassFieldInfo *p;
+
+ for (p = p0; p; p = p->parent) {
+ GType parent_gtype;
+ NMObjectClass *parent_klass;
+
+ g_assert(p->num > 0);
+ g_assert(NM_IS_OBJECT_CLASS(p->klass));
+ g_assert(g_type_is_a(gtype, G_TYPE_FROM_CLASS(p->klass)));
+ if (ii == 0)
+ g_assert(p->klass->property_o_info == p);
+ else
+ g_assert(p->klass->property_ao_info == p);
+ g_assert_cmpint(p->klass->priv_ptr_offset, >, 0);
+ if (p_prev) {
+ g_assert(g_type_is_a(G_TYPE_FROM_CLASS(p_prev->klass),
+ G_TYPE_FROM_CLASS(p->klass)));
+ g_assert(p_prev->klass != p->klass);
+ g_assert_cmpint(p_prev->klass->priv_ptr_offset,
+ >,
+ p->klass->priv_ptr_offset);
+ g_assert_cmpint(p->klass->priv_ptr_indirect, ==, TRUE);
+ }
+
+ parent_gtype = g_type_parent(G_TYPE_FROM_CLASS(p->klass));
+ g_assert(g_type_is_a(parent_gtype, NM_TYPE_OBJECT));
+ parent_klass = g_type_class_peek(parent_gtype);
+ g_assert(NM_IS_OBJECT_CLASS(parent_klass));
+ if (parent_gtype == NM_TYPE_OBJECT) {
+ g_assert_cmpint(parent_klass->priv_ptr_offset, ==, 0);
+ g_assert_cmpint(parent_klass->priv_ptr_indirect, ==, FALSE);
+ g_assert(!p->parent);
+ } else {
+ if (parent_klass->priv_ptr_offset == 0) {
+ g_assert(!parent_klass->property_o_info);
+ g_assert(!parent_klass->property_ao_info);
+ g_assert_cmpint(parent_klass->priv_ptr_indirect, ==, FALSE);
+ g_assert(!p->parent);
+ } else if (p->klass->priv_ptr_offset
+ == parent_klass->priv_ptr_offset) {
+ g_assert(p->klass->property_o_info
+ == parent_klass->property_o_info);
+ g_assert(p->klass->property_ao_info
+ == parent_klass->property_ao_info);
+ g_assert(p->klass->priv_ptr_indirect
+ == parent_klass->priv_ptr_indirect);
+ } else {
+ g_assert_cmpint(parent_klass->priv_ptr_offset, >, 0);
+ g_assert_cmpint(parent_klass->priv_ptr_offset,
+ <,
+ p->klass->priv_ptr_offset);
+ g_assert_cmpint(parent_klass->priv_ptr_indirect, ==, TRUE);
+ g_assert(p->klass->property_o_info
+ != parent_klass->property_o_info
+ || p->klass->property_ao_info
+ != parent_klass->property_ao_info);
+ }
+ }
+
+ p_prev = p;
+ }
}
+
+ g_assert_cmpint(nm_object_class->priv_ptr_offset, >, 0);
+ } else {
+ g_assert_cmpint(nm_object_class->priv_ptr_offset, ==, 0);
+ g_assert_cmpint(nm_object_class->priv_ptr_indirect, ==, FALSE);
}
+
} else
g_assert(NM_IS_CLIENT_CLASS(klass));
}