summaryrefslogtreecommitdiff
path: root/src/platform/tests
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-06-21 10:53:34 +0200
committerThomas Haller <thaller@redhat.com>2017-06-26 11:48:27 +0200
commitcb85c36b204232870357844ab915a65b9e38ef4a (patch)
tree9f455f4784ac4987741971d010043fbb5f68625d /src/platform/tests
parentdcdfca3e1e0e42d397745e73ab5004328fc12f41 (diff)
downloadNetworkManager-th/dedup-multi.tar.gz
platform: use NMDedupMultiIndex for routes in NMPCacheth/dedup-multi
Rework platform object cache to use NMDedupMultiIndex. Already previously, NMPCache used NMMultiIndex and had thus O(1) for most operations. What is new is: - NMDedupMultiIndex preserves the order of the cached items. This is important to handle routes properly as kernel will replace the first matching route based on network/plen/metric properties. See related bug rh#1337855. Without tracking the order of routes as they are exposed by kernel, we cannot properly maintain the route cache. - All NMPObject instances are now treated immutable, refcounted and get de-duplicated via NMDedupMultiIndex. This allows to have a global NMDedupMultiIndex that can be shared with NMIP4Config and NMRouteManager. It also allows to share the objects themselves. Immutable objects are so much nicer. We can get rid of the update pre-hook callback, which was required previously because we would mutate the object inplace. Now, we can just update the cache, and compare obj_old and obj_new after the fact. - NMMultiIndex was treated as an internal of NMPCache. On the other hand, NMDedupMultiIndex exposes NMDedupMultiHeadEntry, which is basically an object that allows to iterate over all related objects. That means, we can now lookup objects in the cache and give the NMDedupMultiHeadEntry instance to the caller, which then can iterate the list on it's own -- without need for copying anything. Currently, at various places we still create copies of lookup results. That can be improved later. The ability to share NMPObject instances should enable us to significantly improve performance and scale with large number of routes.
Diffstat (limited to 'src/platform/tests')
-rw-r--r--src/platform/tests/test-nmp-object.c432
1 files changed, 222 insertions, 210 deletions
diff --git a/src/platform/tests/test-nmp-object.c b/src/platform/tests/test-nmp-object.c
index 300a0cb464..24e790c32c 100644
--- a/src/platform/tests/test-nmp-object.c
+++ b/src/platform/tests/test-nmp-object.c
@@ -103,150 +103,141 @@ _nmp_object_equal (const NMPObject *a, const NMPObject *b)
/*****************************************************************************/
static void
-_assert_cache_multi_lookup_contains (const NMPCache *cache, const NMPCacheId *cache_id, const NMPObject *obj, gboolean contains)
+_assert_cache_multi_lookup_contains (const NMPCache *cache, const NMDedupMultiHeadEntry *head_entry, const NMPObject *obj, gboolean contains)
{
- const NMPlatformObject *const *objects;
- guint i, len;
+ NMDedupMultiIter iter;
gboolean found;
+ guint i, len;
+ const NMPObject *o;
- g_assert (cache_id);
g_assert (NMP_OBJECT_IS_VALID (obj));
g_assert (nmp_cache_lookup_obj (cache, obj) == obj);
+ g_assert (!head_entry || (head_entry->len > 0 && c_list_length (&head_entry->lst_entries_head) == head_entry->len));
- objects = nmp_cache_lookup_multi (cache, cache_id, &len);
-
- g_assert ((len == 0 && !objects) || (len > 0 && objects && !objects[len]));
+ len = head_entry ? head_entry->len : 0;
found = FALSE;
- for (i = 0; i < len; i++) {
- NMPObject *o;
-
- g_assert (objects[i]);
- o = NMP_OBJECT_UP_CAST (objects[i]);
+ i = 0;
+ nmp_cache_iter_for_each (&iter,
+ head_entry,
+ &o) {
g_assert (NMP_OBJECT_IS_VALID (o));
-
if (obj == o) {
g_assert (!found);
found = TRUE;
}
+ i++;
}
+ g_assert (len == i);
g_assert (!!contains == found);
}
-/*****************************************************************************/
+static void
+_assert_cache_multi_lookup_contains_link (const NMPCache *cache,
+ gboolean visible_only,
+ const NMPObject *obj,
+ gboolean contains)
+{
+ const NMDedupMultiHeadEntry *head_entry;
+ NMPLookup lookup;
-typedef struct {
- NMPCache *cache;
- NMPCacheOpsType expected_ops_type;
- const NMPObject *obj_clone;
- NMPObject *new_clone;
- gboolean was_visible;
- gboolean called;
-} _NMPCacheUpdateData;
+ g_assert (cache);
+
+ nmp_lookup_init_link (&lookup, visible_only);
+ head_entry = nmp_cache_lookup (cache, &lookup);
+ _assert_cache_multi_lookup_contains (cache, head_entry, obj, contains);
+}
+
+/*****************************************************************************/
static void
-_nmp_cache_update_hook (NMPCache *cache, const NMPObject *old, const NMPObject *new, NMPCacheOpsType ops_type, gpointer user_data)
+ops_post_check (NMPCache *cache,
+ NMPCacheOpsType ops_type,
+ const NMPObject *obj_old,
+ const NMPObject *obj_new,
+ const NMPObject *obj_new_expected,
+ NMPCacheOpsType expected_ops_type)
{
- _NMPCacheUpdateData *data = user_data;
-
- g_assert (data);
- g_assert (!data->called);
- g_assert (data->cache == cache);
+ g_assert (cache);
- g_assert_cmpint (data->expected_ops_type, ==, ops_type);
+ g_assert_cmpint (expected_ops_type, ==, ops_type);
switch (ops_type) {
case NMP_CACHE_OPS_ADDED:
- g_assert (!old);
- g_assert (NMP_OBJECT_IS_VALID (new));
- g_assert (nmp_object_is_alive (new));
- g_assert (nmp_object_id_equal (data->obj_clone, new));
- g_assert (nmp_object_equal (data->obj_clone, new));
+ g_assert (!obj_old);
+ g_assert (NMP_OBJECT_IS_VALID (obj_new));
+ g_assert (nmp_object_is_alive (obj_new));
+ g_assert (nmp_object_id_equal (obj_new_expected, obj_new));
+ g_assert (nmp_object_equal (obj_new_expected, obj_new));
break;
case NMP_CACHE_OPS_UPDATED:
- g_assert (NMP_OBJECT_IS_VALID (old));
- g_assert (NMP_OBJECT_IS_VALID (new));
- g_assert (nmp_object_is_alive (old));
- g_assert (nmp_object_is_alive (new));
- g_assert (nmp_object_id_equal (data->obj_clone, new));
- g_assert (nmp_object_id_equal (data->obj_clone, old));
- g_assert (nmp_object_id_equal (old, new));
- g_assert (nmp_object_equal (data->obj_clone, new));
- g_assert (!nmp_object_equal (data->obj_clone, old));
- g_assert (!nmp_object_equal (old, new));
+ g_assert (obj_old != obj_new);
+ g_assert (NMP_OBJECT_IS_VALID (obj_old));
+ g_assert (NMP_OBJECT_IS_VALID (obj_new));
+ g_assert (nmp_object_is_alive (obj_old));
+ g_assert (nmp_object_is_alive (obj_new));
+ g_assert (nmp_object_id_equal (obj_new_expected, obj_new));
+ g_assert (nmp_object_id_equal (obj_new_expected, obj_old));
+ g_assert (nmp_object_id_equal (obj_old, obj_new));
+ g_assert (nmp_object_equal (obj_new_expected, obj_new));
+ g_assert (!nmp_object_equal (obj_new_expected, obj_old));
+ g_assert (!nmp_object_equal (obj_old, obj_new));
break;
case NMP_CACHE_OPS_REMOVED:
- g_assert (!new);
- g_assert (NMP_OBJECT_IS_VALID (old));
- g_assert (nmp_object_is_alive (old));
- g_assert (nmp_object_id_equal (data->obj_clone, old));
+ g_assert (!obj_new);
+ g_assert (NMP_OBJECT_IS_VALID (obj_old));
+ g_assert (nmp_object_is_alive (obj_old));
+ if (obj_new_expected)
+ g_assert (nmp_object_id_equal (obj_new_expected, obj_old));
+ break;
+ case NMP_CACHE_OPS_UNCHANGED:
+ g_assert (obj_old == obj_new);
+ if (obj_old) {
+ g_assert (NMP_OBJECT_IS_VALID (obj_old));
+ g_assert (nmp_object_is_alive (obj_old));
+ g_assert (nmp_object_equal (obj_old, obj_new));
+ g_assert (nmp_object_id_equal (obj_new_expected, obj_new));
+ } else
+ g_assert (!obj_new_expected);
break;
default:
g_assert_not_reached ();
}
-
- data->was_visible = old ? nmp_object_is_visible (old) : FALSE;
- data->new_clone = new ? nmp_object_clone (new, FALSE) : NULL;
- data->called = TRUE;
}
static void
-_nmp_cache_update_netlink (NMPCache *cache, NMPObject *obj, NMPObject **out_obj, gboolean *out_was_visible, NMPCacheOpsType expected_ops_type)
+_nmp_cache_update_netlink (NMPCache *cache, NMPObject *obj, const NMPObject **out_obj_old, const NMPObject **out_obj_new, NMPCacheOpsType expected_ops_type)
{
NMPCacheOpsType ops_type;
- NMPObject *obj2;
- gboolean was_visible;
- nm_auto_nmpobj NMPObject *obj_clone = nmp_object_clone (obj, FALSE);
- nm_auto_nmpobj NMPObject *new_clone = NULL;
+ const NMPObject *obj_prev;
const NMPObject *obj_old;
- _NMPCacheUpdateData data = {
- .cache = cache,
- .expected_ops_type = expected_ops_type,
- .obj_clone = obj_clone,
- };
-
- obj_old = nmp_cache_lookup_link (cache, obj->object.ifindex);
- if (obj_old && obj_old->_link.udev.device)
- obj_clone->_link.udev.device = udev_device_ref (obj_old->_link.udev.device);
- _nmp_object_fixup_link_udev_fields (obj_clone, nmp_cache_use_udev_get (cache));
+ const NMPObject *obj_new;
+ nm_auto_nmpobj NMPObject *obj_new_expected = NULL;
g_assert (cache);
g_assert (NMP_OBJECT_IS_VALID (obj));
- ops_type = nmp_cache_update_netlink (cache, obj, &obj2, &was_visible, _nmp_cache_update_hook, &data);
+ obj_prev = nmp_cache_lookup_link (cache, obj->object.ifindex);
+ obj_new_expected = nmp_object_clone (obj, FALSE);
+ if (obj_prev && obj_prev->_link.udev.device)
+ obj_new_expected->_link.udev.device = udev_device_ref (obj_prev->_link.udev.device);
+ _nmp_object_fixup_link_udev_fields (&obj_new_expected, NULL, nmp_cache_use_udev_get (cache));
- new_clone = data.new_clone;
+ ops_type = nmp_cache_update_netlink (cache, obj, &obj_old, &obj_new);
+ ops_post_check (cache, ops_type, obj_old, obj_new,
+ nmp_object_is_alive (obj_new_expected) ? obj_new_expected : NULL,
+ expected_ops_type);
- g_assert_cmpint (ops_type, ==, expected_ops_type);
-
- if (ops_type != NMP_CACHE_OPS_UNCHANGED) {
- g_assert (NMP_OBJECT_IS_VALID (obj2));
- g_assert (data.called);
- g_assert_cmpint (data.was_visible, ==, was_visible);
-
- if (ops_type == NMP_CACHE_OPS_REMOVED)
- g_assert (!data.new_clone);
- else {
- g_assert (data.new_clone);
- g_assert (nmp_object_equal (obj2, data.new_clone));
- }
- } else {
- g_assert (!data.called);
- g_assert (!obj2 || was_visible == nmp_object_is_visible (obj2));
- }
-
- g_assert (!obj2 || nmp_object_id_equal (obj, obj2));
- if (ops_type != NMP_CACHE_OPS_REMOVED && obj2)
- g_assert (nmp_object_equal (obj, obj2));
-
- if (out_obj)
- *out_obj = obj2;
+ if (out_obj_new)
+ *out_obj_new = obj_new;
+ else
+ nmp_object_unref (obj_new);
+ if (out_obj_old)
+ *out_obj_old = obj_old;
else
- nmp_object_unref (obj2);
- if (out_was_visible)
- *out_was_visible = was_visible;
+ nmp_object_unref (obj_old);
}
static const NMPlatformLink pl_link_2 = {
@@ -265,168 +256,189 @@ static void
test_cache_link (void)
{
NMPCache *cache;
- NMPObject *obj1, *obj2;
+ NMPObject *objm1;
+ const NMPObject *obj_old, *obj_new;
NMPObject objs1;
- gboolean was_visible;
- NMPCacheId cache_id_storage;
struct udev_device *udev_device_2 = g_list_nth_data (global.udev_devices, 0);
struct udev_device *udev_device_3 = g_list_nth_data (global.udev_devices, 0);
NMPCacheOpsType ops_type;
+ nm_auto_unref_dedup_multi_index NMDedupMultiIndex *multi_idx = NULL;
- cache = nmp_cache_new (nmtst_get_rand_int () % 2);
+ multi_idx = nm_dedup_multi_index_new ();
+
+ cache = nmp_cache_new (multi_idx, nmtst_get_rand_int () % 2);
/* if we have a link, and don't set is_in_netlink, adding it has no effect. */
- obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
- g_assert (NMP_OBJECT_UP_CAST (&obj1->object) == obj1);
- g_assert (!nmp_object_is_alive (obj1));
- _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, NMP_CACHE_OPS_UNCHANGED);
+ objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ g_assert (NMP_OBJECT_UP_CAST (&objm1->object) == objm1);
+ g_assert (!nmp_object_is_alive (objm1));
+ _nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, NMP_CACHE_OPS_UNCHANGED);
ASSERT_nmp_cache_is_consistent (cache);
- g_assert (!obj2);
- g_assert (!was_visible);
- g_assert (!nmp_cache_lookup_obj (cache, obj1));
+ g_assert (!obj_old);
+ g_assert (!obj_new);
+ g_assert (!nmp_cache_lookup_obj (cache, objm1));
g_assert (!nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)));
- nmp_object_unref (obj1);
+ nmp_object_unref (objm1);
/* Only when setting @is_in_netlink the link is added. */
- obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
- obj1->_link.netlink.is_in_netlink = TRUE;
- g_assert (nmp_object_is_alive (obj1));
- _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, NMP_CACHE_OPS_ADDED);
+ objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ objm1->_link.netlink.is_in_netlink = TRUE;
+ g_assert (nmp_object_is_alive (objm1));
+ _nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, NMP_CACHE_OPS_ADDED);
ASSERT_nmp_cache_is_consistent (cache);
- g_assert (nmp_object_equal (obj1, obj2));
- g_assert (!was_visible);
- g_assert (nmp_cache_lookup_obj (cache, obj1) == obj2);
- g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj2);
- g_assert (nmp_object_is_visible (obj2));
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, TRUE);
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
- nmp_object_unref (obj1);
- nmp_object_unref (obj2);
+ g_assert (!obj_old);
+ g_assert (obj_new);
+ g_assert (objm1 == obj_new);
+ g_assert (nmp_object_equal (objm1, obj_new));
+ g_assert (nmp_cache_lookup_obj (cache, objm1) == obj_new);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj_new);
+ g_assert (nmp_object_is_visible (obj_new));
+ _assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
+ _assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, TRUE);
+ nmp_object_unref (objm1);
+ nmp_object_unref (obj_new);
/* updating the same link with identical value, has no effect. */
- obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
- obj1->_link.netlink.is_in_netlink = TRUE;
- g_assert (nmp_object_is_alive (obj1));
- _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, NMP_CACHE_OPS_UNCHANGED);
+ objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ objm1->_link.netlink.is_in_netlink = TRUE;
+ g_assert (nmp_object_is_alive (objm1));
+ _nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, NMP_CACHE_OPS_UNCHANGED);
ASSERT_nmp_cache_is_consistent (cache);
- g_assert (obj2 != obj1);
- g_assert (nmp_object_equal (obj1, obj2));
- g_assert (was_visible);
- g_assert (nmp_cache_lookup_obj (cache, obj1) == obj2);
- g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj2);
- nmp_object_unref (obj1);
- nmp_object_unref (obj2);
+ g_assert (obj_old);
+ g_assert (obj_new);
+ g_assert (obj_new != objm1);
+ g_assert (nmp_object_equal (objm1, obj_new));
+ g_assert (nmp_cache_lookup_obj (cache, objm1) == obj_new);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj_new);
+ nmp_object_unref (objm1);
+ nmp_object_unref (obj_new);
+ nmp_object_unref (obj_new);
/* remove the link from netlink */
- obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
- g_assert (!nmp_object_is_alive (obj1));
- _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, NMP_CACHE_OPS_REMOVED);
+ objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ g_assert (!nmp_object_is_alive (objm1));
+ _nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, NMP_CACHE_OPS_REMOVED);
ASSERT_nmp_cache_is_consistent (cache);
- g_assert (obj2 != obj1);
- g_assert (was_visible);
- g_assert (!nmp_cache_lookup_obj (cache, obj1));
+ g_assert (obj_old);
+ g_assert (!obj_new);
+ g_assert (!nmp_cache_lookup_obj (cache, objm1));
g_assert (!nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)));
- nmp_object_unref (obj1);
- nmp_object_unref (obj2);
+ nmp_object_unref (objm1);
+ nmp_object_unref (obj_old);
+ nmp_object_unref (obj_new);
if (udev_device_2) {
/* now add the link only with aspect UDEV. */
- ops_type = nmp_cache_update_link_udev (cache, pl_link_2.ifindex, udev_device_2, &obj2, &was_visible, NULL, NULL);
+ ops_type = nmp_cache_update_link_udev (cache, pl_link_2.ifindex, udev_device_2, &obj_old, &obj_new);
ASSERT_nmp_cache_is_consistent (cache);
g_assert_cmpint (ops_type, ==, NMP_CACHE_OPS_ADDED);
- g_assert (!was_visible);
- g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj2);
- g_assert (!nmp_object_is_visible (obj2));
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, FALSE);
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
- nmp_object_unref (obj2);
+ g_assert (!obj_old);
+ g_assert (obj_new);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj_new);
+ g_assert (!nmp_object_is_visible (obj_new));
+ _assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, FALSE);
+ _assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
+ nmp_object_unref (obj_new);
}
/* add it in netlink too. */
- obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
- obj1->_link.netlink.is_in_netlink = TRUE;
- g_assert (nmp_object_is_alive (obj1));
- _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, udev_device_2 ? NMP_CACHE_OPS_UPDATED : NMP_CACHE_OPS_ADDED);
+ objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ objm1->_link.netlink.is_in_netlink = TRUE;
+ g_assert (nmp_object_is_alive (objm1));
+ _nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, udev_device_2 ? NMP_CACHE_OPS_UPDATED : NMP_CACHE_OPS_ADDED);
ASSERT_nmp_cache_is_consistent (cache);
- g_assert (nmp_object_equal (obj1, obj2));
- g_assert (!was_visible);
- g_assert (nmp_cache_lookup_obj (cache, obj1) == obj2);
- g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj2);
- g_assert (nmp_object_is_visible (obj2));
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, TRUE);
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
- nmp_object_unref (obj1);
- nmp_object_unref (obj2);
+ if (udev_device_2) {
+ g_assert (obj_old);
+ g_assert (!nmp_object_is_visible (obj_old));
+ } else
+ g_assert (!obj_old);
+ g_assert (nmp_object_equal (objm1, obj_new));
+ g_assert (nmp_cache_lookup_obj (cache, objm1) == obj_new);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj_new);
+ g_assert (nmp_object_is_visible (obj_new));
+ _assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, TRUE);
+ _assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
+ nmp_object_unref (objm1);
+ nmp_object_unref (obj_old);
+ nmp_object_unref (obj_new);
/* remove again from netlink. */
- obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
- obj1->_link.netlink.is_in_netlink = FALSE;
- g_assert (!nmp_object_is_alive (obj1));
- _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, udev_device_2 ? NMP_CACHE_OPS_UPDATED : NMP_CACHE_OPS_REMOVED);
+ objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
+ objm1->_link.netlink.is_in_netlink = FALSE;
+ g_assert (!nmp_object_is_alive (objm1));
+ _nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, udev_device_2 ? NMP_CACHE_OPS_UPDATED : NMP_CACHE_OPS_REMOVED);
ASSERT_nmp_cache_is_consistent (cache);
- g_assert (obj2 != obj1);
- g_assert (was_visible);
+ if (udev_device_2)
+ g_assert (obj_new == objm1);
+ else
+ g_assert (!obj_new);
+ g_assert (obj_old);
+ g_assert (nmp_object_is_alive (obj_old));
if (udev_device_2) {
- g_assert (nmp_cache_lookup_obj (cache, obj1) == obj2);
- g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj2);
- g_assert (!nmp_object_is_visible (obj2));
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, FALSE);
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
+ g_assert (nmp_cache_lookup_obj (cache, objm1) == obj_new);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj_new);
+ g_assert (!nmp_object_is_visible (obj_new));
+ _assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, FALSE);
+ _assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
} else {
- g_assert (nmp_cache_lookup_obj (cache, obj1) == NULL);
+ g_assert (nmp_cache_lookup_obj (cache, objm1) == NULL);
g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == NULL);
- g_assert (nmp_object_is_visible (obj2));
+ g_assert (nmp_object_is_visible (obj_new));
}
- nmp_object_unref (obj1);
- nmp_object_unref (obj2);
+ nmp_object_unref (objm1);
+ nmp_object_unref (obj_old);
+ nmp_object_unref (obj_new);
/* now another link only with aspect UDEV. */
if (udev_device_3) {
/* now add the link only with aspect UDEV. */
- ops_type = nmp_cache_update_link_udev (cache, pl_link_3.ifindex, udev_device_3, &obj2, &was_visible, NULL, NULL);
+ ops_type = nmp_cache_update_link_udev (cache, pl_link_3.ifindex, udev_device_3, &obj_old, &obj_new);
g_assert_cmpint (ops_type, ==, NMP_CACHE_OPS_ADDED);
ASSERT_nmp_cache_is_consistent (cache);
- g_assert (NMP_OBJECT_IS_VALID (obj2));
- g_assert (!was_visible);
- g_assert (!nmp_object_is_visible (obj2));
- g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj2);
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, FALSE);
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
- g_assert_cmpint (obj2->_link.netlink.is_in_netlink, ==, FALSE);
- g_assert_cmpint (obj2->link.initialized, ==, FALSE);
- nmp_object_unref (obj2);
+ g_assert (NMP_OBJECT_IS_VALID (obj_new));
+ g_assert (!obj_old);
+ g_assert (!nmp_object_is_visible (obj_new));
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj_new);
+ _assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, FALSE);
+ _assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
+ g_assert_cmpint (obj_new->_link.netlink.is_in_netlink, ==, FALSE);
+ g_assert_cmpint (obj_new->link.initialized, ==, FALSE);
+ nmp_object_unref (obj_new);
/* add it in netlink too. */
- obj1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_3);
- obj1->_link.netlink.is_in_netlink = TRUE;
- g_assert (nmp_object_is_alive (obj1));
- _nmp_cache_update_netlink (cache, obj1, &obj2, &was_visible, NMP_CACHE_OPS_UPDATED);
+ objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_3);
+ objm1->_link.netlink.is_in_netlink = TRUE;
+ g_assert (nmp_object_is_alive (objm1));
+ _nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, NMP_CACHE_OPS_UPDATED);
ASSERT_nmp_cache_is_consistent (cache);
- g_assert (obj2 != obj1);
- g_assert (nmp_object_equal (obj1, obj2));
- g_assert (!was_visible);
- g_assert (nmp_cache_lookup_obj (cache, obj1) == obj2);
- g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj2);
- g_assert (nmp_object_is_visible (obj2));
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, TRUE);
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
- g_assert_cmpint (obj2->_link.netlink.is_in_netlink, ==, TRUE);
- g_assert_cmpint (obj2->link.initialized, ==, TRUE);
- nmp_object_unref (obj1);
- nmp_object_unref (obj2);
+ g_assert (obj_old);
+ g_assert (obj_new == objm1);
+ g_assert (nmp_object_equal (objm1, obj_new));
+ g_assert (!obj_old || !nmp_object_is_visible (obj_old));
+ g_assert (nmp_cache_lookup_obj (cache, objm1) == obj_new);
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj_new);
+ g_assert (nmp_object_is_visible (obj_new));
+ _assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, TRUE);
+ _assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
+ g_assert_cmpint (obj_new->_link.netlink.is_in_netlink, ==, TRUE);
+ g_assert_cmpint (obj_new->link.initialized, ==, TRUE);
+ nmp_object_unref (objm1);
+ nmp_object_unref (obj_old);
+ nmp_object_unref (obj_new);
/* remove UDEV. */
- ops_type = nmp_cache_update_link_udev (cache, pl_link_3.ifindex, NULL, &obj2, &was_visible, NULL, NULL);
+ ops_type = nmp_cache_update_link_udev (cache, pl_link_3.ifindex, NULL, &obj_old, &obj_new);
g_assert_cmpint (ops_type, ==, NMP_CACHE_OPS_UPDATED);
ASSERT_nmp_cache_is_consistent (cache);
- g_assert (was_visible);
- g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj2);
- g_assert (nmp_object_is_visible (obj2));
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, TRUE), obj2, TRUE);
- _assert_cache_multi_lookup_contains (cache, nmp_cache_id_init_object_type (&cache_id_storage, NMP_OBJECT_TYPE_LINK, FALSE), obj2, TRUE);
- g_assert_cmpint (obj2->_link.netlink.is_in_netlink, ==, TRUE);
- g_assert_cmpint (obj2->link.initialized, ==, !nmp_cache_use_udev_get (cache));
- nmp_object_unref (obj2);
+ g_assert (obj_old && nmp_object_is_visible (obj_old));
+ g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj_new);
+ g_assert (nmp_object_is_visible (obj_new));
+ _assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, TRUE);
+ _assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
+ g_assert_cmpint (obj_new->_link.netlink.is_in_netlink, ==, TRUE);
+ g_assert_cmpint (obj_new->link.initialized, ==, !nmp_cache_use_udev_get (cache));
+ nmp_object_unref (obj_new);
+ nmp_object_unref (obj_old);
}
nmp_cache_free (cache);