1
0
mirror of https://github.com/systemd/systemd.git synced 2024-10-27 01:55:22 +03:00

Merge pull request #33530 from neighbourhoodie/tests/dns-search-domain

This commit is contained in:
Luca Boccassi 2024-07-23 13:23:44 +01:00
commit c01267c4a9
2 changed files with 305 additions and 0 deletions

View File

@ -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'),

View File

@ -0,0 +1,292 @@
/* 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"
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()
* ================================================================ */
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);
}
/* ================================================================
* 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;
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);
const char *expected[] = { "local", "org" };
check_domains(manager.search_domains, expected, 2);
}
TEST(dns_search_domain_unlink_link) {
Manager manager = {};
Link *link = NULL;
_cleanup_(dns_search_domain_unrefp) DnsSearchDomain *sd1 = NULL, *sd3 = NULL;
DnsSearchDomain *sd2 = NULL;
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);
const char *expected[] = { "local", "org" };
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);
}
/* ================================================================
* 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);