]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
resolved: tests for dns_cache_put(); successful A query
authorJames Coglan <james@neighbourhood.ie>
Fri, 17 May 2024 10:22:34 +0000 (11:22 +0100)
committerJames Coglan <james@neighbourhood.ie>
Tue, 23 Jul 2024 13:08:29 +0000 (14:08 +0100)
Co-Authored-By: jan@neighbourhood.ie
src/resolve/meson.build
src/resolve/test-dns-cache.c [new file with mode: 0644]

index b139afda6a2beb5d31f02003078dad7491fc3950..33adc8ca935ac23ff26b83c08d1b2f3faa5fcdf9 100644 (file)
@@ -165,6 +165,12 @@ executables += [
         resolve_test_template + {
                 'sources' : files('test-dns-answer.c'),
         },
+        resolve_test_template + {
+                'sources' : files(
+                        'test-dns-cache.c',
+                        'resolved-dns-cache.c'
+                ),
+        },
         resolve_test_template + {
                 'sources' : files('test-dns-packet.c'),
         },
diff --git a/src/resolve/test-dns-cache.c b/src/resolve/test-dns-cache.c
new file mode 100644 (file)
index 0000000..d6568a9
--- /dev/null
@@ -0,0 +1,155 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+
+#include <sys/socket.h>
+
+#include "dns-type.h"
+#include "log.h"
+#include "resolve-util.h"
+#include "resolved-def.h"
+#include "resolved-dns-answer.h"
+#include "resolved-dns-cache.h"
+#include "resolved-dns-dnssec.h"
+#include "resolved-dns-packet.h"
+#include "resolved-dns-rr.h"
+#include "tests.h"
+
+static DnsCache new_cache(void) {
+        return (DnsCache) {};
+}
+
+typedef struct PutArgs {
+        DnsCacheMode cache_mode;
+        DnsProtocol protocol;
+        DnsResourceKey *key;
+        int rcode;
+        DnsAnswer *answer;
+        DnsPacket *full_packet;
+        uint64_t query_flags;
+        DnssecResult dnssec_result;
+        uint32_t nsec_ttl;
+        int owner_family;
+        const union in_addr_union owner_address;
+        usec_t stale_retention_usec;
+} PutArgs;
+
+static PutArgs mk_put_args(void) {
+        return (PutArgs) {
+                .cache_mode = DNS_CACHE_MODE_YES,
+                .protocol = DNS_PROTOCOL_DNS,
+                .key = NULL,
+                .rcode = DNS_RCODE_SUCCESS,
+                .answer = NULL,
+                .full_packet = NULL,
+                .query_flags = SD_RESOLVED_AUTHENTICATED | SD_RESOLVED_CONFIDENTIAL,
+                .dnssec_result = DNSSEC_UNSIGNED,
+                .nsec_ttl = 3600,
+                .owner_family = AF_INET,
+                .owner_address = { .in.s_addr = htobe32(0x01020304) },
+                .stale_retention_usec = 0
+        };
+}
+
+static int cache_put(DnsCache *cache, PutArgs *args) {
+        ASSERT_NOT_NULL(cache);
+        ASSERT_NOT_NULL(args);
+
+        return dns_cache_put(cache,
+                args->cache_mode,
+                args->protocol,
+                args->key,
+                args->rcode,
+                args->answer,
+                args->full_packet,
+                args->query_flags,
+                args->dnssec_result,
+                args->nsec_ttl,
+                args->owner_family,
+                &args->owner_address,
+                args->stale_retention_usec);
+}
+
+static void dns_cache_unrefp(DnsCache *cache) {
+        dns_cache_flush(cache);
+}
+
+static void put_args_unrefp(PutArgs *args) {
+        ASSERT_NOT_NULL(args);
+
+        dns_resource_key_unref(args->key);
+        dns_answer_unref(args->answer);
+        dns_packet_unref(args->full_packet);
+}
+
+TEST(dns_a_success_is_cached) {
+        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
+        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
+        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
+        DnsAnswerFlags flags;
+
+        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
+        ASSERT_NOT_NULL(put_args.key);
+        put_args.rcode = DNS_RCODE_SUCCESS;
+
+        put_args.answer = dns_answer_new(1);
+        ASSERT_NOT_NULL(put_args.answer);
+
+        rr = dns_resource_record_new(put_args.key);
+        ASSERT_NOT_NULL(rr);
+        rr->a.in_addr.s_addr = htobe32(0xc0a8017f);
+        rr->ttl = 3600;
+        flags = DNS_ANSWER_CACHEABLE;
+        dns_answer_add(put_args.answer, rr, 1, flags, NULL);
+
+        ASSERT_OK(cache_put(&cache, &put_args));
+        ASSERT_FALSE(dns_cache_is_empty(&cache));
+}
+
+TEST(dns_a_success_zero_ttl_is_not_cached) {
+        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
+        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
+        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
+        DnsAnswerFlags flags;
+
+        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
+        ASSERT_NOT_NULL(put_args.key);
+        put_args.rcode = DNS_RCODE_SUCCESS;
+
+        put_args.answer = dns_answer_new(1);
+        ASSERT_NOT_NULL(put_args.answer);
+
+        rr = dns_resource_record_new(put_args.key);
+        ASSERT_NOT_NULL(rr);
+        rr->a.in_addr.s_addr = htobe32(0xc0a8017f);
+        rr->ttl = 0;
+        flags = DNS_ANSWER_CACHEABLE;
+        dns_answer_add(put_args.answer, rr, 1, flags, NULL);
+
+        ASSERT_OK(cache_put(&cache, &put_args));
+        ASSERT_TRUE(dns_cache_is_empty(&cache));
+}
+
+TEST(dns_a_success_not_cacheable_is_not_cached) {
+        _cleanup_(dns_cache_unrefp) DnsCache cache = new_cache();
+        _cleanup_(put_args_unrefp) PutArgs put_args = mk_put_args();
+        _cleanup_(dns_resource_record_unrefp) DnsResourceRecord *rr = NULL;
+        DnsAnswerFlags flags;
+
+        put_args.key = dns_resource_key_new(DNS_CLASS_IN, DNS_TYPE_A, "www.example.com");
+        ASSERT_NOT_NULL(put_args.key);
+        put_args.rcode = DNS_RCODE_SUCCESS;
+
+        put_args.answer = dns_answer_new(1);
+        ASSERT_NOT_NULL(put_args.answer);
+
+        rr = dns_resource_record_new(put_args.key);
+        ASSERT_NOT_NULL(rr);
+        rr->a.in_addr.s_addr = htobe32(0xc0a8017f);
+        rr->ttl = 3600;
+        flags = 0;
+        dns_answer_add(put_args.answer, rr, 1, flags, NULL);
+
+        ASSERT_OK(cache_put(&cache, &put_args));
+        ASSERT_TRUE(dns_cache_is_empty(&cache));
+}
+
+DEFINE_TEST_MAIN(LOG_DEBUG);