summaryrefslogtreecommitdiff
path: root/clients/cloud-setup/tests/test-cloud-setup-general.c
blob: 82ec7adf62e6be80760303d7358ceb3a09846577 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/* SPDX-License-Identifier: GPL-2.0-or-later */

#include "libnm-client-aux-extern/nm-default-client.h"

#include "nm-cloud-setup-utils.h"
#include "libnm-core-aux-intern/nm-libnm-core-utils.h"

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

/*****************************************************************************/

static NMSettingIPConfig *
_ri4a_new_s_ip(const char *const *addrs)
{
    NMSettingIPConfig *s_ip;

    s_ip = NM_SETTING_IP_CONFIG(nm_setting_ip4_config_new());

    for (; addrs && addrs[0]; addrs++) {
        nm_auto_unref_ip_address NMIPAddress *a = nmtst_ip_address_new(AF_INET, addrs[0]);

        nm_setting_ip_config_add_address(s_ip, a);
    }
    return s_ip;
}

static GPtrArray *
_ri4a_new_arr(const char *const *addrs)
{
    GPtrArray *arr;

    arr = g_ptr_array_new_with_free_func((GDestroyNotify) nm_ip_address_unref);

    for (; addrs && addrs[0]; addrs++)
        g_ptr_array_add(arr, nmtst_ip_address_new(AF_INET, addrs[0]));

    return arr;
}

static void
_test_ri4a(const char *const *addrs_before, const char *const *addrs_new)
{
    gs_unref_object NMSettingIPConfig *s_ip = NULL;
    gs_unref_ptrarray GPtrArray *arr        = NULL;
    const gsize                  n          = NM_PTRARRAY_LEN(addrs_new);
    gboolean                     changed;
    gsize                        i;

    s_ip = _ri4a_new_s_ip(addrs_before);
    arr  = _ri4a_new_arr(addrs_new);

    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip),
                    ==,
                    NM_PTRARRAY_LEN(addrs_before));
    g_assert_cmpint(arr->len, ==, n);

    changed = nmcs_setting_ip_replace_ipv4_addresses(s_ip, (NMIPAddress **) arr->pdata, arr->len);

    g_assert_cmpint(changed, !=, nm_utils_strv_equal(addrs_before, addrs_new));
    g_assert_cmpint(nm_setting_ip_config_get_num_addresses(s_ip), ==, n);

    for (i = 0; i < n; i++) {
        NMIPAddress *a = arr->pdata[i];
        NMIPAddress *b = nm_setting_ip_config_get_address(s_ip, i);

        if (nmtst_get_rand_bool())
            NM_SWAP(&a, &b);

        g_assert(nm_ip_address_cmp_full(a, b, NM_IP_ADDRESS_CMP_FLAGS_WITH_ATTRS) == 0);
    }
}

static void
test_replace_ipv4_addresses(void)
{
    const char *const *const LISTS[] = {
        NM_MAKE_STRV(),
        NM_MAKE_STRV("192.168.5.1/24"),
        NM_MAKE_STRV("192.168.5.1/24", "192.168.5.2/24"),
        NM_MAKE_STRV("192.168.5.1/24", "192.168.5.2/24", "192.168.5.3/24"),
        NM_MAKE_STRV("192.168.5.1/24", "192.168.5.2/24", "192.168.5.3/24", "192.168.5.4/24"),
    };
    int i_run;

    for (i_run = 0; i_run < 20; i_run++) {
        gs_free const char **addrs_before = NULL;
        gs_free const char **addrs_new    = NULL;

        addrs_before = nmtst_rand_perm_strv(LISTS[nmtst_get_rand_uint32() % G_N_ELEMENTS(LISTS)]);
        addrs_new    = nmtst_rand_perm_strv(LISTS[nmtst_get_rand_uint32() % G_N_ELEMENTS(LISTS)]);

        _test_ri4a(addrs_before, addrs_new);
    }

    _test_ri4a(NM_MAKE_STRV(), NM_MAKE_STRV());
    _test_ri4a(NM_MAKE_STRV(), NM_MAKE_STRV("192.168.5.1/24"));
    _test_ri4a(NM_MAKE_STRV(), NM_MAKE_STRV("192.168.5.1/24", "192.168.5.2/24"));
    _test_ri4a(NM_MAKE_STRV("192.168.5.1/24"), NM_MAKE_STRV());
    _test_ri4a(NM_MAKE_STRV("192.168.5.1/24"), NM_MAKE_STRV("192.168.5.1/24"));
    _test_ri4a(NM_MAKE_STRV("192.168.5.1/24", "192.168.5.2/24"), NM_MAKE_STRV());
    _test_ri4a(NM_MAKE_STRV("192.168.5.1/24", "192.168.5.2/24"), NM_MAKE_STRV("192.168.5.1/24"));
    _test_ri4a(NM_MAKE_STRV("192.168.5.1/24", "192.168.5.2/24"), NM_MAKE_STRV("192.168.5.2/24"));
}

/*****************************************************************************/

NMTST_DEFINE();

int
main(int argc, char **argv)
{
    nmtst_init(&argc, &argv, TRUE);

    g_test_add_func("/cloud-setup/general/replace-ipv4-addresses", test_replace_ipv4_addresses);

    return g_test_run();
}