Blame src/platform/tests/test-nmp-object.c

Packit Service b23acc
// SPDX-License-Identifier: GPL-2.0+
Packit Service b23acc
/*
Packit Service b23acc
 * Copyright (C) 2015 - 2017 Red Hat, Inc.
Packit Service b23acc
 */
Packit Service b23acc
Packit Service b23acc
#include "nm-default.h"
Packit Service b23acc
Packit Service b23acc
#include <libudev.h>
Packit Service b23acc
#include <linux/pkt_sched.h>
Packit Service b23acc
Packit Service b23acc
#include "platform/nmp-object.h"
Packit Service b23acc
#include "nm-udev-aux/nm-udev-utils.h"
Packit Service b23acc
Packit Service b23acc
#include "nm-test-utils-core.h"
Packit Service b23acc
Packit Service b23acc
struct {
Packit Service b23acc
	GList *udev_devices;
Packit Service b23acc
} global;
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
test_obj_base (void)
Packit Service b23acc
{
Packit Service b23acc
	static const union {
Packit Service b23acc
		GObject g;
Packit Service b23acc
		NMPObject k;
Packit Service b23acc
	} x = { };
Packit Service b23acc
	static const union {
Packit Service b23acc
		GTypeClass k;
Packit Service b23acc
		NMPClass c;
Packit Service b23acc
	} l = { };
Packit Service b23acc
	static const GObject *g = &x.;;
Packit Service b23acc
	static const GTypeClass *k = &l.;;
Packit Service b23acc
	static const NMPObject *o = &x.;;
Packit Service b23acc
	static const NMPClass *c = &l.;;
Packit Service b23acc
Packit Service b23acc
	NMObjBaseInst *obj;
Packit Service b23acc
	gs_unref_object GCancellable *obj_cancellable = g_cancellable_new ();
Packit Service b23acc
	nm_auto_nmpobj NMPObject *obj_link = nmp_object_new_link (10);
Packit Service b23acc
Packit Service b23acc
	g_assert (&g->g_type_instance              == (void *) &o->_class);
Packit Service b23acc
	g_assert (&g->g_type_instance.g_class      == (void *) &o->_class);
Packit Service b23acc
Packit Service b23acc
	g_assert (sizeof (o->parent.parent)        == sizeof (GTypeInstance));
Packit Service b23acc
Packit Service b23acc
	g_assert (&c->parent                       == (void *) c);
Packit Service b23acc
	g_assert (&c->parent.parent.g_type_class   == (void *) c);
Packit Service b23acc
	g_assert (&c->parent.parent.g_type         == (void *) c);
Packit Service b23acc
	g_assert (&c->parent.parent.g_type         == &k->g_type);
Packit Service b23acc
Packit Service b23acc
	g_assert (sizeof (c->parent.parent)        == sizeof (GTypeClass));
Packit Service b23acc
Packit Service b23acc
	g_assert (&o->parent                       == (void *) o);
Packit Service b23acc
	g_assert (&o->parent.klass                 == (void *) &o->_class);
Packit Service b23acc
Packit Service b23acc
	obj = (NMObjBaseInst *) obj_cancellable;
Packit Service b23acc
	g_assert (!NMP_CLASS_IS_VALID ((NMPClass *) obj->klass));
Packit Service b23acc
	g_assert (G_TYPE_CHECK_INSTANCE_TYPE (obj, G_TYPE_CANCELLABLE));
Packit Service b23acc
Packit Service b23acc
	obj = (NMObjBaseInst *) obj_link;
Packit Service b23acc
	g_assert (NMP_CLASS_IS_VALID ((NMPClass *) obj->klass));
Packit Service b23acc
	g_assert (!G_TYPE_CHECK_INSTANCE_TYPE (obj, G_TYPE_CANCELLABLE));
Packit Service b23acc
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
static gboolean
Packit Service b23acc
_nmp_object_id_equal (const NMPObject *a, const NMPObject *b)
Packit Service b23acc
{
Packit Service b23acc
	gboolean a_b = nmp_object_id_equal (a, b);
Packit Service b23acc
Packit Service b23acc
	g_assert (NM_IN_SET (a_b, FALSE, TRUE) && a_b == nmp_object_id_equal (b, a));
Packit Service b23acc
	return a_b;
Packit Service b23acc
}
Packit Service b23acc
#define nmp_object_id_equal _nmp_object_id_equal
Packit Service b23acc
Packit Service b23acc
static gboolean
Packit Service b23acc
_nmp_object_equal (const NMPObject *a, const NMPObject *b)
Packit Service b23acc
{
Packit Service b23acc
	gboolean a_b = nmp_object_equal (a, b);
Packit Service b23acc
Packit Service b23acc
	g_assert (NM_IN_SET (a_b, FALSE, TRUE) && a_b == nmp_object_equal (b, a));
Packit Service b23acc
	return a_b;
Packit Service b23acc
}
Packit Service b23acc
#define nmp_object_equal _nmp_object_equal
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
_assert_cache_multi_lookup_contains (const NMPCache *cache, const NMDedupMultiHeadEntry *head_entry, const NMPObject *obj, gboolean visible_only, gboolean contains)
Packit Service b23acc
{
Packit Service b23acc
	NMDedupMultiIter iter;
Packit Service b23acc
	gboolean found;
Packit Service b23acc
	guint i, len;
Packit Service b23acc
	const NMPObject *o;
Packit Service b23acc
Packit Service b23acc
	g_assert (NMP_OBJECT_IS_VALID (obj));
Packit Service b23acc
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj) == obj);
Packit Service b23acc
	g_assert (!head_entry || (head_entry->len > 0 && c_list_length (&head_entry->lst_entries_head) == head_entry->len));
