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