From 13fc9134fa32dfa6e41a8395661a5d99c9023cd1 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Wed, 18 Nov 2020 11:03:41 +0100 Subject: [PATCH] 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. --- libnm/tests/test-libnm.c | 89 ++++++++++++++++++++++++++++++++++------ 1 file changed, 76 insertions(+), 13 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; + NMObjectClass *nm_object_class = NM_OBJECT_CLASS(klass); - 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); + 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)); }