Packit Service b23acc
Packit Service b23acc
	len = head_entry ? head_entry->len : 0;
Packit Service b23acc
Packit Service b23acc
	found = FALSE;
Packit Service b23acc
	i = 0;
Packit Service b23acc
	nmp_cache_iter_for_each (&iter,
Packit Service b23acc
	                         head_entry,
Packit Service b23acc
	                         &o) {
Packit Service b23acc
		g_assert (NMP_OBJECT_IS_VALID (o));
Packit Service b23acc
		if (obj == o) {
Packit Service b23acc
			if (   !visible_only
Packit Service b23acc
			    || nmp_object_is_visible (o)) {
Packit Service b23acc
				g_assert (!found);
Packit Service b23acc
				found = TRUE;
Packit Service b23acc
			}
Packit Service b23acc
		}
Packit Service b23acc
		i++;
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	g_assert (len == i);
Packit Service b23acc
	g_assert (!!contains == found);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
_assert_cache_multi_lookup_contains_link (const NMPCache *cache,
Packit Service b23acc
                                          gboolean visible_only,
Packit Service b23acc
                                          const NMPObject *obj,
Packit Service b23acc
                                          gboolean contains)
Packit Service b23acc
{
Packit Service b23acc
	const NMDedupMultiHeadEntry *head_entry;
Packit Service b23acc
	NMPLookup lookup;
Packit Service b23acc
Packit Service b23acc
	g_assert (cache);
Packit Service b23acc
Packit Service b23acc
	nmp_lookup_init_obj_type (&lookup, NMP_OBJECT_TYPE_LINK);
Packit Service b23acc
	head_entry = nmp_cache_lookup (cache, &lookup);
Packit Service b23acc
	_assert_cache_multi_lookup_contains (cache, head_entry, obj, visible_only, contains);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
ops_post_check (NMPCache *cache,
Packit Service b23acc
                NMPCacheOpsType ops_type,
Packit Service b23acc
                const NMPObject *obj_old,
Packit Service b23acc
                const NMPObject *obj_new,
Packit Service b23acc
                const NMPObject *obj_new_expected,
Packit Service b23acc
                NMPCacheOpsType expected_ops_type)
Packit Service b23acc
{
Packit Service b23acc
	g_assert (cache);
Packit Service b23acc
Packit Service b23acc
	g_assert_cmpint (expected_ops_type, ==, ops_type);
Packit Service b23acc
Packit Service b23acc
	switch (ops_type) {
Packit Service b23acc
	case NMP_CACHE_OPS_ADDED:
Packit Service b23acc
		g_assert (!obj_old);
Packit Service b23acc
		g_assert (NMP_OBJECT_IS_VALID (obj_new));
Packit Service b23acc
		g_assert (nmp_object_is_alive (obj_new));
Packit Service b23acc
		g_assert (nmp_object_id_equal (obj_new_expected, obj_new));
Packit Service b23acc
		g_assert (nmp_object_equal (obj_new_expected, obj_new));
Packit Service b23acc
		break;
Packit Service b23acc
	case NMP_CACHE_OPS_UPDATED:
Packit Service b23acc
		g_assert (obj_old != obj_new);
Packit Service b23acc
		g_assert (NMP_OBJECT_IS_VALID (obj_old));
Packit Service b23acc
		g_assert (NMP_OBJECT_IS_VALID (obj_new));
Packit Service b23acc
		g_assert (nmp_object_is_alive (obj_old));
Packit Service b23acc
		g_assert (nmp_object_is_alive (obj_new));
Packit Service b23acc
		g_assert (nmp_object_id_equal (obj_new_expected, obj_new));
Packit Service b23acc
		g_assert (nmp_object_id_equal (obj_new_expected, obj_old));
Packit Service b23acc
		g_assert (nmp_object_id_equal (obj_old, obj_new));
Packit Service b23acc
		g_assert (nmp_object_equal (obj_new_expected, obj_new));
Packit Service b23acc
		g_assert (!nmp_object_equal (obj_new_expected, obj_old));
Packit Service b23acc
		g_assert (!nmp_object_equal (obj_old, obj_new));
Packit Service b23acc
		break;
Packit Service b23acc
	case NMP_CACHE_OPS_REMOVED:
Packit Service b23acc
		g_assert (!obj_new);
Packit Service b23acc
		g_assert (NMP_OBJECT_IS_VALID (obj_old));
Packit Service b23acc
		g_assert (nmp_object_is_alive (obj_old));
Packit Service b23acc
		if (obj_new_expected)
Packit Service b23acc
			g_assert (nmp_object_id_equal (obj_new_expected, obj_old));
Packit Service b23acc
		break;
Packit Service b23acc
	case NMP_CACHE_OPS_UNCHANGED:
Packit Service b23acc
		g_assert (obj_old == obj_new);
Packit Service b23acc
		if (obj_old) {
Packit Service b23acc
			g_assert (NMP_OBJECT_IS_VALID (obj_old));
Packit Service b23acc
			g_assert (nmp_object_is_alive (obj_old));
Packit Service b23acc
			g_assert (nmp_object_equal (obj_old, obj_new));
Packit Service b23acc
			g_assert (nmp_object_id_equal (obj_new_expected, obj_new));
Packit Service b23acc
		} else
Packit Service b23acc
			g_assert (!obj_new_expected);
Packit Service b23acc
		break;
Packit Service b23acc
	default:
Packit Service b23acc
		g_assert_not_reached ();
Packit Service b23acc
	}
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
_nmp_cache_update_netlink (NMPCache *cache, NMPObject *obj, const NMPObject **out_obj_old, const NMPObject **out_obj_new, NMPCacheOpsType expected_ops_type)
Packit Service b23acc
{
Packit Service b23acc
	NMPCacheOpsType ops_type;
Packit Service b23acc
	const NMPObject *obj_prev;
Packit Service b23acc
	const NMPObject *obj_old;
Packit Service b23acc
	const NMPObject *obj_new;
Packit Service b23acc
	nm_auto_nmpobj NMPObject *obj_new_expected = NULL;
Packit Service b23acc
Packit Service b23acc
	g_assert (cache);
Packit Service b23acc
	g_assert (NMP_OBJECT_IS_VALID (obj));
Packit Service b23acc
Packit Service b23acc
	obj_prev = nmp_cache_lookup_link (cache, NMP_OBJECT_CAST_LINK (obj)->ifindex);
Packit Service b23acc
	obj_new_expected = nmp_object_clone (obj, FALSE);
Packit Service b23acc
	if (obj_prev && obj_prev->_link.udev.device)
Packit Service b23acc
		obj_new_expected->_link.udev.device = udev_device_ref (obj_prev->_link.udev.device);
Packit Service b23acc
	_nmp_object_fixup_link_udev_fields (&obj_new_expected, NULL, nmp_cache_use_udev_get (cache));
Packit Service b23acc
Packit Service b23acc
	ops_type = nmp_cache_update_netlink (cache, obj, FALSE, &obj_old, &obj_new);
Packit Service b23acc
	ops_post_check (cache, ops_type, obj_old, obj_new,
Packit Service b23acc
	                nmp_object_is_alive (obj_new_expected) ? obj_new_expected : NULL,
Packit Service b23acc
	                expected_ops_type);
Packit Service b23acc
Packit Service b23acc
	if (out_obj_new)
Packit Service b23acc
		*out_obj_new = obj_new;
Packit Service b23acc
	else
Packit Service b23acc
		nmp_object_unref (obj_new);
Packit Service b23acc
	if (out_obj_old)
Packit Service b23acc
		*out_obj_old = obj_old;
Packit Service b23acc
	else
Packit Service b23acc
		nmp_object_unref (obj_old);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
static const NMPlatformLink pl_link_2 = {
Packit Service b23acc
	.ifindex = 2,
Packit Service b23acc
	.name = "eth0",
Packit Service b23acc
	.type = NM_LINK_TYPE_ETHERNET,
Packit Service b23acc
};
Packit Service b23acc
Packit Service b23acc
static const NMPlatformLink pl_link_3 = {
Packit Service b23acc
	.ifindex = 3,
Packit Service b23acc
	.name = "wlan0",
Packit Service b23acc
	.type = NM_LINK_TYPE_WIFI,
Packit Service b23acc
};
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
test_cache_link (void)
Packit Service b23acc
{
Packit Service b23acc
	NMPCache *cache;
Packit Service b23acc
	NMPObject *objm1;
Packit Service b23acc
	const NMPObject *obj_old, *obj_new;
Packit Service b23acc
	NMPObject objs1;
Packit Service b23acc
	struct udev_device *udev_device_2 = g_list_nth_data (global.udev_devices, 0);
Packit Service b23acc
	struct udev_device *udev_device_3 = g_list_nth_data (global.udev_devices, 0);
Packit Service b23acc
	NMPCacheOpsType ops_type;
Packit Service b23acc
	nm_auto_unref_dedup_multi_index NMDedupMultiIndex *multi_idx = NULL;
Packit Service b23acc
	gboolean use_udev = nmtst_get_rand_uint32 () % 2;
Packit Service b23acc
Packit Service b23acc
	multi_idx = nm_dedup_multi_index_new ();
Packit Service b23acc
Packit Service b23acc
	cache = nmp_cache_new (multi_idx, use_udev);
Packit Service b23acc
Packit Service b23acc
	/* if we have a link, and don't set is_in_netlink, adding it has no effect. */
Packit Service b23acc
	objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
Packit Service b23acc
	g_assert (NMP_OBJECT_UP_CAST (&objm1->object) == objm1);
Packit Service b23acc
	g_assert (!nmp_object_is_alive (objm1));
Packit Service b23acc
	_nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, NMP_CACHE_OPS_UNCHANGED);
Packit Service b23acc
	ASSERT_nmp_cache_is_consistent (cache);
Packit Service b23acc
	g_assert (!obj_old);
Packit Service b23acc
	g_assert (!obj_new);
Packit Service b23acc
	g_assert (!nmp_cache_lookup_obj (cache, objm1));
Packit Service b23acc
	g_assert (!nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)));
Packit Service b23acc
	nmp_object_unref (objm1);
Packit Service b23acc
Packit Service b23acc
	/* Only when setting @is_in_netlink the link is added. */
Packit Service b23acc
	objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
Packit Service b23acc
	objm1->_link.netlink.is_in_netlink = TRUE;
Packit Service b23acc
	g_assert (nmp_object_is_alive (objm1));
Packit Service b23acc
	_nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, NMP_CACHE_OPS_ADDED);
Packit Service b23acc
	ASSERT_nmp_cache_is_consistent (cache);
Packit Service b23acc
	g_assert (!obj_old);
Packit Service b23acc
	g_assert (obj_new);
Packit Service b23acc
	g_assert (objm1 == obj_new);
Packit Service b23acc
	g_assert (nmp_object_equal (objm1, obj_new));
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, objm1) == obj_new);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj_new);
Packit Service b23acc
	g_assert (nmp_object_is_visible (obj_new));
