diff options
author | Thomas Haller <thaller@redhat.com> | 2021-02-10 19:25:18 +0100 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2021-02-10 19:25:18 +0100 |
commit | d27ce971952d2d6d3728d49cd11072ea489b6944 (patch) | |
tree | fa82e52bccca61b1a98a2ecd143534c879d9444b | |
parent | d24ad0a2023e22ba4a39393e1b3e1840b76440e6 (diff) | |
parent | d0552e00d0f1dabd6a8f6b01f3617fc4b282c78b (diff) | |
download | NetworkManager-d27ce971952d2d6d3728d49cd11072ea489b6944.tar.gz |
cloud-setup: merge branch 'th/cloud-setup-fix-replace-addr'
https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/747
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | Makefile.am | 53 | ||||
-rw-r--r-- | clients/cloud-setup/meson.build | 33 | ||||
-rw-r--r-- | clients/cloud-setup/nm-cloud-setup-utils.c | 2 | ||||
-rw-r--r-- | clients/cloud-setup/tests/meson.build | 20 | ||||
-rw-r--r-- | clients/cloud-setup/tests/test-cloud-setup-general.c | 117 | ||||
-rw-r--r-- | shared/nm-utils/nm-test-utils.h | 42 |
7 files changed, 261 insertions, 9 deletions
diff --git a/.gitignore b/.gitignore index 0a7f0c195a..3524f7082e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ *.gcno *.gcda *.la +*.a *-*.gir *.typelib *.stamp @@ -70,11 +71,11 @@ test-*.trs /clients/cli/nmcli /clients/cloud-setup/nm-cloud-setup /clients/cloud-setup/nm-cloud-setup.service +/clients/cloud-setup/tests/test-cloud-setup-general /clients/common/settings-docs.h /clients/common/tests/test-clients-common /clients/common/tests/test-libnm-core-aux /clients/nm-online -/clients/tui/newt/libnmt-newt.a /clients/tui/nmtui /data/NetworkManager.service diff --git a/Makefile.am b/Makefile.am index 6c6b3c2ed9..f2fb9288e3 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4990,10 +4990,9 @@ EXTRA_DIST += \ if BUILD_NM_CLOUD_SETUP -libexec_PROGRAMS += clients/cloud-setup/nm-cloud-setup +noinst_LIBRARIES += clients/cloud-setup/libnm-cloud-setup-core.a -clients_cloud_setup_nm_cloud_setup_SOURCES = \ - clients/cloud-setup/main.c \ +clients_cloud_setup_libnm_cloud_setup_core_a_SOURCES = \ clients/cloud-setup/nm-cloud-setup-utils.c \ clients/cloud-setup/nm-cloud-setup-utils.h \ clients/cloud-setup/nm-http-client.c \ @@ -5008,6 +5007,21 @@ clients_cloud_setup_nm_cloud_setup_SOURCES = \ clients/cloud-setup/nmcs-provider-azure.h \ $(NULL) +clients_cloud_setup_libnm_cloud_setup_core_a_CPPFLAGS = \ + $(clients_cppflags) \ + -DG_LOG_DOMAIN=\""nm-cloud-setup"\" \ + $(LIBCURL_CFLAGS) \ + $(NULL) + +$(clients_cloud_setup_libnm_cloud_setup_core_a_OBJECTS): $(libnm_core_lib_h_pub_mkenums) +$(clients_cloud_setup_libnm_cloud_setup_core_a_OBJECTS): $(libnm_lib_h_pub_mkenums) + +libexec_PROGRAMS += clients/cloud-setup/nm-cloud-setup + +clients_cloud_setup_nm_cloud_setup_SOURCES = \ + clients/cloud-setup/main.c \ + $(NULL) + clients_cloud_setup_nm_cloud_setup_CPPFLAGS = \ $(clients_cppflags) \ -DG_LOG_DOMAIN=\""nm-cloud-setup"\" \ @@ -5020,6 +5034,7 @@ clients_cloud_setup_nm_cloud_setup_LDFLAGS = \ $(NULL) clients_cloud_setup_nm_cloud_setup_LDADD = \ + clients/cloud-setup/libnm-cloud-setup-core.a \ libnm/nm-libnm-aux/libnm-libnm-aux.la \ libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ @@ -5064,11 +5079,43 @@ EXTRA_DIST += \ clients/cloud-setup/meson.build \ clients/cloud-setup/nm-cloud-setup.service.in \ clients/cloud-setup/nm-cloud-setup.timer \ + clients/cloud-setup/tests/meson.build \ $(NULL) CLEANFILES += \ clients/cloud-setup/nm-cloud-setup.service +check_programs += clients/cloud-setup/tests/test-cloud-setup-general + +clients_cloud_setup_tests_test_cloud_setup_general_CPPFLAGS = \ + $(clients_cppflags) \ + -I$(srcdir)/clients/cloud-setup \ + -DG_LOG_DOMAIN=\""tests"\" \ + $(LIBCURL_CFLAGS) \ + $(NULL) + +clients_cloud_setup_tests_test_cloud_setup_general_LDFLAGS = \ + $(CODE_COVERAGE_LDFLAGS) \ + $(SANITIZER_EXEC_LDFLAGS) \ + $(NULL) + +clients_cloud_setup_tests_test_cloud_setup_general_LDADD = \ + clients/cloud-setup/libnm-cloud-setup-core.a \ + libnm/nm-libnm-aux/libnm-libnm-aux.la \ + libnm-core/nm-libnm-core-aux/libnm-libnm-core-aux.la \ + libnm-core/nm-libnm-core-intern/libnm-libnm-core-intern.la \ + shared/nm-base/libnm-base.la \ + shared/nm-glib-aux/libnm-glib-aux.la \ + shared/nm-std-aux/libnm-std-aux.la \ + shared/libcsiphash.la \ + libnm/libnm.la \ + $(GLIB_LIBS) \ + $(LIBCURL_LIBS) \ + $(NULL) + +$(clients_cloud_setup_tests_test_cloud_setup_general_OBJECTS): $(libnm_core_lib_h_pub_mkenums) +$(clients_cloud_setup_tests_test_cloud_setup_general_OBJECTS): $(libnm_lib_h_pub_mkenums) + endif ############################################################################### diff --git a/clients/cloud-setup/meson.build b/clients/cloud-setup/meson.build index 5b48229971..581dde6a18 100644 --- a/clients/cloud-setup/meson.build +++ b/clients/cloud-setup/meson.build @@ -21,10 +21,9 @@ if install_systemdunitdir endif -executable( - 'nm-cloud-setup', - files( - 'main.c', +libnm_cloud_setup_core = static_library( + 'nm-cloud-setup-core', + sources: files( 'nm-cloud-setup-utils.c', 'nm-http-client.c', 'nmcs-provider-ec2.c', @@ -41,9 +40,35 @@ executable( c_args: [ '-DG_LOG_DOMAIN="nm-cloud-setup"', ], +) + +libnm_cloud_setup_core_dep = declare_dependency( + include_directories: include_directories('.'), + link_with: libnm_cloud_setup_core, +) + +executable( + 'nm-cloud-setup', + files( + 'main.c', + ), + dependencies: [ + libnmc_base_dep, + libnmc_dep, + libcurl_dep, + libnm_libnm_aux_dep, + libnm_cloud_setup_core_dep, + ], + c_args: [ + '-DG_LOG_DOMAIN="nm-cloud-setup"', + ], link_with: libnm_systemd_logging_stub, link_args: ldflags_linker_script_binary, link_depends: linker_script_binary, install: true, install_dir: nm_libexecdir, ) + +if enable_tests + subdir('tests') +endif diff --git a/clients/cloud-setup/nm-cloud-setup-utils.c b/clients/cloud-setup/nm-cloud-setup-utils.c index 6d446343fc..f5550a1286 100644 --- a/clients/cloud-setup/nm-cloud-setup-utils.c +++ b/clients/cloud-setup/nm-cloud-setup-utils.c @@ -704,7 +704,7 @@ nmcs_setting_ip_replace_ipv4_addresses(NMSettingIPConfig *s_ip, i_next++; } - if (any_changes) { + if (!any_changes) { while (i_next < num) { nm_setting_ip_config_remove_address(s_ip, --num); any_changes = TRUE; diff --git a/clients/cloud-setup/tests/meson.build b/clients/cloud-setup/tests/meson.build new file mode 100644 index 0000000000..1c5e6ec667 --- /dev/null +++ b/clients/cloud-setup/tests/meson.build @@ -0,0 +1,20 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later + +exe = executable( + 'test-cloud-setup-general', + 'test-cloud-setup-general.c', + dependencies: [ + libnmc_base_dep, + libnmc_dep, + libnm_cloud_setup_core_dep, + ], + c_args: [ + '-DG_LOG_DOMAIN="test"', + ], +) + +test( + 'clients/cloud-setup/tests/test-cloud-setup-general', + test_script, + args: test_args + [exe.full_path()], +) diff --git a/clients/cloud-setup/tests/test-cloud-setup-general.c b/clients/cloud-setup/tests/test-cloud-setup-general.c new file mode 100644 index 0000000000..63f3c13d59 --- /dev/null +++ b/clients/cloud-setup/tests/test-cloud-setup-general.c @@ -0,0 +1,117 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ + +#include "libnm/nm-default-client.h" + +#include "nm-cloud-setup-utils.h" +#include "nm-libnm-core-intern/nm-libnm-core-utils.h" + +#include "nm-utils/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(); +} diff --git a/shared/nm-utils/nm-test-utils.h b/shared/nm-utils/nm-test-utils.h index 14446562f4..6b41c11ee9 100644 --- a/shared/nm-utils/nm-test-utils.h +++ b/shared/nm-utils/nm-test-utils.h @@ -1001,6 +1001,23 @@ nmtst_rand_perm(GRand *rand, void *dst, const void *src, gsize elmt_size, gsize return dst; } +static inline const char ** +nmtst_rand_perm_strv(const char *const *strv) +{ + const char **res; + gsize n; + + if (!strv) + return NULL; + + /* this returns a (scrambled) SHALLOW copy of the strv array! */ + + n = NM_PTRARRAY_LEN(strv); + res = (const char **) (nm_utils_strv_dup(strv, n, FALSE) ?: g_new0(char *, 1)); + nmtst_rand_perm(NULL, res, res, sizeof(char *), n); + return res; +} + static inline GSList * nmtst_rand_perm_gslist(GRand *rand, GSList *list) { @@ -2762,4 +2779,29 @@ nmtst_keyfile_get_num_keys(GKeyFile *keyfile, const char *group_name) /*****************************************************************************/ +#if defined(NM_SETTING_IP_CONFIG_H) && defined(__NM_SHARED_UTILS_H__) + +static inline NMIPAddress * +nmtst_ip_address_new(int addr_family, const char *str) +{ + NMIPAddr addr; + int plen; + GError * error = NULL; + NMIPAddress *a; + + if (!nm_utils_parse_inaddr_prefix_bin(addr_family, str, &addr_family, &addr, &plen)) + g_assert_not_reached(); + + if (plen == -1) + plen = addr_family == AF_INET ? 32 : 128; + + a = nm_ip_address_new_binary(addr_family, &addr, plen, &error); + nmtst_assert_success(a, error); + return a; +} + +#endif + +/*****************************************************************************/ + #endif /* __NM_TEST_UTILS_H__ */ |