/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2014 - 2015 Red Hat, Inc.
 */

#ifndef __NM_TEST_LIBNM_UTILS_H__
#define __NM_TEST_LIBNM_UTILS_H__

#include "NetworkManager.h"

#include "libnm-glib-aux/nm-test-utils.h"

typedef struct {
    GDBusConnection *bus;
    GDBusProxy *     proxy;
    GPid             pid;
    int              keepalive_fd;
} NMTstcServiceInfo;

NMTstcServiceInfo *nmtstc_service_init(void);
void               nmtstc_service_cleanup(NMTstcServiceInfo *info);
NMTstcServiceInfo *nmtstc_service_available(NMTstcServiceInfo *info);

static inline void
_nmtstc_auto_service_cleanup(NMTstcServiceInfo **info)
{
    nmtstc_service_cleanup(g_steal_pointer(info));
}
#define nmtstc_auto_service_cleanup nm_auto(_nmtstc_auto_service_cleanup)

#define NMTSTC_SERVICE_INFO_SETUP(sinfo)                      \
    NM_PRAGMA_WARNING_DISABLE("-Wunused-variable")            \
    nmtstc_auto_service_cleanup NMTstcServiceInfo *sinfo = ({ \
        NMTstcServiceInfo *_sinfo;                            \
                                                              \
        _sinfo = nmtstc_service_init();                       \
        if (!nmtstc_service_available(_sinfo))                \
            return;                                           \
        _sinfo;                                               \
    });                                                       \
    NM_PRAGMA_WARNING_REENABLE

NMDevice *nmtstc_service_add_device(NMTstcServiceInfo *info,
                                    NMClient *         client,
                                    const char *       method,
                                    const char *       ifname);

NMDevice *nmtstc_service_add_wired_device(NMTstcServiceInfo *sinfo,
                                          NMClient *         client,
                                          const char *       ifname,
                                          const char *       hwaddr,
                                          const char **      subchannels);

void nmtstc_service_add_connection(NMTstcServiceInfo *sinfo,
                                   NMConnection *     connection,
                                   gboolean           verify_connection,
                                   char **            out_path);

void nmtstc_service_add_connection_variant(NMTstcServiceInfo *sinfo,
                                           GVariant *         connection,
                                           gboolean           verify_connection,
                                           char **            out_path);

void nmtstc_service_update_connection(NMTstcServiceInfo *sinfo,
                                      const char *       path,
                                      NMConnection *     connection,
                                      gboolean           verify_connection);

void nmtstc_service_update_connection_variant(NMTstcServiceInfo *sinfo,
                                              const char *       path,
                                              GVariant *         connection,
                                              gboolean           verify_connection);

gpointer nmtstc_context_object_new_valist(GType       gtype,
                                          gboolean    allow_iterate_main_context,
                                          const char *first_property_name,
                                          va_list     var_args);

gpointer nmtstc_context_object_new(GType       gtype,
                                   gboolean    allow_iterate_main_context,
                                   const char *first_property_name,
                                   ...);

static inline NMClient *
nmtstc_client_new(gboolean allow_iterate_main_context)
{
    return nmtstc_context_object_new(NM_TYPE_CLIENT, allow_iterate_main_context, NULL);
}

#endif /* __NM_TEST_LIBNM_UTILS_H__ */