Packit Service b23acc
	_assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
Packit Service b23acc
	_assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, TRUE);
Packit Service b23acc
	nmp_object_unref (objm1);
Packit Service b23acc
	nmp_object_unref (obj_new);
Packit Service b23acc
Packit Service b23acc
	/* updating the same link with identical value, has no effect. */
Packit Service b23acc
	objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
Packit Service b23acc
	objm1->_link.netlink.is_in_netlink = TRUE;
Packit Service b23acc
	g_assert (nmp_object_is_alive (objm1));
Packit Service b23acc
	_nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, NMP_CACHE_OPS_UNCHANGED);
Packit Service b23acc
	ASSERT_nmp_cache_is_consistent (cache);
Packit Service b23acc
	g_assert (obj_old);
Packit Service b23acc
	g_assert (obj_new);
Packit Service b23acc
	g_assert (obj_new != objm1);
Packit Service b23acc
	g_assert (nmp_object_equal (objm1, obj_new));
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, objm1) == obj_new);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj_new);
Packit Service b23acc
	nmp_object_unref (objm1);
Packit Service b23acc
	nmp_object_unref (obj_new);
Packit Service b23acc
	nmp_object_unref (obj_new);
Packit Service b23acc
Packit Service b23acc
	/* remove the link from netlink */
