mirror of
https://gitlab.freedesktop.org/NetworkManager/NetworkManager.git
synced 2026-01-08 00:10:15 +01:00
We inconsistently use gulong,guint,int types to store signal handler id, but the type returned by g_signal_connect() is a gulong. This has no practical consequences because a int/guint is enough to store the value, however it is better to use a consistent type, also because nm_clear_g_signal_handler() accepts a pointer to the signal id and thus it must be always called with the same pointer type.
174 lines
8.7 KiB
C
174 lines
8.7 KiB
C
#include <stdlib.h>
|
|
#include <unistd.h>
|
|
#include <syslog.h>
|
|
#include <string.h>
|
|
#include <arpa/inet.h>
|
|
|
|
#include "nm-default.h"
|
|
#include "nm-platform.h"
|
|
#include "nm-fake-platform.h"
|
|
#include "nm-linux-platform.h"
|
|
|
|
#include "nm-test-utils.h"
|
|
|
|
#define DEVICE_NAME "nm-test-device"
|
|
|
|
/*********************************************************************************************/
|
|
|
|
#define _NMLOG_PREFIX_NAME "platform-test"
|
|
#define _NMLOG_DOMAIN LOGD_PLATFORM
|
|
#define _NMLOG(level, ...) _LOG(level, _NMLOG_DOMAIN, __VA_ARGS__)
|
|
|
|
#define _LOG(level, domain, ...) \
|
|
G_STMT_START { \
|
|
const NMLogLevel __level = (level); \
|
|
const NMLogDomain __domain = (domain); \
|
|
\
|
|
if (nm_logging_enabled (__level, __domain)) { \
|
|
gint64 _ts = nm_utils_get_monotonic_timestamp_ns (); \
|
|
\
|
|
_nm_log (__level, __domain, 0, \
|
|
"%s[%ld.%09ld]: " _NM_UTILS_MACRO_FIRST (__VA_ARGS__), \
|
|
_NMLOG_PREFIX_NAME, \
|
|
(long) (_ts / NM_UTILS_NS_PER_SECOND), \
|
|
(long) (_ts % NM_UTILS_NS_PER_SECOND) \
|
|
_NM_UTILS_MACRO_REST (__VA_ARGS__)); \
|
|
} \
|
|
} G_STMT_END
|
|
|
|
/*********************************************************************************************/
|
|
|
|
typedef struct {
|
|
gulong handler_id;
|
|
const char *name;
|
|
NMPlatformSignalChangeType change_type;
|
|
gint received_count;
|
|
GMainLoop *loop;
|
|
int ifindex;
|
|
const char *ifname;
|
|
} SignalData;
|
|
|
|
gboolean nmtstp_is_root_test (void);
|
|
gboolean nmtstp_is_sysfs_writable (void);
|
|
|
|
/******************************************************************************/
|
|
|
|
typedef struct _NMTstpNamespaceHandle NMTstpNamespaceHandle;
|
|
|
|
NMTstpNamespaceHandle *nmtstp_namespace_create (int flags, GError **error);
|
|
|
|
void nmtstp_namespace_handle_release (NMTstpNamespaceHandle *handle);
|
|
pid_t nmtstp_namespace_handle_get_pid (NMTstpNamespaceHandle *handle);
|
|
|
|
int nmtstp_namespace_get_fd_for_process (pid_t pid, const char *ns_name);
|
|
|
|
/******************************************************************************/
|
|
|
|
SignalData *add_signal_full (const char *name, NMPlatformSignalChangeType change_type, GCallback callback, int ifindex, const char *ifname);
|
|
#define add_signal(name, change_type, callback) add_signal_full (name, change_type, (GCallback) callback, 0, NULL)
|
|
#define add_signal_ifindex(name, change_type, callback, ifindex) add_signal_full (name, change_type, (GCallback) callback, ifindex, NULL)
|
|
#define add_signal_ifname(name, change_type, callback, ifname) add_signal_full (name, change_type, (GCallback) callback, 0, ifname)
|
|
void _accept_signal (const char *file, int line, const char *func, SignalData *data);
|
|
void _accept_signals (const char *file, int line, const char *func, SignalData *data, int min, int max);
|
|
void _wait_signal (const char *file, int line, const char *func, SignalData *data);
|
|
void _accept_or_wait_signal (const char *file, int line, const char *func, SignalData *data);
|
|
void _ensure_no_signal (const char *file, int line, const char *func, SignalData *data);
|
|
void _free_signal (const char *file, int line, const char *func, SignalData *data);
|
|
#define accept_signal(data) _accept_signal(__FILE__, __LINE__, G_STRFUNC, data)
|
|
#define accept_signals(data, min, max) _accept_signals(__FILE__, __LINE__, G_STRFUNC, data, min, max)
|
|
#define wait_signal(data) _wait_signal(__FILE__, __LINE__, G_STRFUNC, data)
|
|
#define accept_or_wait_signal(data) _accept_or_wait_signal(__FILE__, __LINE__, G_STRFUNC, data)
|
|
#define ensure_no_signal(data) _ensure_no_signal(__FILE__, __LINE__, G_STRFUNC, data)
|
|
#define free_signal(data) _free_signal(__FILE__, __LINE__, G_STRFUNC, data)
|
|
|
|
gboolean ip4_route_exists (const char *ifname, guint32 network, int plen, guint32 metric);
|
|
|
|
void _assert_ip4_route_exists (const char *file, guint line, const char *func, gboolean exists, const char *ifname, guint32 network, int plen, guint32 metric);
|
|
#define assert_ip4_route_exists(exists, ifname, network, plen, metric) _assert_ip4_route_exists (__FILE__, __LINE__, G_STRFUNC, exists, ifname, network, plen, metric)
|
|
|
|
void link_callback (NMPlatform *platform, NMPObjectType obj_type, int ifindex, NMPlatformLink *received, NMPlatformSignalChangeType change_type, SignalData *data);
|
|
|
|
int nmtstp_run_command (const char *format, ...) __attribute__((__format__ (__printf__, 1, 2)));
|
|
#define nmtstp_run_command_check(...) do { g_assert_cmpint (nmtstp_run_command (__VA_ARGS__), ==, 0); } while (0)
|
|
|
|
gboolean nmtstp_wait_for_signal (guint timeout_ms);
|
|
gboolean nmtstp_wait_for_signal_until (gint64 until_ms);
|
|
const NMPlatformLink *nmtstp_wait_for_link (const char *ifname, NMLinkType expected_link_type, guint timeout_ms);
|
|
const NMPlatformLink *nmtstp_wait_for_link_until (const char *ifname, NMLinkType expected_link_type, gint64 until_ms);
|
|
|
|
const NMPlatformLink *nmtstp_assert_wait_for_link (const char *ifname, NMLinkType expected_link_type, guint timeout_ms);
|
|
const NMPlatformLink *nmtstp_assert_wait_for_link_until (const char *ifname, NMLinkType expected_link_type, gint64 until_ms);
|
|
|
|
int nmtstp_run_command_check_external_global (void);
|
|
gboolean nmtstp_run_command_check_external (int external_command);
|
|
|
|
gboolean nmtstp_ip_address_check_lifetime (const NMPlatformIPAddress *addr,
|
|
gint64 now,
|
|
guint32 expected_lifetime,
|
|
guint32 expected_preferred);
|
|
void nmtstp_ip_address_assert_lifetime (const NMPlatformIPAddress *addr,
|
|
gint64 now,
|
|
guint32 expected_lifetime,
|
|
guint32 expected_preferred);
|
|
void nmtstp_ip4_address_add (gboolean external_command,
|
|
int ifindex,
|
|
in_addr_t address,
|
|
int plen,
|
|
in_addr_t peer_address,
|
|
guint32 lifetime,
|
|
guint32 preferred,
|
|
const char *label);
|
|
void nmtstp_ip6_address_add (gboolean external_command,
|
|
int ifindex,
|
|
struct in6_addr address,
|
|
int plen,
|
|
struct in6_addr peer_address,
|
|
guint32 lifetime,
|
|
guint32 preferred,
|
|
guint flags);
|
|
void nmtstp_ip4_address_del (gboolean external_command,
|
|
int ifindex,
|
|
in_addr_t address,
|
|
int plen,
|
|
in_addr_t peer_address);
|
|
void nmtstp_ip6_address_del (gboolean external_command,
|
|
int ifindex,
|
|
struct in6_addr address,
|
|
int plen);
|
|
|
|
const NMPlatformLink *nmtstp_link_get_typed (int ifindex, const char *name, NMLinkType link_type);
|
|
const NMPlatformLink *nmtstp_link_get (int ifindex, const char *name);
|
|
|
|
void nmtstp_link_set_updown (gboolean external_command,
|
|
int ifindex,
|
|
gboolean up);
|
|
|
|
const NMPlatformLink *nmtstp_link_dummy_add (gboolean external_command,
|
|
const char *name);
|
|
const NMPlatformLink *nmtstp_link_gre_add (gboolean external_command,
|
|
const char *name,
|
|
const NMPlatformLnkGre *lnk);
|
|
const NMPlatformLink *nmtstp_link_ip6tnl_add (gboolean external_command,
|
|
const char *name,
|
|
const NMPlatformLnkIp6Tnl *lnk);
|
|
const NMPlatformLink *nmtstp_link_ipip_add (gboolean external_command,
|
|
const char *name,
|
|
const NMPlatformLnkIpIp *lnk);
|
|
const NMPlatformLink *nmtstp_link_macvlan_add (gboolean external_command,
|
|
const char *name,
|
|
int parent,
|
|
const NMPlatformLnkMacvlan *lnk);
|
|
const NMPlatformLink *nmtstp_link_sit_add (gboolean external_command,
|
|
const char *name,
|
|
const NMPlatformLnkSit *lnk);
|
|
const NMPlatformLink *nmtstp_link_vxlan_add (gboolean external_command,
|
|
const char *name,
|
|
const NMPlatformLnkVxlan *lnk);
|
|
|
|
void nmtstp_link_del (gboolean external_command,
|
|
int ifindex,
|
|
const char *name);
|
|
|
|
void init_tests (int *argc, char ***argv);
|
|
void setup_tests (void);
|
|
|