From f5c7bc2684ce7bbfc4dd0d9478824ceaedd5ed05 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Thu, 30 May 2024 16:55:34 +0100 Subject: [PATCH 01/12] resolved: tests for dns_question_add() --- src/resolve/meson.build | 3 ++ src/resolve/test-dns-question.c | 53 +++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) create mode 100644 src/resolve/test-dns-question.c diff --git a/src/resolve/meson.build b/src/resolve/meson.build index 20caecee0f..4fc2bc8006 100644 --- a/src/resolve/meson.build +++ b/src/resolve/meson.build @@ -174,6 +174,9 @@ executables += [ resolve_test_template + { 'sources' : files('test-dns-rr.c'), }, + resolve_test_template + { + 'sources' : files('test-dns-question.c'), + }, resolve_test_template + { 'sources' : files( 'test-resolved-etc-hosts.c', diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c new file mode 100644 index 0000000000..6ea6ef7670 --- /dev/null +++ b/src/resolve/test-dns-question.c @@ -0,0 +1,53 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "dns-type.h" +#include "resolved-dns-question.h" +#include "resolved-dns-rr.h" + +#include "log.h" +#include "tests.h" + +/* ================================================================ + * dns_question_add() + * ================================================================ */ + +TEST(dns_question_add_full) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + question = dns_question_new(0); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + + ASSERT_ERROR(dns_question_add(question, key, 0), ENOSPC); + + ASSERT_FALSE(dns_question_contains_key(question, key)); + + assert(dns_question_size(question) == 0); + assert(dns_question_isempty(question) == 1); +} + +TEST(dns_question_add_with_space) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + assert(dns_question_size(question) == 0); + assert(dns_question_isempty(question) == 1); + + question = dns_question_new(1); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + + ASSERT_OK(dns_question_add(question, key, 0)); + + ASSERT_TRUE(dns_question_contains_key(question, key)); + + assert(dns_question_size(question) == 1); + assert(dns_question_isempty(question) == 0); +} + +DEFINE_TEST_MAIN(LOG_DEBUG); From 7ce89229c715efcf1371426060263f9a0783651b Mon Sep 17 00:00:00 2001 From: James Coglan Date: Thu, 30 May 2024 17:22:30 +0100 Subject: [PATCH 02/12] resolved: tests for dns_question_new_address() --- src/resolve/test-dns-question.c | 48 +++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c index 6ea6ef7670..3513b7630e 100644 --- a/src/resolve/test-dns-question.c +++ b/src/resolve/test-dns-question.c @@ -50,4 +50,52 @@ TEST(dns_question_add_with_space) { assert(dns_question_isempty(question) == 0); } +/* ================================================================ + * dns_question_new_address() + * ================================================================ */ + +TEST(dns_question_new_address_ipv4) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + ASSERT_OK(dns_question_new_address(&question, AF_INET, "www.example.com", 0)); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + + ASSERT_EQ(dns_question_size(question), 1u); + ASSERT_TRUE(dns_question_contains_key(question, key)); +} + +TEST(dns_question_new_address_ipv6) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + ASSERT_OK(dns_question_new_address(&question, AF_INET6, "www.example.com", 0)); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, "www.example.com"); + ASSERT_NOT_NULL(key); + + ASSERT_EQ(dns_question_size(question), 1u); + ASSERT_TRUE(dns_question_contains_key(question, key)); +} + +#if HAVE_LIBIDN || HAVE_LIBIDN2 +TEST(dns_question_new_address_convert_idna) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + ASSERT_OK(dns_question_new_address(&question, AF_INET, "www.\xF0\x9F\x98\xB1.com", 1)); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.xn--s38h.com"); + ASSERT_NOT_NULL(key); + + ASSERT_EQ(dns_question_size(question), 1u); + ASSERT_TRUE(dns_question_contains_key(question, key)); +} +#endif + DEFINE_TEST_MAIN(LOG_DEBUG); From eaf339f99031695e0c8e1881fb4964c8c7d8bb03 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Thu, 30 May 2024 17:37:54 +0100 Subject: [PATCH 03/12] resolved: tests for dns_question_new_reverse() --- src/resolve/test-dns-question.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c index 3513b7630e..880bb996d8 100644 --- a/src/resolve/test-dns-question.c +++ b/src/resolve/test-dns-question.c @@ -98,4 +98,24 @@ TEST(dns_question_new_address_convert_idna) { } #endif +/* ================================================================ + * dns_question_new_reverse() + * ================================================================ */ + +TEST(dns_question_new_reverse_ipv4) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + union in_addr_union addr = { .in.s_addr = htobe32(0xc0a8017f) }; + + ASSERT_OK(dns_question_new_reverse(&question, AF_INET, &addr)); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_PTR, "127.1.168.192.in-addr.arpa"); + ASSERT_NOT_NULL(key); + + ASSERT_EQ(dns_question_size(question), 1u); + ASSERT_TRUE(dns_question_contains_key(question, key)); +} + DEFINE_TEST_MAIN(LOG_DEBUG); From acd20dc9b90014c2b8b2674335a351bd0fd09e80 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Thu, 30 May 2024 18:11:10 +0100 Subject: [PATCH 04/12] resolved: tests for dns_question_new_service() --- src/resolve/test-dns-question.c | 125 ++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c index 880bb996d8..ff75fa08e5 100644 --- a/src/resolve/test-dns-question.c +++ b/src/resolve/test-dns-question.c @@ -118,4 +118,129 @@ TEST(dns_question_new_reverse_ipv4) { ASSERT_TRUE(dns_question_contains_key(question, key)); } +/* ================================================================ + * dns_question_new_service() + * ================================================================ */ + +TEST(dns_question_new_service_no_domain) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + + ASSERT_ERROR(dns_question_new_service(&question, NULL, "_xmpp._tcp", NULL, 0, 0), EINVAL); + ASSERT_NULL(question); +} + +TEST(dns_question_new_service_domain_only) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + ASSERT_OK(dns_question_new_service(&question, NULL, NULL, "www.example.com", 0, 0)); + ASSERT_NOT_NULL(question); + ASSERT_EQ(dns_question_size(question), 1u); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_SRV, "www.example.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(question, key)); +} + +TEST(dns_question_new_service_domain_ignores_idna) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + ASSERT_OK(dns_question_new_service(&question, NULL, NULL, "\xF0\x9F\x98\xB1.com", 0, 1)); + ASSERT_NOT_NULL(question); + ASSERT_EQ(dns_question_size(question), 1u); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_SRV, "\xF0\x9F\x98\xB1.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(question, key)); +} + +TEST(dns_question_new_service_with_type) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + ASSERT_OK(dns_question_new_service(&question, NULL, "_xmpp._tcp", "example.com", 0, 0)); + ASSERT_NOT_NULL(question); + ASSERT_EQ(dns_question_size(question), 1u); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_SRV, "_xmpp._tcp.example.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(question, key)); +} + +#if HAVE_LIBIDN || HAVE_LIBIDN2 +TEST(dns_question_new_service_with_type_applies_idna) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + ASSERT_OK(dns_question_new_service(&question, NULL, "_xmpp._tcp", "\xF0\x9F\x98\xB1.com", 0, 1)); + ASSERT_NOT_NULL(question); + ASSERT_EQ(dns_question_size(question), 1u); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_SRV, "_xmpp._tcp.xn--s38h.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(question, key)); +} + +TEST(dns_question_new_service_with_type_with_txt) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + DnsResourceKey *key = NULL; + + ASSERT_OK(dns_question_new_service(&question, NULL, "_xmpp._tcp", "\xF0\x9F\x98\xB1.com", 1, 1)); + ASSERT_NOT_NULL(question); + ASSERT_EQ(dns_question_size(question), 2u); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_SRV, "_xmpp._tcp.xn--s38h.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(question, key)); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_TXT, "_xmpp._tcp.xn--s38h.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(question, key)); + dns_resource_key_unref(key); +} +#endif + +TEST(dns_question_new_service_with_invalid_type) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + + ASSERT_ERROR(dns_question_new_service(&question, NULL, "_xmpp.tcp", "example.com", 0, 0), EINVAL); + ASSERT_NULL(question); +} + +TEST(dns_question_new_service_with_type_too_short) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + + ASSERT_ERROR(dns_question_new_service(&question, NULL, "_xmpp", "example.com", 0, 0), EINVAL); + ASSERT_NULL(question); +} + +TEST(dns_question_new_service_with_type_too_long) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + + ASSERT_ERROR(dns_question_new_service(&question, NULL, "_xmpp._tcp._extra", "example.com", 0, 0), EINVAL); + ASSERT_NULL(question); +} + +TEST(dns_question_new_service_with_service_and_type) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + ASSERT_OK(dns_question_new_service(&question, "service", "_xmpp._tcp", "example.com", 0, 0)); + ASSERT_NOT_NULL(question); + ASSERT_EQ(dns_question_size(question), 1u); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_SRV, "service._xmpp._tcp.example.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(question, key)); +} + +TEST(dns_question_new_service_with_service_no_type) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + + ASSERT_ERROR(dns_question_new_service(&question, "service", NULL, "example.com", 0, 0), EINVAL); + ASSERT_NULL(question); +} + DEFINE_TEST_MAIN(LOG_DEBUG); From 26dab08011af3e7777db66d29de52ff848249366 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Thu, 30 May 2024 18:38:57 +0100 Subject: [PATCH 05/12] resolved: tests for dns_question_matches_rr() --- src/resolve/test-dns-question.c | 73 +++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c index ff75fa08e5..5f68829b1e 100644 --- a/src/resolve/test-dns-question.c +++ b/src/resolve/test-dns-question.c @@ -243,4 +243,77 @@ TEST(dns_question_new_service_with_service_no_type) { ASSERT_NULL(question); } +/* ================================================================ + * dns_question_matches_rr() + * ================================================================ */ + +TEST(dns_question_matches_rr_first) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(2); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "mail.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(rr); + ASSERT_TRUE(dns_question_matches_rr(question, rr, NULL)); +} + +TEST(dns_question_matches_rr_second) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(2); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "mail.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "mail.example.com"); + ASSERT_NOT_NULL(rr); + ASSERT_TRUE(dns_question_matches_rr(question, rr, NULL)); +} + +TEST(dns_question_matches_rr_fail) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(2); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "mail.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_CNAME, "mail.example.com"); + ASSERT_NOT_NULL(rr); + ASSERT_FALSE(dns_question_matches_rr(question, rr, NULL)); +} + DEFINE_TEST_MAIN(LOG_DEBUG); From 482bb31ce3268e05f8396df139c30f4970fc558c Mon Sep 17 00:00:00 2001 From: James Coglan Date: Thu, 30 May 2024 18:46:12 +0100 Subject: [PATCH 06/12] resolved: tests for dns_question_matches_cname_or_dname() --- src/resolve/test-dns-question.c | 78 +++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c index 5f68829b1e..3cbb3a99ee 100644 --- a/src/resolve/test-dns-question.c +++ b/src/resolve/test-dns-question.c @@ -316,4 +316,82 @@ TEST(dns_question_matches_rr_fail) { ASSERT_FALSE(dns_question_matches_rr(question, rr, NULL)); } +/* ================================================================ + * dns_question_matches_cname_or_dname() + * ================================================================ */ + +TEST(dns_question_matches_cname) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(1); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_CNAME, "www.example.com"); + ASSERT_NOT_NULL(rr); + ASSERT_TRUE(dns_question_matches_cname_or_dname(question, rr, NULL)); +} + +TEST(dns_question_matches_dname) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(1); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_DNAME, "example.com"); + ASSERT_NOT_NULL(rr); + ASSERT_TRUE(dns_question_matches_cname_or_dname(question, rr, NULL)); +} + +TEST(dns_question_matches_cname_or_dname_fail) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(1); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(rr); + ASSERT_FALSE(dns_question_matches_cname_or_dname(question, rr, NULL)); +} + +TEST(dns_question_matches_cname_or_dname_all_must_redirect) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(2); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_CNAME, "example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_CNAME, "www.example.com"); + ASSERT_NOT_NULL(rr); + ASSERT_FALSE(dns_question_matches_cname_or_dname(question, rr, NULL)); +} + DEFINE_TEST_MAIN(LOG_DEBUG); From c530740e201e0af1f5b5eaca61018c0e32163b03 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 31 May 2024 09:37:00 +0100 Subject: [PATCH 07/12] resolved: tests for dns_question_is_valid_for_query() --- src/resolve/test-dns-question.c | 80 +++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c index 3cbb3a99ee..62156ac6e2 100644 --- a/src/resolve/test-dns-question.c +++ b/src/resolve/test-dns-question.c @@ -394,4 +394,84 @@ TEST(dns_question_matches_cname_or_dname_all_must_redirect) { ASSERT_FALSE(dns_question_matches_cname_or_dname(question, rr, NULL)); } +/* ================================================================ + * dns_question_is_valid_for_query() + * ================================================================ */ + +TEST(dns_question_is_valid_for_query_empty) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + + question = dns_question_new(0); + ASSERT_NOT_NULL(question); + ASSERT_FALSE(dns_question_is_valid_for_query(question)); +} + +TEST(dns_question_is_valid_for_query_single) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + question = dns_question_new(1); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + + ASSERT_TRUE(dns_question_is_valid_for_query(question)); +} + +TEST(dns_question_is_valid_for_query_invalid_type) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + _cleanup_(dns_resource_key_unrefp) DnsResourceKey *key = NULL; + + question = dns_question_new(1); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_OPT, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + + ASSERT_FALSE(dns_question_is_valid_for_query(question)); +} + +TEST(dns_question_is_valid_for_query_multi_same_name) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + DnsResourceKey *key = NULL; + + question = dns_question_new(2); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, "www.EXAMPLE.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + ASSERT_TRUE(dns_question_is_valid_for_query(question)); +} + +TEST(dns_question_is_valid_for_query_multi_different_names) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + DnsResourceKey *key = NULL; + + question = dns_question_new(2); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, "www.example.org"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + ASSERT_FALSE(dns_question_is_valid_for_query(question)); +} + DEFINE_TEST_MAIN(LOG_DEBUG); From b45d3501a434bed829bbc57f053fa46f9d57d32d Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 31 May 2024 09:47:11 +0100 Subject: [PATCH 08/12] resolved: tests for dns_question_is_equal() --- src/resolve/test-dns-question.c | 183 ++++++++++++++++++++++++++++++++ 1 file changed, 183 insertions(+) diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c index 62156ac6e2..9f01a0694e 100644 --- a/src/resolve/test-dns-question.c +++ b/src/resolve/test-dns-question.c @@ -474,4 +474,187 @@ TEST(dns_question_is_valid_for_query_multi_different_names) { ASSERT_FALSE(dns_question_is_valid_for_query(question)); } +/* ================================================================ + * dns_question_is_equal() + * ================================================================ */ + +TEST(dns_question_is_equal_same_pointer) { + _cleanup_(dns_question_unrefp) DnsQuestion *a = NULL; + + a = dns_question_new(0); + ASSERT_NOT_NULL(a); + + ASSERT_TRUE(dns_question_is_equal(a, a)); +} + +TEST(dns_question_is_equal_both_empty) { + _cleanup_(dns_question_unrefp) DnsQuestion *a = NULL, *b = NULL; + + a = dns_question_new(0); + ASSERT_NOT_NULL(a); + + b = dns_question_new(0); + ASSERT_NOT_NULL(b); + + ASSERT_TRUE(dns_question_is_equal(a, b)); +} + +TEST(dns_question_is_equal_single) { + _cleanup_(dns_question_unrefp) DnsQuestion *a = NULL, *b = NULL; + DnsResourceKey *key = NULL; + + a = dns_question_new(1); + ASSERT_NOT_NULL(a); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(a, key, 0); + dns_resource_key_unref(key); + + b = dns_question_new(1); + ASSERT_NOT_NULL(b); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.EXAMPLE.com"); + ASSERT_NOT_NULL(key); + dns_question_add(b, key, 0); + dns_resource_key_unref(key); + + ASSERT_TRUE(dns_question_is_equal(a, b)); +} + +TEST(dns_question_is_equal_different_names) { + _cleanup_(dns_question_unrefp) DnsQuestion *a = NULL, *b = NULL; + DnsResourceKey *key = NULL; + + a = dns_question_new(1); + ASSERT_NOT_NULL(a); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(a, key, 0); + dns_resource_key_unref(key); + + b = dns_question_new(1); + ASSERT_NOT_NULL(b); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.org"); + ASSERT_NOT_NULL(key); + dns_question_add(b, key, 0); + dns_resource_key_unref(key); + + ASSERT_FALSE(dns_question_is_equal(a, b)); +} + +TEST(dns_question_is_equal_different_types) { + _cleanup_(dns_question_unrefp) DnsQuestion *a = NULL, *b = NULL; + DnsResourceKey *key = NULL; + + a = dns_question_new(1); + ASSERT_NOT_NULL(a); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(a, key, 0); + dns_resource_key_unref(key); + + b = dns_question_new(1); + ASSERT_NOT_NULL(b); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(b, key, 0); + dns_resource_key_unref(key); + + ASSERT_FALSE(dns_question_is_equal(a, b)); +} + +TEST(dns_question_is_equal_first_larger) { + _cleanup_(dns_question_unrefp) DnsQuestion *a = NULL, *b = NULL; + DnsResourceKey *key = NULL; + + a = dns_question_new(2); + ASSERT_NOT_NULL(a); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(a, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(a, key, 0); + dns_resource_key_unref(key); + + b = dns_question_new(1); + ASSERT_NOT_NULL(b); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(b, key, 0); + dns_resource_key_unref(key); + + ASSERT_FALSE(dns_question_is_equal(a, b)); +} + +TEST(dns_question_is_equal_second_larger) { + _cleanup_(dns_question_unrefp) DnsQuestion *a = NULL, *b = NULL; + DnsResourceKey *key = NULL; + + a = dns_question_new(1); + ASSERT_NOT_NULL(a); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(a, key, 0); + dns_resource_key_unref(key); + + b = dns_question_new(2); + ASSERT_NOT_NULL(b); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(b, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(b, key, 0); + dns_resource_key_unref(key); + + ASSERT_FALSE(dns_question_is_equal(a, b)); +} + +TEST(dns_question_is_equal_different_order) { + _cleanup_(dns_question_unrefp) DnsQuestion *a = NULL, *b = NULL; + DnsResourceKey *key = NULL; + + a = dns_question_new(2); + ASSERT_NOT_NULL(a); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(a, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(a, key, 0); + dns_resource_key_unref(key); + + b = dns_question_new(2); + ASSERT_NOT_NULL(b); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(b, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(b, key, 0); + dns_resource_key_unref(key); + + ASSERT_TRUE(dns_question_is_equal(a, b)); +} + DEFINE_TEST_MAIN(LOG_DEBUG); From 1f24f5bbd4a83923c2fcc21549bcfbf3cd1ccf5f Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 31 May 2024 10:29:44 +0100 Subject: [PATCH 09/12] resolved: tests for dns_question_cname_redirect() --- src/resolve/test-dns-question.c | 181 ++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c index 9f01a0694e..c18169307a 100644 --- a/src/resolve/test-dns-question.c +++ b/src/resolve/test-dns-question.c @@ -657,4 +657,185 @@ TEST(dns_question_is_equal_different_order) { ASSERT_TRUE(dns_question_is_equal(a, b)); } +/* ================================================================ + * dns_question_cname_redirect() + * ================================================================ */ + +TEST(dns_question_cname_redirect_empty) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL, *ret = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(0); + ASSERT_NOT_NULL(question); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_CNAME, "www.example.com"); + ASSERT_NOT_NULL(rr); + rr->cname.name = strdup("example.com"); + + ASSERT_FALSE(dns_question_cname_redirect(question, rr, &ret)); + ASSERT_NULL(ret); +} + +TEST(dns_question_cname_redirect_single_cname_match) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL, *ret = NULL; + DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(1); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_CNAME, "www.example.com"); + ASSERT_NOT_NULL(rr); + rr->cname.name = strdup("example.com"); + + ASSERT_TRUE(dns_question_cname_redirect(question, rr, &ret)); + + ASSERT_NOT_NULL(ret); + ASSERT_TRUE(question != ret); + ASSERT_FALSE(dns_question_is_equal(question, ret)); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(question, key)); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(ret, key)); + dns_resource_key_unref(key); +} + +TEST(dns_question_cname_redirect_single_cname_no_change) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL, *ret = NULL; + DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(1); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_CNAME, "www.example.com"); + ASSERT_NOT_NULL(rr); + rr->cname.name = strdup("example.com"); + + ASSERT_FALSE(dns_question_cname_redirect(question, rr, &ret)); + ASSERT_NULL(ret); +} + +TEST(dns_question_cname_redirect_single_cname_no_match) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL, *ret = NULL; + DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(1); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "mail.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_CNAME, "www.example.com"); + ASSERT_NOT_NULL(rr); + rr->cname.name = strdup("example.com"); + + ASSERT_TRUE(dns_question_cname_redirect(question, rr, &ret)); + + ASSERT_NOT_NULL(ret); + ASSERT_TRUE(question != ret); + ASSERT_FALSE(dns_question_is_equal(question, ret)); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "mail.example.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(question, key)); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "example.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(ret, key)); + dns_resource_key_unref(key); +} + +TEST(dns_question_cname_redirect_single_dname_match) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL, *ret = NULL; + DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(1); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_DNAME, "example.com"); + ASSERT_NOT_NULL(rr); + rr->cname.name = strdup("v2.example.com"); + + ASSERT_TRUE(dns_question_cname_redirect(question, rr, &ret)); + + ASSERT_NOT_NULL(ret); + ASSERT_TRUE(question != ret); + ASSERT_FALSE(dns_question_is_equal(question, ret)); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(question, key)); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.v2.example.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(ret, key)); + dns_resource_key_unref(key); +} + +TEST(dns_question_cname_redirect_multi_dname_match) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL, *ret = NULL; + DnsResourceKey *key = NULL; + _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL; + + question = dns_question_new(2); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "mail.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + rr = dns_resource_record_new_full(DNS_CLASS_IN, DNS_TYPE_DNAME, "example.com"); + ASSERT_NOT_NULL(rr); + rr->cname.name = strdup("v2.example.com"); + + ASSERT_TRUE(dns_question_cname_redirect(question, rr, &ret)); + + ASSERT_NOT_NULL(ret); + ASSERT_TRUE(question != ret); + ASSERT_FALSE(dns_question_is_equal(question, ret)); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.v2.example.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(ret, key)); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "mail.v2.example.com"); + ASSERT_NOT_NULL(key); + ASSERT_TRUE(dns_question_contains_key(ret, key)); + dns_resource_key_unref(key); +} + DEFINE_TEST_MAIN(LOG_DEBUG); From ede4e8cbe5147142382d09c24b17fbe0b2d07fb0 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 31 May 2024 10:55:34 +0100 Subject: [PATCH 10/12] resolved: tests for dns_question_dump() --- src/resolve/test-dns-question.c | 63 +++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c index c18169307a..9affb0cb3d 100644 --- a/src/resolve/test-dns-question.c +++ b/src/resolve/test-dns-question.c @@ -7,6 +7,11 @@ #include "log.h" #include "tests.h" +#include "fd-util.h" +#include "fileio.h" +#include "fs-util.h" +#include "tmpfile-util.h" + /* ================================================================ * dns_question_add() * ================================================================ */ @@ -838,4 +843,62 @@ TEST(dns_question_cname_redirect_multi_dname_match) { dns_resource_key_unref(key); } +/* ================================================================ + * dns_question_dump() + * ================================================================ */ + +static void check_dump_contents(FILE *f, const char **expected, size_t n) { + char *actual[n]; + size_t i, r; + rewind(f); + + for (i = 0; i < n; i++) { + r = read_line(f, 1024, &actual[i]); + ASSERT_GT(r, 0u); + } + + for (i = 0; i < n; i++) + ASSERT_STREQ(actual[i], expected[i]); + + for (i = 0; i < n; i++) + free(actual[i]); +} + +TEST(dns_question_dump) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + DnsResourceKey *key = NULL; + + question = dns_question_new(3); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_TXT, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + ASSERT_EQ(dns_question_size(question), 3u); + + _cleanup_(unlink_tempfilep) char p[] = "/tmp/dns-question-dump-XXXXXX"; + _cleanup_fclose_ FILE *f = NULL; + fmkostemp_safe(p, "r+", &f); + dns_question_dump(question, f); + + const char *expected[] = { + "\twww.example.com IN A", + "\twww.example.com IN AAAA", + "\twww.example.com IN TXT" + }; + check_dump_contents(f, expected, 3); +} + DEFINE_TEST_MAIN(LOG_DEBUG); From bbeb49f4c9512b3e5869c098d9af5e60cae52104 Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 31 May 2024 11:08:14 +0100 Subject: [PATCH 11/12] resolved: tests for dns_question_first_name() --- src/resolve/test-dns-question.c | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c index 9affb0cb3d..41d58477fb 100644 --- a/src/resolve/test-dns-question.c +++ b/src/resolve/test-dns-question.c @@ -901,4 +901,41 @@ TEST(dns_question_dump) { check_dump_contents(f, expected, 3); } +/* ================================================================ + * dns_question_first_name() + * ================================================================ */ + +TEST(dns_question_first_name_empty) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + const char *name = NULL; + + question = dns_question_new(0); + ASSERT_NOT_NULL(question); + + name = dns_question_first_name(question); + ASSERT_NULL(name); +} + +TEST(dns_question_first_name_multi) { + _cleanup_(dns_question_unrefp) DnsQuestion *question = NULL; + DnsResourceKey *key = NULL; + const char *name = NULL; + + question = dns_question_new(2); + ASSERT_NOT_NULL(question); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "mail.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(question, key, 0); + dns_resource_key_unref(key); + + name = dns_question_first_name(question); + ASSERT_STREQ(name, "www.example.com"); +} + DEFINE_TEST_MAIN(LOG_DEBUG); From 8f54c51b22635bd3777eb9577023a914aa20a63f Mon Sep 17 00:00:00 2001 From: James Coglan Date: Fri, 31 May 2024 11:18:56 +0100 Subject: [PATCH 12/12] resolved: tests for dns_question_merge() --- src/resolve/test-dns-question.c | 87 +++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/src/resolve/test-dns-question.c b/src/resolve/test-dns-question.c index 41d58477fb..a621aeeca2 100644 --- a/src/resolve/test-dns-question.c +++ b/src/resolve/test-dns-question.c @@ -938,4 +938,91 @@ TEST(dns_question_first_name_multi) { ASSERT_STREQ(name, "www.example.com"); } +/* ================================================================ + * dns_question_merge() + * ================================================================ */ + +TEST(dns_question_merge_empty_first) { + _cleanup_(dns_question_unrefp) DnsQuestion *a = NULL, *b = NULL, *ret = NULL; + DnsResourceKey *key = NULL; + + a = dns_question_new(0); + ASSERT_NOT_NULL(a); + + b = dns_question_new(1); + ASSERT_NOT_NULL(b); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(b, key, 0); + dns_resource_key_unref(key); + + ASSERT_OK(dns_question_merge(a, b, &ret)); + ASSERT_TRUE(ret == b); +} + +TEST(dns_question_merge_empty_second) { + _cleanup_(dns_question_unrefp) DnsQuestion *a = NULL, *b = NULL, *ret = NULL; + DnsResourceKey *key = NULL; + + a = dns_question_new(1); + ASSERT_NOT_NULL(a); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(a, key, 0); + dns_resource_key_unref(key); + + b = dns_question_new(0); + ASSERT_NOT_NULL(b); + + ASSERT_OK(dns_question_merge(a, b, &ret)); + ASSERT_TRUE(ret == a); +} + +TEST(dns_question_merge_multi) { + _cleanup_(dns_question_unrefp) DnsQuestion *a = NULL, *b = NULL, *ret = NULL; + DnsResourceKey *key = NULL; + int i; + uint16_t types[3]; + + a = dns_question_new(1); + ASSERT_NOT_NULL(a); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(a, key, 0); + dns_resource_key_unref(key); + + b = dns_question_new(2); + ASSERT_NOT_NULL(b); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_AAAA, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(b, key, 0); + dns_resource_key_unref(key); + + key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_TXT, "www.example.com"); + ASSERT_NOT_NULL(key); + dns_question_add(b, key, 0); + dns_resource_key_unref(key); + + ASSERT_OK(dns_question_merge(a, b, &ret)); + ASSERT_TRUE(ret != a); + ASSERT_TRUE(ret != b); + + ASSERT_EQ(dns_question_size(a), 1u); + ASSERT_EQ(dns_question_size(b), 2u); + ASSERT_EQ(dns_question_size(ret), 3u); + + i = 0; + DNS_QUESTION_FOREACH(key, ret) { + types[i++] = key->type; + } + + ASSERT_EQ(types[0], DNS_TYPE_A); + ASSERT_EQ(types[1], DNS_TYPE_AAAA); + ASSERT_EQ(types[2], DNS_TYPE_TXT); +} + DEFINE_TEST_MAIN(LOG_DEBUG);