Packit Service b23acc
	objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
Packit Service b23acc
	g_assert (!nmp_object_is_alive (objm1));
Packit Service b23acc
	_nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, NMP_CACHE_OPS_REMOVED);
Packit Service b23acc
	ASSERT_nmp_cache_is_consistent (cache);
Packit Service b23acc
	g_assert (obj_old);
Packit Service b23acc
	g_assert (!obj_new);
Packit Service b23acc
	g_assert (!nmp_cache_lookup_obj (cache, objm1));
Packit Service b23acc
	g_assert (!nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)));
Packit Service b23acc
	nmp_object_unref (objm1);
Packit Service b23acc
	nmp_object_unref (obj_old);
Packit Service b23acc
	nmp_object_unref (obj_new);
Packit Service b23acc
Packit Service b23acc
	if (udev_device_2) {
Packit Service b23acc
		/* now add the link only with aspect UDEV. */
Packit Service b23acc
		ops_type = nmp_cache_update_link_udev (cache, pl_link_2.ifindex, udev_device_2, &obj_old, &obj_new);
Packit Service b23acc
		ASSERT_nmp_cache_is_consistent (cache);
Packit Service b23acc
		g_assert_cmpint (ops_type, ==, NMP_CACHE_OPS_ADDED);
Packit Service b23acc
		g_assert (!obj_old);
Packit Service b23acc
		g_assert (obj_new);
Packit Service b23acc
		g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj_new);
