Blame src/core/nm-test-utils-core.h

Packit Service 5ffa24
/* SPDX-License-Identifier: LGPL-2.1-or-later */
Packit Service 5ffa24
/*
Packit Service 5ffa24
 * Copyright (C) 2014 - 2016 Red Hat, Inc.
Packit Service 5ffa24
 */
Packit Service 5ffa24
Packit Service 5ffa24
#ifndef __NM_TEST_UTILS_CORE_H__
Packit Service 5ffa24
#define __NM_TEST_UTILS_CORE_H__
Packit Service 5ffa24
Packit Service 5ffa24
#include "NetworkManagerUtils.h"
Packit Service 5ffa24
#include "nm-keyfile/nm-keyfile-internal.h"
Packit Service 5ffa24
Packit Service 5ffa24
#define _NMTST_INSIDE_CORE 1
Packit Service 5ffa24
Packit Service 5ffa24
#include "nm-utils/nm-test-utils.h"
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
#define NMTST_EXPECT_NM(level, msg) NMTST_EXPECT("NetworkManager", level, msg)
Packit Service 5ffa24
Packit Service 5ffa24
#define NMTST_EXPECT_NM_ERROR(msg) NMTST_EXPECT_NM(G_LOG_LEVEL_MESSAGE, "*<error> [*] " msg)
Packit Service 5ffa24
#define NMTST_EXPECT_NM_WARN(msg)  NMTST_EXPECT_NM(G_LOG_LEVEL_MESSAGE, "*<warn>  [*] " msg)
Packit Service 5ffa24
#define NMTST_EXPECT_NM_INFO(msg)  NMTST_EXPECT_NM(G_LOG_LEVEL_INFO, "*<info>  [*] " msg)
Packit Service 5ffa24
#define NMTST_EXPECT_NM_DEBUG(msg) NMTST_EXPECT_NM(G_LOG_LEVEL_DEBUG, "*<debug> [*] " msg)
Packit Service 5ffa24
#define NMTST_EXPECT_NM_TRACE(msg) NMTST_EXPECT_NM(G_LOG_LEVEL_DEBUG, "*<trace> [*] " msg)
Packit Service 5ffa24
Packit Service 5ffa24
static inline void
Packit Service 5ffa24
nmtst_init_with_logging(int *argc, char ***argv, const char *log_level, const char *log_domains)
Packit Service 5ffa24
{
Packit Service 5ffa24
    __nmtst_init(argc, argv, FALSE, log_level, log_domains, NULL);
Packit Service 5ffa24
}
Packit Service 5ffa24
static inline void
Packit Service 5ffa24
nmtst_init_assert_logging(int *argc, char ***argv, const char *log_level, const char *log_domains)
Packit Service 5ffa24
{
Packit Service 5ffa24
    gboolean set_logging;
Packit Service 5ffa24
Packit Service 5ffa24
    __nmtst_init(argc, argv, TRUE, NULL, NULL, &set_logging);
Packit Service 5ffa24
Packit Service 5ffa24
    if (!set_logging) {
Packit Service 5ffa24
        gboolean success;
Packit Service 5ffa24
Packit Service 5ffa24
        success = nm_logging_setup(log_level, log_domains, NULL, NULL);
Packit Service 5ffa24
        g_assert(success);
Packit Service 5ffa24
    }
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
/*****************************************************************************/
Packit Service 5ffa24
Packit Service 5ffa24
#ifdef __NETWORKMANAGER_PLATFORM_H__
Packit Service 5ffa24
Packit Service 5ffa24
static inline NMPlatformIP4Address *
Packit Service 5ffa24
nmtst_platform_ip4_address(const char *address, const char *peer_address, guint plen)
Packit Service 5ffa24
{
Packit Service 5ffa24
    static NMPlatformIP4Address addr;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(plen <= 32);
Packit Service 5ffa24
Packit Service 5ffa24
    memset(&addr, 0, sizeof(addr));
Packit Service 5ffa24
    addr.address = nmtst_inet4_from_string(address);
Packit Service 5ffa24
    if (peer_address)
Packit Service 5ffa24
        addr.peer_address = nmtst_inet4_from_string(peer_address);
Packit Service 5ffa24
    else
Packit Service 5ffa24
        addr.peer_address = addr.address;
Packit Service 5ffa24
    addr.plen = plen;
Packit Service 5ffa24
Packit Service 5ffa24
    return &addr;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline NMPlatformIP4Address *
Packit Service 5ffa24
nmtst_platform_ip4_address_full(const char *     address,
Packit Service 5ffa24
                                const char *     peer_address,
Packit Service 5ffa24
                                guint            plen,
Packit Service 5ffa24
                                int              ifindex,
Packit Service 5ffa24
                                NMIPConfigSource source,
Packit Service 5ffa24
                                guint32          timestamp,
Packit Service 5ffa24
                                guint32          lifetime,
Packit Service 5ffa24
                                guint32          preferred,
Packit Service 5ffa24
                                guint32          flags,
Packit Service 5ffa24
                                const char *     label)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMPlatformIP4Address *addr = nmtst_platform_ip4_address(address, peer_address, plen);
Packit Service 5ffa24
Packit Service 5ffa24
    G_STATIC_ASSERT(NMP_IFNAMSIZ == sizeof(addr->label));
Packit Service 5ffa24
    g_assert(!label || strlen(label) < NMP_IFNAMSIZ);
Packit Service 5ffa24
Packit Service 5ffa24
    addr->ifindex     = ifindex;
Packit Service 5ffa24
    addr->addr_source = source;
Packit Service 5ffa24
    addr->timestamp   = timestamp;
Packit Service 5ffa24
    addr->lifetime    = lifetime;
Packit Service 5ffa24
    addr->preferred   = preferred;
Packit Service 5ffa24
    addr->n_ifa_flags = flags;
Packit Service 5ffa24
    if (label)
Packit Service 5ffa24
        g_strlcpy(addr->label, label, sizeof(addr->label));
Packit Service 5ffa24
Packit Service 5ffa24
    return addr;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline NMPlatformIP6Address *
Packit Service 5ffa24
nmtst_platform_ip6_address(const char *address, const char *peer_address, guint plen)
Packit Service 5ffa24
{
Packit Service 5ffa24
    static NMPlatformIP6Address addr;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(plen <= 128);
Packit Service 5ffa24
Packit Service 5ffa24
    memset(&addr, 0, sizeof(addr));
Packit Service 5ffa24
    addr.address      = *nmtst_inet6_from_string(address);
Packit Service 5ffa24
    addr.peer_address = *nmtst_inet6_from_string(peer_address);
Packit Service 5ffa24
    addr.plen         = plen;
Packit Service 5ffa24
Packit Service 5ffa24
    return &addr;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline NMPlatformIP6Address *
Packit Service 5ffa24
nmtst_platform_ip6_address_full(const char *     address,
Packit Service 5ffa24
                                const char *     peer_address,
Packit Service 5ffa24
                                guint            plen,
Packit Service 5ffa24
                                int              ifindex,
Packit Service 5ffa24
                                NMIPConfigSource source,
Packit Service 5ffa24
                                guint32          timestamp,
Packit Service 5ffa24
                                guint32          lifetime,
Packit Service 5ffa24
                                guint32          preferred,
Packit Service 5ffa24
                                guint32          flags)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMPlatformIP6Address *addr = nmtst_platform_ip6_address(address, peer_address, plen);
Packit Service 5ffa24
Packit Service 5ffa24
    addr->ifindex     = ifindex;
Packit Service 5ffa24
    addr->addr_source = source;
Packit Service 5ffa24
    addr->timestamp   = timestamp;
Packit Service 5ffa24
    addr->lifetime    = lifetime;
Packit Service 5ffa24
    addr->preferred   = preferred;
Packit Service 5ffa24
    addr->n_ifa_flags = flags;
Packit Service 5ffa24
Packit Service 5ffa24
    return addr;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline NMPlatformIP4Route *
Packit Service 5ffa24
nmtst_platform_ip4_route(const char *network, guint plen, const char *gateway)
Packit Service 5ffa24
{
Packit Service 5ffa24
    static NMPlatformIP4Route route;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(plen <= 32);
Packit Service 5ffa24
Packit Service 5ffa24
    memset(&route, 0, sizeof(route));
Packit Service 5ffa24
    route.network = nmtst_inet4_from_string(network);
Packit Service 5ffa24
    route.plen    = plen;
Packit Service 5ffa24
    route.gateway = nmtst_inet4_from_string(gateway);
Packit Service 5ffa24
Packit Service 5ffa24
    return &route;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline NMPlatformIP4Route *
Packit Service 5ffa24
nmtst_platform_ip4_route_full(const char *     network,
Packit Service 5ffa24
                              guint            plen,
Packit Service 5ffa24
                              const char *     gateway,
Packit Service 5ffa24
                              int              ifindex,
Packit Service 5ffa24
                              NMIPConfigSource source,
Packit Service 5ffa24
                              guint            metric,
Packit Service 5ffa24
                              guint            mss,
Packit Service 5ffa24
                              guint8           scope,
Packit Service 5ffa24
                              const char *     pref_src)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMPlatformIP4Route *route = nmtst_platform_ip4_route(network, plen, gateway);
Packit Service 5ffa24
Packit Service 5ffa24
    route->ifindex   = ifindex;
Packit Service 5ffa24
    route->rt_source = source;
Packit Service 5ffa24
    route->metric    = metric;
Packit Service 5ffa24
    route->mss       = mss;
Packit Service 5ffa24
    route->scope_inv = nm_platform_route_scope_inv(scope);
Packit Service 5ffa24
    route->pref_src  = nmtst_inet4_from_string(pref_src);
Packit Service 5ffa24
Packit Service 5ffa24
    return route;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline NMPlatformIP6Route *
Packit Service 5ffa24
nmtst_platform_ip6_route(const char *network, guint plen, const char *gateway, const char *pref_src)
Packit Service 5ffa24
{
Packit Service 5ffa24
    static NMPlatformIP6Route route;
Packit Service 5ffa24
Packit Service 5ffa24
    nm_assert(plen <= 128);
Packit Service 5ffa24
Packit Service 5ffa24
    memset(&route, 0, sizeof(route));
Packit Service 5ffa24
    route.network  = *nmtst_inet6_from_string(network);
Packit Service 5ffa24
    route.plen     = plen;
Packit Service 5ffa24
    route.gateway  = *nmtst_inet6_from_string(gateway);
Packit Service 5ffa24
    route.pref_src = *nmtst_inet6_from_string(pref_src);
Packit Service 5ffa24
Packit Service 5ffa24
    return &route;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline NMPlatformIP6Route *
Packit Service 5ffa24
nmtst_platform_ip6_route_full(const char *     network,
Packit Service 5ffa24
                              guint            plen,
Packit Service 5ffa24
                              const char *     gateway,
Packit Service 5ffa24
                              int              ifindex,
Packit Service 5ffa24
                              NMIPConfigSource source,
Packit Service 5ffa24
                              guint            metric,
Packit Service 5ffa24
                              guint            mss)
Packit Service 5ffa24
{
Packit Service 5ffa24
    NMPlatformIP6Route *route = nmtst_platform_ip6_route(network, plen, gateway, NULL);
Packit Service 5ffa24
Packit Service 5ffa24
    route->ifindex   = ifindex;
Packit Service 5ffa24
    route->rt_source = source;
Packit Service 5ffa24
    route->metric    = metric;
Packit Service 5ffa24
    route->mss       = mss;
Packit Service 5ffa24
Packit Service 5ffa24
    return route;
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline int
Packit Service 5ffa24
_nmtst_platform_ip4_routes_equal_sort(gconstpointer a, gconstpointer b, gpointer user_data)
Packit Service 5ffa24
{
Packit Service 5ffa24
    return nm_platform_ip4_route_cmp_full((const NMPlatformIP4Route *) a,
Packit Service 5ffa24
                                          (const NMPlatformIP4Route *) b);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline void
Packit Service 5ffa24
nmtst_platform_ip4_routes_equal(const NMPlatformIP4Route *a,
Packit Service 5ffa24
                                const NMPlatformIP4Route *b,
Packit Service 5ffa24
                                gsize                     len,
Packit Service 5ffa24
                                gboolean                  ignore_order)
Packit Service 5ffa24
{
Packit Service 5ffa24
    gsize         i;
Packit Service 5ffa24
    gs_free const NMPlatformIP4Route *c_a = NULL, *c_b = NULL;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(a);
Packit Service 5ffa24
    g_assert(b);
Packit Service 5ffa24
Packit Service 5ffa24
    if (ignore_order) {
Packit Service 5ffa24
        a = c_a = nm_memdup(a, sizeof(NMPlatformIP4Route) * len);
Packit Service 5ffa24
        b = c_b = nm_memdup(b, sizeof(NMPlatformIP4Route) * len);
Packit Service 5ffa24
        g_qsort_with_data(c_a,
Packit Service 5ffa24
                          len,
Packit Service 5ffa24
                          sizeof(NMPlatformIP4Route),
Packit Service 5ffa24
                          _nmtst_platform_ip4_routes_equal_sort,
Packit Service 5ffa24
                          NULL);
Packit Service 5ffa24
        g_qsort_with_data(c_b,
Packit Service 5ffa24
                          len,
Packit Service 5ffa24
                          sizeof(NMPlatformIP4Route),
Packit Service 5ffa24
                          _nmtst_platform_ip4_routes_equal_sort,
Packit Service 5ffa24
                          NULL);
Packit Service 5ffa24
    }
Packit Service 5ffa24
Packit Service 5ffa24
    for (i = 0; i < len; i++) {
Packit Service 5ffa24
        if (nm_platform_ip4_route_cmp_full(&a[i], &b[i]) != 0) {
Packit Service 5ffa24
            char buf[sizeof(_nm_utils_to_string_buffer)];
Packit Service 5ffa24
Packit Service 5ffa24
            g_error("Error comparing IPv4 route[%lu]: %s vs %s",
Packit Service 5ffa24
                    (unsigned long) i,
Packit Service 5ffa24
                    nm_platform_ip4_route_to_string(&a[i], NULL, 0),
Packit Service 5ffa24
                    nm_platform_ip4_route_to_string(&b[i], buf, sizeof(buf)));
Packit Service 5ffa24
            g_assert_not_reached();
Packit Service 5ffa24
        }
Packit Service 5ffa24
    }
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
    #ifdef __NMP_OBJECT_H__
Packit Service 5ffa24
Packit Service 5ffa24
static inline void
Packit Service 5ffa24
nmtst_platform_ip4_routes_equal_aptr(const NMPObject *const *  a,
Packit Service 5ffa24
                                     const NMPlatformIP4Route *b,
Packit Service 5ffa24
                                     gsize                     len,
Packit Service 5ffa24
                                     gboolean                  ignore_order)
Packit Service 5ffa24
{
Packit Service 5ffa24
    gsize   i;
Packit Service 5ffa24
    gs_free NMPlatformIP4Route *c_a = NULL;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(len > 0);
Packit Service 5ffa24
    g_assert(a);
Packit Service 5ffa24
Packit Service 5ffa24
    c_a = g_new(NMPlatformIP4Route, len);
Packit Service 5ffa24
    for (i = 0; i < len; i++)
Packit Service 5ffa24
        c_a[i] = *NMP_OBJECT_CAST_IP4_ROUTE(a[i]);
Packit Service 5ffa24
    nmtst_platform_ip4_routes_equal(c_a, b, len, ignore_order);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
    #endif
Packit Service 5ffa24
Packit Service 5ffa24
static inline int
Packit Service 5ffa24
_nmtst_platform_ip6_routes_equal_sort(gconstpointer a, gconstpointer b, gpointer user_data)
Packit Service 5ffa24
{
Packit Service 5ffa24
    return nm_platform_ip6_route_cmp_full((const NMPlatformIP6Route *) a,
Packit Service 5ffa24
                                          (const NMPlatformIP6Route *) b);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
static inline void
Packit Service 5ffa24
nmtst_platform_ip6_routes_equal(const NMPlatformIP6Route *a,
Packit Service 5ffa24
                                const NMPlatformIP6Route *b,
Packit Service 5ffa24
                                gsize                     len,
Packit Service 5ffa24
                                gboolean                  ignore_order)
Packit Service 5ffa24
{
Packit Service 5ffa24
    gsize         i;
Packit Service 5ffa24
    gs_free const NMPlatformIP6Route *c_a = NULL, *c_b = NULL;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(a);
Packit Service 5ffa24
    g_assert(b);
Packit Service 5ffa24
Packit Service 5ffa24
    if (ignore_order) {
Packit Service 5ffa24
        a = c_a = nm_memdup(a, sizeof(NMPlatformIP6Route) * len);
Packit Service 5ffa24
        b = c_b = nm_memdup(b, sizeof(NMPlatformIP6Route) * len);
Packit Service 5ffa24
        g_qsort_with_data(c_a,
Packit Service 5ffa24
                          len,
Packit Service 5ffa24
                          sizeof(NMPlatformIP6Route),
Packit Service 5ffa24
                          _nmtst_platform_ip6_routes_equal_sort,
Packit Service 5ffa24
                          NULL);
Packit Service 5ffa24
        g_qsort_with_data(c_b,
Packit Service 5ffa24
                          len,
Packit Service 5ffa24
                          sizeof(NMPlatformIP6Route),
Packit Service 5ffa24
                          _nmtst_platform_ip6_routes_equal_sort,
Packit Service 5ffa24
                          NULL);
Packit Service 5ffa24
    }
Packit Service 5ffa24
Packit Service 5ffa24
    for (i = 0; i < len; i++) {
Packit Service 5ffa24
        if (nm_platform_ip6_route_cmp_full(&a[i], &b[i]) != 0) {
Packit Service 5ffa24
            char buf[sizeof(_nm_utils_to_string_buffer)];
Packit Service 5ffa24
Packit Service 5ffa24
            g_error("Error comparing IPv6 route[%lu]: %s vs %s",
Packit Service 5ffa24
                    (unsigned long) i,
Packit Service 5ffa24
                    nm_platform_ip6_route_to_string(&a[i], NULL, 0),
Packit Service 5ffa24
                    nm_platform_ip6_route_to_string(&b[i], buf, sizeof(buf)));
Packit Service 5ffa24
            g_assert_not_reached();
Packit Service 5ffa24
        }
Packit Service 5ffa24
    }
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
    #ifdef __NMP_OBJECT_H__
Packit Service 5ffa24
Packit Service 5ffa24
static inline void
Packit Service 5ffa24
nmtst_platform_ip6_routes_equal_aptr(const NMPObject *const *  a,
Packit Service 5ffa24
                                     const NMPlatformIP6Route *b,
Packit Service 5ffa24
                                     gsize                     len,
Packit Service 5ffa24
                                     gboolean                  ignore_order)
Packit Service 5ffa24
{
Packit Service 5ffa24
    gsize   i;
Packit Service 5ffa24
    gs_free NMPlatformIP6Route *c_a = NULL;
Packit Service 5ffa24
Packit Service 5ffa24
    g_assert(len > 0);
Packit Service 5ffa24
    g_assert(a);
Packit Service 5ffa24
Packit Service 5ffa24
    c_a = g_new(NMPlatformIP6Route, len);
Packit Service 5ffa24
    for (i = 0; i < len; i++)
Packit Service 5ffa24
        c_a[i] = *NMP_OBJECT_CAST_IP6_ROUTE(a[i]);
Packit Service 5ffa24
    nmtst_platform_ip6_routes_equal(c_a, b, len, ignore_order);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
    #endif
Packit Service 5ffa24
Packit Service 5ffa24
#endif
Packit Service 5ffa24
Packit Service 5ffa24
#ifdef __NETWORKMANAGER_IP4_CONFIG_H__
Packit Service 5ffa24
Packit Service 5ffa24
    #include "nm-glib-aux/nm-dedup-multi.h"
Packit Service 5ffa24
Packit Service 5ffa24
static inline NMIP4Config *
Packit Service 5ffa24
nmtst_ip4_config_new(int ifindex)
Packit Service 5ffa24
{
Packit Service 5ffa24
    nm_auto_unref_dedup_multi_index NMDedupMultiIndex *multi_idx = nm_dedup_multi_index_new();
Packit Service 5ffa24
Packit Service 5ffa24
    return nm_ip4_config_new(multi_idx, ifindex);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
#endif
Packit Service 5ffa24
Packit Service 5ffa24
#ifdef __NETWORKMANAGER_IP6_CONFIG_H__
Packit Service 5ffa24
Packit Service 5ffa24
    #include "nm-glib-aux/nm-dedup-multi.h"
Packit Service 5ffa24
Packit Service 5ffa24
static inline NMIP6Config *
Packit Service 5ffa24
nmtst_ip6_config_new(int ifindex)
Packit Service 5ffa24
{
Packit Service 5ffa24
    nm_auto_unref_dedup_multi_index NMDedupMultiIndex *multi_idx = nm_dedup_multi_index_new();
Packit Service 5ffa24
Packit Service 5ffa24
    return nm_ip6_config_new(multi_idx, ifindex);
Packit Service 5ffa24
}
Packit Service 5ffa24
Packit Service 5ffa24
#endif
Packit Service 5ffa24
Packit Service 5ffa24
#endif /* __NM_TEST_UTILS_CORE_H__ */