/* 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_unused nmtstc_auto_service_cleanup NMTstcServiceInfo *sinfo = ({ \
        NMTstcServiceInfo *_sinfo;                                       \
                                                                         \
        _sinfo = nmtstc_service_init();                                  \
        if (!nmtstc_service_available(_sinfo))                           \
            return;                                                      \
        _sinfo;                                                          \
    })

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__ */