Packit Service b23acc
		g_assert (!nmp_object_is_visible (obj_new));
Packit Service b23acc
		_assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, FALSE);
Packit Service b23acc
		_assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
Packit Service b23acc
		nmp_object_unref (obj_new);
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	/* add it in netlink too. */
Packit Service b23acc
	objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
Packit Service b23acc
	objm1->_link.netlink.is_in_netlink = TRUE;
Packit Service b23acc
	g_assert (nmp_object_is_alive (objm1));
Packit Service b23acc
	_nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, udev_device_2 ? NMP_CACHE_OPS_UPDATED : NMP_CACHE_OPS_ADDED);
Packit Service b23acc
	ASSERT_nmp_cache_is_consistent (cache);
Packit Service b23acc
	if (udev_device_2) {
Packit Service b23acc
		g_assert (obj_old);
Packit Service b23acc
		g_assert (!nmp_object_is_visible (obj_old));
Packit Service b23acc
	} else
Packit Service b23acc
		g_assert (!obj_old);
Packit Service b23acc
	g_assert (nmp_object_equal (objm1, obj_new));
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, objm1) == obj_new);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj_new);
Packit Service b23acc
	g_assert (nmp_object_is_visible (obj_new));
Packit Service b23acc
	_assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, TRUE);
Packit Service b23acc
	_assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
Packit Service b23acc
	nmp_object_unref (objm1);
Packit Service b23acc
	nmp_object_unref (obj_old);
Packit Service b23acc
	nmp_object_unref (obj_new);
Packit Service b23acc
Packit Service b23acc
	/* remove again from netlink. */
Packit Service b23acc
	objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_2);
Packit Service b23acc
	objm1->_link.netlink.is_in_netlink = FALSE;
Packit Service b23acc
	g_assert (!nmp_object_is_alive (objm1));
Packit Service b23acc
	_nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, udev_device_2 ? NMP_CACHE_OPS_UPDATED : NMP_CACHE_OPS_REMOVED);
Packit Service b23acc
	ASSERT_nmp_cache_is_consistent (cache);
Packit Service b23acc
	if (udev_device_2)
Packit Service b23acc
		g_assert (obj_new == objm1);
Packit Service b23acc
	else
Packit Service b23acc
		g_assert (!obj_new);
Packit Service b23acc
	g_assert (obj_old);
Packit Service b23acc
	g_assert (nmp_object_is_alive (obj_old));
Packit Service b23acc
	if (udev_device_2) {
Packit Service b23acc
		g_assert (nmp_cache_lookup_obj (cache, objm1) == obj_new);
Packit Service b23acc
		g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == obj_new);
Packit Service b23acc
		g_assert (!nmp_object_is_visible (obj_new));
Packit Service b23acc
		_assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, FALSE);
Packit Service b23acc
		_assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
Packit Service b23acc
	} else {
Packit Service b23acc
		g_assert (nmp_cache_lookup_obj (cache, objm1) == NULL);
Packit Service b23acc
		g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_2.ifindex)) == NULL);
Packit Service b23acc
		g_assert (!nmp_object_is_alive (obj_new));
