diff options
author | Thomas Haller <thaller@redhat.com> | 2020-11-18 11:03:41 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2020-11-18 11:41:26 +0100 |
commit | 13fc9134fa32dfa6e41a8395661a5d99c9023cd1 (patch) | |
tree | 63ad4f0d4f5ab094fde40b33e9f726a6d2f6cb89 | |
parent | f40ec3344d6805d0804eeb69929e326e3a4a8f01 (diff) | |
download | NetworkManager-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.c | 91 |
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)); } |