diff options
Diffstat (limited to 'src/core/tests')
| -rw-r--r-- | src/core/tests/meson.build | 1 | ||||
| -rw-r--r-- | src/core/tests/test-netns.c | 69 | ||||
| -rw-r--r-- | src/core/tests/test-utils.c | 65 |
3 files changed, 135 insertions, 0 deletions
diff --git a/src/core/tests/meson.build b/src/core/tests/meson.build index 78c689f7..31acad94 100644 --- a/src/core/tests/meson.build +++ b/src/core/tests/meson.build @@ -6,6 +6,7 @@ test_units = [ 'test-core', 'test-core-with-expect', 'test-dcb', + 'test-netns', 'test-l3cfg', 'test-utils', 'test-wired-defname', diff --git a/src/core/tests/test-netns.c b/src/core/tests/test-netns.c new file mode 100644 index 00000000..26ecbcb8 --- /dev/null +++ b/src/core/tests/test-netns.c @@ -0,0 +1,69 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "src/core/nm-default-daemon.h" + +#include "nm-netns.h" +#include "nm-test-utils-core.h" + +static void +test_ip_reservation_shared4(void) +{ + gs_unref_object NMPlatform *platform = NULL; + gs_unref_object NMNetns *netns = NULL; + NMNetnsIPReservation *res[256]; + NMNetnsIPReservation *res1; + NMNetnsIPReservation *res2; + char buf[NM_INET_ADDRSTRLEN]; + guint i; + + platform = g_object_ref(NM_PLATFORM_GET); + netns = nm_netns_new(platform); + + /* Allocate addresses from 10.42.0.1 to 10.42.255.1 */ + for (i = 0; i < 256; i++) { + res[i] = nm_netns_ip_reservation_get(netns, NM_NETNS_IP_RESERVATION_TYPE_SHARED4); + g_snprintf(buf, sizeof(buf), "10.42.%u.1", i); + nmtst_assert_ip4_address(res[i]->addr, buf); + g_assert_cmpint(res[i]->_ref_count, ==, 1); + } + + /* Release an address and get it back */ + nm_netns_ip_reservation_release(res[139]); + res[139] = nm_netns_ip_reservation_get(netns, NM_NETNS_IP_RESERVATION_TYPE_SHARED4); + nmtst_assert_ip4_address(res[139]->addr, "10.42.139.1"); + + /* Reuse 10.42.255.1 once */ + NMTST_EXPECT_NM_ERROR("netns[*]: shared-ip4: ran out of IP addresses. Reuse 10.42.255.1/24"); + res1 = nm_netns_ip_reservation_get(netns, NM_NETNS_IP_RESERVATION_TYPE_SHARED4); + g_test_assert_expected_messages(); + nmtst_assert_ip4_address(res1->addr, "10.42.255.1"); + g_assert_cmpint(res1->_ref_count, ==, 2); + + /* Reuse 10.42.255.1 twice */ + res2 = nm_netns_ip_reservation_get(netns, NM_NETNS_IP_RESERVATION_TYPE_SHARED4); + g_assert(res2 == res1); + nmtst_assert_ip4_address(res1->addr, "10.42.255.1"); + g_assert_cmpint(res2->_ref_count, ==, 3); + + /* Release all */ + nm_netns_ip_reservation_release(res1); + nm_netns_ip_reservation_release(res2); + for (i = 0; i < 256; i++) { + nm_netns_ip_reservation_release(res[i]); + } +} + +/*****************************************************************************/ + +NMTST_DEFINE(); + +int +main(int argc, char **argv) +{ + nmtst_init_with_logging(&argc, &argv, NULL, "ALL"); + nm_linux_platform_setup(); + + g_test_add_func("/netns/ip_reservation/shared4", test_ip_reservation_shared4); + + return g_test_run(); +} diff --git a/src/core/tests/test-utils.c b/src/core/tests/test-utils.c index 2bcb6f69..0418d3ae 100644 --- a/src/core/tests/test-utils.c +++ b/src/core/tests/test-utils.c @@ -261,6 +261,70 @@ test_shorten_hostname(void) } /*****************************************************************************/ +typedef struct { + NMRateLimit ratelimit; + GMainLoop *loop; + GSource *source; + guint num; +} RateLimitData; + +static int +rate_limit_window_expire_cb(gpointer user_data) +{ + RateLimitData *data = user_data; + + g_assert(nm_rate_limit_check(&data->ratelimit, 1, 5)); + g_assert(nm_rate_limit_check(&data->ratelimit, 1, 5)); + g_assert(nm_rate_limit_check(&data->ratelimit, 1, 5)); + g_assert(nm_rate_limit_check(&data->ratelimit, 1, 5)); + g_assert(nm_rate_limit_check(&data->ratelimit, 1, 5)); + + g_assert(!nm_rate_limit_check(&data->ratelimit, 1, 5)); + g_assert(!nm_rate_limit_check(&data->ratelimit, 1, 5)); + + nm_clear_g_source_inst(&data->source); + g_main_loop_quit(data->loop); + + return G_SOURCE_CONTINUE; +} + +static int +rate_limit_check_cb(gpointer user_data) +{ + RateLimitData *data = user_data; + + g_assert(nm_rate_limit_check(&data->ratelimit, 1, 5)); + g_assert(nm_rate_limit_check(&data->ratelimit, 1, 5)); + g_assert(nm_rate_limit_check(&data->ratelimit, 1, 5)); + g_assert(nm_rate_limit_check(&data->ratelimit, 1, 5)); + g_assert(nm_rate_limit_check(&data->ratelimit, 1, 5)); + + g_assert(!nm_rate_limit_check(&data->ratelimit, 1, 5)); + g_assert(!nm_rate_limit_check(&data->ratelimit, 1, 5)); + + nm_clear_g_source_inst(&data->source); + data->source = nm_g_timeout_add_source(1000, rate_limit_window_expire_cb, data); + + return G_SOURCE_CONTINUE; +} + +static void +test_rate_limit_check(void) +{ + RateLimitData data; + + data = (RateLimitData) { + .loop = g_main_loop_new(NULL, FALSE), + .ratelimit = {}, + .source = nm_g_timeout_add_source(1, rate_limit_check_cb, &data), + .num = 0, + }; + + g_main_loop_run(data.loop); + g_main_loop_unref(data.loop); +} + +/*****************************************************************************/ NMTST_DEFINE(); @@ -272,6 +336,7 @@ main(int argc, char **argv) g_test_add_func("/utils/stable_privacy", test_stable_privacy); g_test_add_func("/utils/hw_addr_gen_stable_eth", test_hw_addr_gen_stable_eth); g_test_add_func("/utils/shorten-hostname", test_shorten_hostname); + g_test_add_func("/utils/rate-limit-check", test_rate_limit_check); return g_test_run(); } |