Packit Service b23acc
		g_assert (!nmp_object_is_visible (obj_new));
Packit Service b23acc
	}
Packit Service b23acc
	nmp_object_unref (objm1);
Packit Service b23acc
	nmp_object_unref (obj_old);
Packit Service b23acc
	nmp_object_unref (obj_new);
Packit Service b23acc
Packit Service b23acc
	/* now another link only with aspect UDEV. */
Packit Service b23acc
	if (udev_device_3) {
Packit Service b23acc
		/* now add the link only with aspect UDEV. */
Packit Service b23acc
		ops_type = nmp_cache_update_link_udev (cache, pl_link_3.ifindex, udev_device_3, &obj_old, &obj_new);
Packit Service b23acc
		g_assert_cmpint (ops_type, ==, NMP_CACHE_OPS_ADDED);
Packit Service b23acc
		ASSERT_nmp_cache_is_consistent (cache);
Packit Service b23acc
		g_assert (NMP_OBJECT_IS_VALID (obj_new));
Packit Service b23acc
		g_assert (!obj_old);
Packit Service b23acc
		g_assert (!nmp_object_is_visible (obj_new));
Packit Service b23acc
		g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj_new);
Packit Service b23acc
		_assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, FALSE);
Packit Service b23acc
		_assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
Packit Service b23acc
		g_assert_cmpint (obj_new->_link.netlink.is_in_netlink, ==, FALSE);
Packit Service b23acc
		g_assert_cmpint (obj_new->link.initialized, ==, FALSE);
Packit Service b23acc
		nmp_object_unref (obj_new);
Packit Service b23acc
Packit Service b23acc
		/* add it in netlink too. */
Packit Service b23acc
		objm1 = nmp_object_new (NMP_OBJECT_TYPE_LINK, (NMPlatformObject *) &pl_link_3);
Packit Service b23acc
		objm1->_link.netlink.is_in_netlink = TRUE;
Packit Service b23acc
		g_assert (nmp_object_is_alive (objm1));
Packit Service b23acc
		_nmp_cache_update_netlink (cache, objm1, &obj_old, &obj_new, NMP_CACHE_OPS_UPDATED);
Packit Service b23acc
		ASSERT_nmp_cache_is_consistent (cache);
Packit Service b23acc
		g_assert (obj_old);
Packit Service b23acc
		g_assert (obj_new == objm1);
Packit Service b23acc
		g_assert (nmp_object_equal (objm1, obj_new));
Packit Service b23acc
		g_assert (!obj_old || !nmp_object_is_visible (obj_old));
Packit Service b23acc
		g_assert (nmp_cache_lookup_obj (cache, objm1) == obj_new);
Packit Service b23acc
		g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj_new);
Packit Service b23acc
		g_assert (nmp_object_is_visible (obj_new));
Packit Service b23acc
		_assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, TRUE);
Packit Service b23acc
		_assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
Packit Service b23acc
		g_assert_cmpint (obj_new->_link.netlink.is_in_netlink, ==, TRUE);
Packit Service b23acc
		g_assert_cmpint (obj_new->link.initialized, ==, TRUE);
Packit Service b23acc
		nmp_object_unref (objm1);
Packit Service b23acc
		nmp_object_unref (obj_old);
Packit Service b23acc
		nmp_object_unref (obj_new);
Packit Service b23acc
Packit Service b23acc
		/* remove UDEV. */
Packit Service b23acc
		ops_type = nmp_cache_update_link_udev (cache, pl_link_3.ifindex, NULL, &obj_old, &obj_new);
Packit Service b23acc
		g_assert_cmpint (ops_type, ==, NMP_CACHE_OPS_UPDATED);
Packit Service b23acc
		ASSERT_nmp_cache_is_consistent (cache);
Packit Service b23acc
		g_assert (obj_old && nmp_object_is_visible (obj_old));
Packit Service b23acc
		g_assert (nmp_cache_lookup_obj (cache, nmp_object_stackinit_id_link (&objs1, pl_link_3.ifindex)) == obj_new);
Packit Service b23acc
		g_assert (nmp_object_is_visible (obj_new));
Packit Service b23acc
		_assert_cache_multi_lookup_contains_link (cache, TRUE, obj_new, TRUE);
Packit Service b23acc
		_assert_cache_multi_lookup_contains_link (cache, FALSE, obj_new, TRUE);
Packit Service b23acc
		g_assert_cmpint (obj_new->_link.netlink.is_in_netlink, ==, TRUE);
