From b65d6ab5dcba7332967935084e1732247b1098a5 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 31 May 2024 12:56:11 +0100 Subject: [PATCH 1/5] resolved: tests for dns_search_domain_new() --- src/resolve/meson.build | 13 +++++ src/resolve/test-dns-search-domain.c | 74 ++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/resolve/test-dns-search-domain.c diff --git a/src/resolve/meson.build b/src/resolve/meson.build index 42bd4beb74..f4c868f2d6 100644 --- a/src/resolve/meson.build +++ b/src/resolve/meson.build @@ -197,6 +197,19 @@ executables += [ 'sources' : files('test-dnssec-complex.c'), 'type' : 'manual', }, + test_template + { + 'sources' : [ + files('test-dns-search-domain.c'), + basic_dns_sources, + systemd_resolved_sources, + ], + 'dependencies' : [ + lib_openssl_or_gcrypt, + libm, + systemd_resolved_dependencies, + ], + 'include_directories' : resolve_includes, + }, test_template + { 'sources' : [ files('test-resolved-link.c'), diff --git a/src/resolve/test-dns-search-domain.c b/src/resolve/test-dns-search-domain.c new file mode 100644 index 0000000000..d92bee38de --- /dev/null +++ b/src/resolve/test-dns-search-domain.c @@ -0,0 +1,74 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "resolved-dns-search-domain.h" +#include "resolved-link.h" +#include "resolved-manager.h" + +#include "log.h" +#include "tests.h" + +/* ================================================================ + * dns_search_domain_new() + * ================================================================ */ + +TEST(dns_search_domain_new_system) { + Manager manager = {}; + _cleanup_(dns_search_domain_unrefp) DnsSearchDomain *sd = NULL; + + ASSERT_OK(dns_search_domain_new(&manager, &sd, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "local")); + ASSERT_NOT_NULL(sd); + + ASSERT_TRUE(sd->linked); + ASSERT_STREQ(DNS_SEARCH_DOMAIN_NAME(sd), "local"); +} + +TEST(dns_search_domain_new_system_limit) { + Manager manager = {}; + DnsSearchDomain *sd = NULL; + + for (size_t i = 0; i < MANAGER_SEARCH_DOMAINS_MAX; i++) { + ASSERT_OK(dns_search_domain_new(&manager, &sd, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "local")); + ASSERT_NOT_NULL(sd); + ASSERT_EQ(manager.n_search_domains, i + 1); + } + + ASSERT_ERROR(dns_search_domain_new(&manager, &sd, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "local"), E2BIG); + ASSERT_NOT_NULL(sd); + + dns_search_domain_unlink_all(manager.search_domains); +} + +TEST(dns_search_domain_new_link) { + Manager manager = {}; + Link *link = NULL; + _cleanup_(dns_search_domain_unrefp) DnsSearchDomain *sd = NULL; + + ASSERT_OK(link_new(&manager, &link, 1)); + ASSERT_NOT_NULL(link); + + ASSERT_OK(dns_search_domain_new(&manager, &sd, DNS_SEARCH_DOMAIN_LINK, link, "local.")); + ASSERT_NOT_NULL(sd); + + ASSERT_TRUE(sd->linked); + ASSERT_STREQ(DNS_SEARCH_DOMAIN_NAME(sd), "local"); +} + +TEST(dns_search_domain_new_link_limit) { + Manager manager = {}; + _cleanup_(link_freep) Link *link = NULL; + DnsSearchDomain *sd = NULL; + + ASSERT_OK(link_new(&manager, &link, 1)); + ASSERT_NOT_NULL(link); + + for (size_t i = 0; i < LINK_SEARCH_DOMAINS_MAX; i++) { + ASSERT_OK(dns_search_domain_new(&manager, &sd, DNS_SEARCH_DOMAIN_LINK, link, "local")); + ASSERT_NOT_NULL(sd); + ASSERT_EQ(link->n_search_domains, i + 1); + } + + ASSERT_ERROR(dns_search_domain_new(&manager, &sd, DNS_SEARCH_DOMAIN_LINK, link, "local"), E2BIG); + ASSERT_NOT_NULL(sd); +} + +DEFINE_TEST_MAIN(LOG_DEBUG); From 5fef5552a658130f00dc97d0a1003a6a49f3ca96 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 31 May 2024 14:37:01 +0100 Subject: [PATCH 2/5] resolved: tests for dns_search_domain_unlink() --- src/resolve/test-dns-search-domain.c | 70 ++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/src/resolve/test-dns-search-domain.c b/src/resolve/test-dns-search-domain.c index d92bee38de..09e39869f6 100644 --- a/src/resolve/test-dns-search-domain.c +++ b/src/resolve/test-dns-search-domain.c @@ -71,4 +71,74 @@ TEST(dns_search_domain_new_link_limit) { ASSERT_NOT_NULL(sd); } +/* ================================================================ + * dns_search_domain_unlink() + * ================================================================ */ + +TEST(dns_search_domain_unlink_system) { + Manager manager = {}; + _cleanup_(dns_search_domain_unrefp) DnsSearchDomain *sd1 = NULL, *sd3 = NULL; + DnsSearchDomain *sd2 = NULL; + const char *names[2]; + size_t i = 0; + + dns_search_domain_new(&manager, &sd1, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "local"); + ASSERT_NOT_NULL(sd1); + + dns_search_domain_new(&manager, &sd2, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "vpn.example.com"); + ASSERT_NOT_NULL(sd2); + + dns_search_domain_new(&manager, &sd3, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "org"); + ASSERT_NOT_NULL(sd3); + + ASSERT_TRUE(sd2->linked); + ASSERT_EQ(manager.n_search_domains, 3u); + + dns_search_domain_unlink(sd2); + + ASSERT_EQ(manager.n_search_domains, 2u); + + LIST_FOREACH(domains, d, manager.search_domains) { + names[i++] = DNS_SEARCH_DOMAIN_NAME(d); + } + + ASSERT_STREQ(names[0], "local"); + ASSERT_STREQ(names[1], "org"); +} + +TEST(dns_search_domain_unlink_link) { + Manager manager = {}; + Link *link = NULL; + _cleanup_(dns_search_domain_unrefp) DnsSearchDomain *sd1 = NULL, *sd3 = NULL; + DnsSearchDomain *sd2 = NULL; + const char *names[2]; + unsigned int i = 0; + + link_new(&manager, &link, 1); + ASSERT_NOT_NULL(link); + + dns_search_domain_new(&manager, &sd1, DNS_SEARCH_DOMAIN_LINK, link, "local"); + ASSERT_NOT_NULL(sd1); + + dns_search_domain_new(&manager, &sd2, DNS_SEARCH_DOMAIN_LINK, link, "vpn.example.com"); + ASSERT_NOT_NULL(sd2); + + dns_search_domain_new(&manager, &sd3, DNS_SEARCH_DOMAIN_LINK, link, "org"); + ASSERT_NOT_NULL(sd3); + + ASSERT_TRUE(sd2->linked); + ASSERT_EQ(link->n_search_domains, 3u); + + dns_search_domain_unlink(sd2); + + ASSERT_EQ(link->n_search_domains, 2u); + + LIST_FOREACH(domains, d, link->search_domains) { + names[i++] = DNS_SEARCH_DOMAIN_NAME(d); + } + + ASSERT_STREQ(names[0], "local"); + ASSERT_STREQ(names[1], "org"); +} + DEFINE_TEST_MAIN(LOG_DEBUG); From 61362d49f8727a5d1b72ab2a20266ab620364632 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 31 May 2024 14:50:20 +0100 Subject: [PATCH 3/5] resolved: extract function for checking search domains --- src/resolve/test-dns-search-domain.c | 34 +++++++++++++++------------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/resolve/test-dns-search-domain.c b/src/resolve/test-dns-search-domain.c index 09e39869f6..2c18af7aad 100644 --- a/src/resolve/test-dns-search-domain.c +++ b/src/resolve/test-dns-search-domain.c @@ -7,6 +7,20 @@ #include "log.h" #include "tests.h" +static void check_domains(DnsSearchDomain *head, const char **expected, size_t n) { + size_t i = 0; + + ASSERT_NOT_NULL(head); + ASSERT_NOT_NULL(expected); + + LIST_FOREACH(domains, d, head) { + ASSERT_STREQ(DNS_SEARCH_DOMAIN_NAME(d), expected[i]); + i++; + } + + ASSERT_EQ(i, n); +} + /* ================================================================ * dns_search_domain_new() * ================================================================ */ @@ -79,8 +93,6 @@ TEST(dns_search_domain_unlink_system) { Manager manager = {}; _cleanup_(dns_search_domain_unrefp) DnsSearchDomain *sd1 = NULL, *sd3 = NULL; DnsSearchDomain *sd2 = NULL; - const char *names[2]; - size_t i = 0; dns_search_domain_new(&manager, &sd1, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "local"); ASSERT_NOT_NULL(sd1); @@ -98,12 +110,8 @@ TEST(dns_search_domain_unlink_system) { ASSERT_EQ(manager.n_search_domains, 2u); - LIST_FOREACH(domains, d, manager.search_domains) { - names[i++] = DNS_SEARCH_DOMAIN_NAME(d); - } - - ASSERT_STREQ(names[0], "local"); - ASSERT_STREQ(names[1], "org"); + const char *expected[] = { "local", "org" }; + check_domains(manager.search_domains, expected, 2); } TEST(dns_search_domain_unlink_link) { @@ -111,8 +119,6 @@ TEST(dns_search_domain_unlink_link) { Link *link = NULL; _cleanup_(dns_search_domain_unrefp) DnsSearchDomain *sd1 = NULL, *sd3 = NULL; DnsSearchDomain *sd2 = NULL; - const char *names[2]; - unsigned int i = 0; link_new(&manager, &link, 1); ASSERT_NOT_NULL(link); @@ -133,12 +139,8 @@ TEST(dns_search_domain_unlink_link) { ASSERT_EQ(link->n_search_domains, 2u); - LIST_FOREACH(domains, d, link->search_domains) { - names[i++] = DNS_SEARCH_DOMAIN_NAME(d); - } - - ASSERT_STREQ(names[0], "local"); - ASSERT_STREQ(names[1], "org"); + const char *expected[] = { "local", "org" }; + check_domains(link->search_domains, expected, 2); } DEFINE_TEST_MAIN(LOG_DEBUG); From 76bd2dce23005bde1d2c5815e6ffb124266b20e7 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 31 May 2024 15:11:53 +0100 Subject: [PATCH 4/5] resolved: tests for search domain marking and unlinking --- src/resolve/test-dns-search-domain.c | 116 +++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/src/resolve/test-dns-search-domain.c b/src/resolve/test-dns-search-domain.c index 2c18af7aad..b0d9a01fae 100644 --- a/src/resolve/test-dns-search-domain.c +++ b/src/resolve/test-dns-search-domain.c @@ -143,4 +143,120 @@ TEST(dns_search_domain_unlink_link) { check_domains(link->search_domains, expected, 2); } +/* ================================================================ + * dns_search_domain_mark_all() + * ================================================================ */ + +TEST(dns_search_domain_mark_all) { + Manager manager = {}; + _cleanup_(dns_search_domain_unrefp) DnsSearchDomain *sd1 = NULL, *sd2 = NULL, *sd3 = NULL; + + dns_search_domain_new(&manager, &sd1, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "local"); + ASSERT_NOT_NULL(sd1); + + dns_search_domain_new(&manager, &sd2, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "vpn.example.com"); + ASSERT_NOT_NULL(sd2); + + dns_search_domain_new(&manager, &sd3, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "org"); + ASSERT_NOT_NULL(sd3); + + ASSERT_FALSE(sd1->marked); + ASSERT_FALSE(sd2->marked); + ASSERT_FALSE(sd3->marked); + + dns_search_domain_mark_all(sd1); + + ASSERT_TRUE(sd1->marked); + ASSERT_TRUE(sd2->marked); + ASSERT_TRUE(sd3->marked); +} + +/* ================================================================ + * dns_search_domain_move_back_and_unmark() + * ================================================================ */ + +TEST(dns_search_domain_move_back_and_unmark) { + Manager manager = {}; + _cleanup_(dns_search_domain_unrefp) DnsSearchDomain *sd1 = NULL, *sd2 = NULL, *sd3 = NULL; + + dns_search_domain_new(&manager, &sd1, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "local"); + ASSERT_NOT_NULL(sd1); + + dns_search_domain_new(&manager, &sd2, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "vpn.example.com"); + ASSERT_NOT_NULL(sd2); + + dns_search_domain_new(&manager, &sd3, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "org"); + ASSERT_NOT_NULL(sd3); + + dns_search_domain_move_back_and_unmark(sd1); + check_domains(manager.search_domains, (const char *[]) { "local", "vpn.example.com", "org" }, 3); + + sd1->marked = 1; + + dns_search_domain_move_back_and_unmark(sd1); + check_domains(manager.search_domains, (const char *[]) { "vpn.example.com", "org", "local" }, 3); + + sd3->marked = 1; + + dns_search_domain_move_back_and_unmark(sd3); + check_domains(manager.search_domains, (const char *[]) { "vpn.example.com", "local", "org" }, 3); +} + +/* ================================================================ + * dns_search_domain_unlink_marked() + * ================================================================ */ + +TEST(dns_search_domain_unlink_marked) { + Manager manager = {}; + DnsSearchDomain *sd1 = NULL, *sd2 = NULL; + _cleanup_(dns_search_domain_unrefp) DnsSearchDomain *sd3 = NULL; + + dns_search_domain_new(&manager, &sd1, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "local"); + ASSERT_NOT_NULL(sd1); + + dns_search_domain_new(&manager, &sd2, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "vpn.example.com"); + ASSERT_NOT_NULL(sd2); + + dns_search_domain_new(&manager, &sd3, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "org"); + ASSERT_NOT_NULL(sd3); + + dns_search_domain_unlink_marked(sd1); + ASSERT_EQ(manager.n_search_domains, 3u); + check_domains(manager.search_domains, (const char *[]) { "local", "vpn.example.com", "org" }, 3); + + sd2->marked = 1; + + dns_search_domain_unlink_marked(sd1); + ASSERT_EQ(manager.n_search_domains, 2u); + check_domains(manager.search_domains, (const char *[]) { "local", "org" }, 2); + + sd1->marked = 1; + + dns_search_domain_unlink_marked(sd1); + ASSERT_EQ(manager.n_search_domains, 1u); + check_domains(manager.search_domains, (const char *[]) { "org" }, 1); +} + +/* ================================================================ + * dns_search_domain_unlink_all() + * ================================================================ */ + +TEST(dns_search_domain_unlink_all) { + Manager manager = {}; + DnsSearchDomain *sd1 = NULL, *sd2 = NULL, *sd3 = NULL; + + dns_search_domain_new(&manager, &sd1, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "local"); + ASSERT_NOT_NULL(sd1); + + dns_search_domain_new(&manager, &sd2, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "vpn.example.com"); + ASSERT_NOT_NULL(sd2); + + dns_search_domain_new(&manager, &sd3, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "org"); + ASSERT_NOT_NULL(sd3); + + dns_search_domain_unlink_all(sd1); + + ASSERT_EQ(manager.n_search_domains, 0u); +} + DEFINE_TEST_MAIN(LOG_DEBUG); From 771b5a4091a9f523a2c9089733a72f9640db921c Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 31 May 2024 15:15:48 +0100 Subject: [PATCH 5/5] resolved: tests for dns_search_domain_find() --- src/resolve/test-dns-search-domain.c | 30 ++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/resolve/test-dns-search-domain.c b/src/resolve/test-dns-search-domain.c index b0d9a01fae..45adb9129c 100644 --- a/src/resolve/test-dns-search-domain.c +++ b/src/resolve/test-dns-search-domain.c @@ -259,4 +259,34 @@ TEST(dns_search_domain_unlink_all) { ASSERT_EQ(manager.n_search_domains, 0u); } +/* ================================================================ + * dns_search_domain_find() + * ================================================================ */ + +TEST(dns_search_domain_find) { + Manager manager = {}; + _cleanup_(dns_search_domain_unrefp) DnsSearchDomain *sd1 = NULL, *sd2 = NULL, *sd3 = NULL, *ret = NULL; + + dns_search_domain_new(&manager, &sd1, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "local"); + ASSERT_NOT_NULL(sd1); + + dns_search_domain_new(&manager, &sd2, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "vpn.example.com"); + ASSERT_NOT_NULL(sd2); + + dns_search_domain_new(&manager, &sd3, DNS_SEARCH_DOMAIN_SYSTEM, NULL, "org"); + ASSERT_NOT_NULL(sd3); + + ASSERT_TRUE(dns_search_domain_find(sd1, "local", &ret)); + ASSERT_TRUE(ret == sd1); + + ASSERT_TRUE(dns_search_domain_find(sd1, "org", &ret)); + ASSERT_TRUE(ret == sd3); + + ASSERT_TRUE(dns_search_domain_find(sd1, "vpn.example.com", &ret)); + ASSERT_TRUE(ret == sd2); + + ASSERT_FALSE(dns_search_domain_find(sd1, "co.uk", &ret)); + ASSERT_NULL(ret); +} + DEFINE_TEST_MAIN(LOG_DEBUG);