Packit Service b23acc
		g_assert_cmpint (obj_new->link.initialized, ==, !nmp_cache_use_udev_get (cache));
Packit Service b23acc
		nmp_object_unref (obj_new);
Packit Service b23acc
		nmp_object_unref (obj_old);
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	nmp_cache_free (cache);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
const char noqueue[] = "noqueue";
Packit Service b23acc
const char fq_codel[] = "fq_codel";
Packit Service b23acc
const char ingress[] = "ingress";
Packit Service b23acc
Packit Service b23acc
static const NMPlatformQdisc pl_qdisc_1a = {
Packit Service b23acc
	.ifindex = 1,
Packit Service b23acc
	.kind = noqueue,
Packit Service b23acc
	.addr_family = AF_UNSPEC,
Packit Service b23acc
	.handle = 0,
Packit Service b23acc
	.parent = TC_H_ROOT,
Packit Service b23acc
	.info = 0,
Packit Service b23acc
};
Packit Service b23acc
Packit Service b23acc
static const NMPlatformQdisc pl_qdisc_1b = {
Packit Service b23acc
	.ifindex = 1,
Packit Service b23acc
	.kind = fq_codel,
Packit Service b23acc
	.addr_family = AF_UNSPEC,
Packit Service b23acc
	.handle = 0,
Packit Service b23acc
	.parent = TC_H_ROOT,
Packit Service b23acc
	.info = 0,
Packit Service b23acc
};
Packit Service b23acc
Packit Service b23acc
static const NMPlatformQdisc pl_qdisc_1c = {
Packit Service b23acc
	.ifindex = 1,
Packit Service b23acc
	.kind = ingress,
Packit Service b23acc
	.addr_family = AF_UNSPEC,
Packit Service b23acc
	.handle = TC_H_MAKE(TC_H_INGRESS, 0),
Packit Service b23acc
	.parent = TC_H_INGRESS,
Packit Service b23acc
	.info = 0,
Packit Service b23acc
};
Packit Service b23acc
Packit Service b23acc
static const NMPlatformQdisc pl_qdisc_2 = {
Packit Service b23acc
	.ifindex = 2,
Packit Service b23acc
	.kind = fq_codel,
Packit Service b23acc
	.addr_family = AF_UNSPEC,
Packit Service b23acc
	.handle = 0,
Packit Service b23acc
	.parent = TC_H_ROOT,
Packit Service b23acc
	.info = 0,
Packit Service b23acc
};
Packit Service b23acc
Packit Service b23acc
static void
Packit Service b23acc
test_cache_qdisc (void)
Packit Service b23acc
{
Packit Service b23acc
	NMPCache *cache;
Packit Service b23acc
	nm_auto_unref_dedup_multi_index NMDedupMultiIndex *multi_idx = NULL;
Packit Service b23acc
	NMPLookup lookup;
Packit Service b23acc
	const NMDedupMultiHeadEntry *head_entry;
Packit Service b23acc
	nm_auto_nmpobj NMPObject *obj1a = nmp_object_new (NMP_OBJECT_TYPE_QDISC, (NMPlatformObject *) &pl_qdisc_1a);
Packit Service b23acc
	nm_auto_nmpobj NMPObject *obj1b = nmp_object_new (NMP_OBJECT_TYPE_QDISC, (NMPlatformObject *) &pl_qdisc_1b);
Packit Service b23acc
	nm_auto_nmpobj NMPObject *obj1c = nmp_object_new (NMP_OBJECT_TYPE_QDISC, (NMPlatformObject *) &pl_qdisc_1c);
Packit Service b23acc
	nm_auto_nmpobj NMPObject *obj2 = nmp_object_new (NMP_OBJECT_TYPE_QDISC, (NMPlatformObject *) &pl_qdisc_2);
Packit Service b23acc
Packit Service b23acc
	multi_idx = nm_dedup_multi_index_new ();
Packit Service b23acc
	cache = nmp_cache_new (multi_idx, nmtst_get_rand_uint32 () % 2);
Packit Service b23acc
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj1a) == NULL);
Packit Service b23acc
Packit Service b23acc
	g_assert (nmp_cache_update_netlink (cache, obj1a, FALSE, NULL, NULL) == NMP_CACHE_OPS_ADDED);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj1a) == obj1a);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj1b) == obj1a);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj2) == NULL);
Packit Service b23acc
Packit Service b23acc
	g_assert (nmp_cache_update_netlink (cache, obj1b, FALSE, NULL, NULL) == NMP_CACHE_OPS_UPDATED);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj1a) == obj1b);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj1b) == obj1b);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj2) == NULL);
Packit Service b23acc
Packit Service b23acc
	g_assert (nmp_cache_update_netlink (cache, obj1c, FALSE, NULL, NULL) == NMP_CACHE_OPS_ADDED);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj1a) == obj1b);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj1b) == obj1b);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj1c) == obj1c);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj2) == NULL);
Packit Service b23acc
Packit Service b23acc
	g_assert (nmp_cache_update_netlink (cache, obj2, FALSE, NULL, NULL) == NMP_CACHE_OPS_ADDED);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj1a) == obj1b);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj1b) == obj1b);
Packit Service b23acc
	g_assert (nmp_cache_lookup_obj (cache, obj2) == obj2);
Packit Service b23acc
Packit Service b23acc
	head_entry = nmp_cache_lookup (cache,
Packit Service b23acc
	                               nmp_lookup_init_object (&lookup,
Packit Service b23acc
	                                                       NMP_OBJECT_TYPE_QDISC,
Packit Service b23acc
	                                                       1));
Packit Service b23acc
	g_assert (head_entry->len == 2);
Packit Service b23acc
Packit Service b23acc
	nmp_cache_free (cache);
Packit Service b23acc
}
Packit Service b23acc
Packit Service b23acc
/*****************************************************************************/
Packit Service b23acc
Packit Service b23acc
NMTST_DEFINE ();
Packit Service b23acc
Packit Service b23acc
int
Packit Service b23acc
main (int argc, char **argv)
Packit Service b23acc
{
Packit Service b23acc
	int result;
Packit Service b23acc
	NMUdevClient *udev_client;
Packit Service b23acc
Packit Service b23acc
	nmtst_init_assert_logging (&argc, &argv, "INFO", "DEFAULT");
Packit Service b23acc
Packit Service b23acc
	udev_client = nm_udev_client_new ((const char *[]) { "net", NULL },
Packit Service b23acc
	                                  NULL, NULL);
Packit Service b23acc
	{
Packit Service b23acc
		struct udev_enumerate *enumerator;
Packit Service b23acc
		struct udev_list_entry *devices, *l;
Packit Service b23acc
Packit Service b23acc
		enumerator = nm_udev_client_enumerate_new (udev_client);
Packit Service b23acc
Packit Service b23acc
		/* Demand that the device is initialized (udev rules ran,
Packit Service b23acc
		 * device has a stable name now) in case udev is running
Packit Service b23acc
		 * (not in a container). */
Packit Service b23acc
		if (access ("/sys", W_OK) == 0)
Packit Service b23acc
			udev_enumerate_add_match_is_initialized (enumerator);
Packit Service b23acc
Packit Service b23acc
		udev_enumerate_scan_devices (enumerator);
Packit Service b23acc
Packit Service b23acc
		devices = udev_enumerate_get_list_entry (enumerator);
Packit Service b23acc
		for (l = devices; l != NULL; l = udev_list_entry_get_next (l)) {
Packit Service b23acc
			struct udev_device *udevice;
Packit Service b23acc
Packit Service b23acc
			udevice = udev_device_new_from_syspath (udev_enumerate_get_udev (enumerator),
Packit Service b23acc
			                                        udev_list_entry_get_name (l));
Packit Service b23acc
			if (udevice == NULL)
Packit Service b23acc
				continue;
Packit Service b23acc
Packit Service b23acc
			global.udev_devices = g_list_prepend (global.udev_devices, udevice);
Packit Service b23acc
		}
Packit Service b23acc
		global.udev_devices = g_list_reverse (global.udev_devices);
Packit Service b23acc
Packit Service b23acc
		udev_enumerate_unref (enumerator);
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	g_test_add_func ("/nmp-object/obj-base", test_obj_base);
Packit Service b23acc
	g_test_add_func ("/nmp-object/cache_link", test_cache_link);
Packit Service b23acc
	g_test_add_func ("/nmp-object/cache_qdisc", test_cache_qdisc);
Packit Service b23acc
Packit Service b23acc
	result = g_test_run ();
Packit Service b23acc
Packit Service b23acc
	while (global.udev_devices) {
Packit Service b23acc
		udev_device_unref (global.udev_devices->data);
Packit Service b23acc
		global.udev_devices = g_list_delete_link (global.udev_devices, global.udev_devices);
Packit Service b23acc
	}
Packit Service b23acc
Packit Service b23acc
	nm_udev_client_unref (udev_client);
Packit Service b23acc
Packit Service b23acc
	return result;
Packit Service b23acc
}
Packit Service b23acc