]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Refactor test covering dns_ede API
authorColin Vidal <colin@isc.org>
Wed, 29 Jan 2025 17:34:51 +0000 (18:34 +0100)
committerColin Vidal <colin@isc.org>
Thu, 30 Jan 2025 12:37:55 +0000 (12:37 +0000)
Migrate tests cases in client_test code which were exclusively testing
code which is now all wrapped inside ede compilation unit. Those are
testing maximum number of EDE, duplicate EDE as well as truncation of
text of an EDE.

Also add coverage for the copy of EDE from an edectx to another one, as
well as checking the assertion of the maximum EDE info code which can be
used.

(cherry picked from commit f9f41190b397429b151e48dac369ab5797ed6082)

lib/dns/ede.c
lib/dns/include/dns/message.h
tests/dns/ede_test.c
tests/ns/Makefile.am
tests/ns/client_test.c [deleted file]

index d5c7e2da484e7cf95e1db12a9393c64c2fc595d5..7dcb05f281c4453f60ef48edf33a3bbdc022d271 100644 (file)
@@ -24,6 +24,7 @@
 void
 dns_ede_add(dns_edectx_t *edectx, uint16_t code, const char *text) {
        REQUIRE(DNS_EDE_VALID(edectx));
+       REQUIRE(code <= DNS_EDE_MAX_CODE);
 
        size_t pos = 0;
        uint16_t becode = htobe16(code);
index 6de8b3d3f49d3cea13094b77abcad5d572e0db39..e97c1a0674cb827b2fee623b6daa2376e37c25e3 100644 (file)
 #define DNS_EDE_NOREACHABLEAUTH             22 /*%< No Reachable Authority */
 #define DNS_EDE_NETWORKERROR        23 /*%< Network Error */
 #define DNS_EDE_INVALIDDATA         24 /*%< Invalid Data */
+#define DNS_EDE_MAX_CODE            DNS_EDE_INVALIDDATA
 
 #define DNS_MESSAGE_REPLYPRESERVE       (DNS_MESSAGEFLAG_RD | DNS_MESSAGEFLAG_CD)
 #define DNS_MESSAGEEXTFLAG_REPLYPRESERVE (DNS_MESSAGEEXTFLAG_DO)
index db1340f5194f68181ed6f202163771f06baa9784..b509fc1c457a958ea83d225629d2780481e64f86 100644 (file)
 
 #include <tests/isc.h>
 
-const struct {
-       uint16_t info_code;
-       char *extra_text;
-} vectors[DNS_EDE_MAX_ERRORS] = {
-       {
-               22,
-               NULL,
-       },
-       {
-               12,
-               (char *)"abcd",
-       },
-       {
-               4,
-               (char *)"abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabc"
-                       "dabcdabcdadcdabcd",
-       },
-};
-
-ISC_RUN_TEST_IMPL(dns_edectx) {
-       dns_edectx_t edectx = { 0 };
-       size_t pos = 0;
-       uint16_t becode;
-       uint8_t buf[sizeof(becode) + DNS_EDE_EXTRATEXT_LEN];
+typedef struct {
+       uint16_t code;
+       const char *txt;
+} ede_test_expected_t;
 
-       dns_ede_init(mctx, &edectx);
+static void
+dns_ede_test_equals(const ede_test_expected_t *expected, size_t expected_count,
+                   dns_edectx_t *edectx) {
+       size_t count = 0;
 
        for (size_t i = 0; i < DNS_EDE_MAX_ERRORS; i++) {
-               dns_ede_add(&edectx, vectors[i].info_code,
-                           vectors[i].extra_text);
-       }
+               dns_ednsopt_t *edns = edectx->ede[i];
+
+               if (edns == NULL) {
+                       break;
+               }
+
+               uint16_t code;
+               const unsigned char *txt;
+
+               assert_in_range(count, 0, expected_count);
+               assert_int_equal(edns->code, DNS_OPT_EDE);
 
-       for (size_t i = 0; pos < DNS_EDE_MAX_ERRORS; pos++) {
-               dns_ednsopt_t *edns = edectx.ede[i];
-               size_t textlen = 0;
+               code = ISC_U8TO16_BE(edns->value);
+               assert_int_equal(code, expected[count].code);
 
-               becode = htobe16(vectors[i].info_code);
-               memmove(buf, &becode, sizeof(becode));
-               if (vectors[i].extra_text != NULL) {
-                       textlen = strlen(vectors[i].extra_text);
-                       memcpy(edns->value + sizeof(becode),
-                              vectors[i].extra_text, textlen);
+               if (edns->length > sizeof(code)) {
+                       assert_non_null(expected[count].txt);
+                       txt = edns->value + sizeof(code);
+                       assert_memory_equal(expected[count].txt, txt,
+                                           edns->length - sizeof(code));
+               } else {
+                       assert_null(expected[count].txt);
                }
 
-               assert_memory_equal(buf, edectx.ede[i]->value,
-                                   sizeof(becode) + textlen);
+               count++;
        }
+       assert_int_equal(count, expected_count);
+}
+
+ISC_RUN_TEST_IMPL(dns_ede_test_text_max_count) {
+       dns_edectx_t edectx;
+
+       dns_ede_init(mctx, &edectx);
+
+       const char *txt1 = "foobar";
+       const char *txt2 = "It's been a long time since I rock-and-rolled"
+                          "Ooh, let me get it back, let me get it back";
+
+       dns_ede_add(&edectx, 2, txt1);
+       dns_ede_add(&edectx, 22, NULL);
+       dns_ede_add(&edectx, 3, txt2);
+
+       const ede_test_expected_t expected[3] = {
+               { .code = 2, .txt = "foobar" },
+               { .code = 22, .txt = NULL },
+               { .code = 3,
+                 .txt = "It's been a long time since I rock-and-rolledOoh, "
+                        "let me get it " }
+       };
+
+       dns_ede_test_equals(expected, 3, &edectx);
+
+       dns_ede_reset(&edectx);
+}
+
+ISC_RUN_TEST_IMPL(dns_ede_test_max_count) {
+       dns_edectx_t edectx;
+
+       dns_ede_init(mctx, &edectx);
+
+       dns_ede_add(&edectx, 1, NULL);
+       dns_ede_add(&edectx, 22, "two");
+       dns_ede_add(&edectx, 3, "three");
+       dns_ede_add(&edectx, 4, "four");
+       dns_ede_add(&edectx, 5, "five");
+
+       const ede_test_expected_t expected[3] = {
+               { .code = 1, .txt = NULL },
+               { .code = 22, .txt = "two" },
+               { .code = 3, .txt = "three" },
+       };
+
+       dns_ede_test_equals(expected, 3, &edectx);
 
        dns_ede_reset(&edectx);
 }
 
+ISC_RUN_TEST_IMPL(dns_ede_test_duplicates) {
+       dns_edectx_t edectx;
+
+       dns_ede_init(mctx, &edectx);
+
+       dns_ede_add(&edectx, 1, NULL);
+       dns_ede_add(&edectx, 1, "two");
+       dns_ede_add(&edectx, 1, "three");
+
+       const ede_test_expected_t expected[] = {
+               { .code = 1, .txt = NULL },
+       };
+       dns_ede_test_equals(expected, 1, &edectx);
+
+       dns_ede_reset(&edectx);
+
+       const ede_test_expected_t expectedempty[] = {};
+       dns_ede_test_equals(expectedempty, 0, &edectx);
+}
+
+ISC_RUN_TEST_IMPL(dns_ede_test_infocode_range) {
+       dns_edectx_t edectx;
+
+       dns_ede_init(mctx, &edectx);
+
+       dns_ede_add(&edectx, 1, NULL);
+       expect_assert_failure(dns_ede_add(&edectx, 32, NULL));
+
+       const ede_test_expected_t expected[] = {
+               { .code = 1, .txt = NULL },
+       };
+       dns_ede_test_equals(expected, 1, &edectx);
+
+       dns_ede_reset(&edectx);
+}
+
+ISC_RUN_TEST_IMPL(dns_ede_test_copy) {
+       dns_edectx_t edectx1;
+       dns_edectx_t edectx2;
+
+       dns_ede_init(mctx, &edectx1);
+       dns_ede_init(mctx, &edectx2);
+
+       dns_ede_add(&edectx1, 1, NULL);
+       dns_ede_add(&edectx1, 2, "two");
+       dns_ede_add(&edectx1, 3, "three");
+
+       const ede_test_expected_t expected[] = {
+               { .code = 1, .txt = NULL },
+               { .code = 2, .txt = "two" },
+               { .code = 3, .txt = "three" },
+       };
+
+       dns_ede_test_equals(expected, 3, &edectx1);
+       dns_ede_copy(&edectx2, &edectx1);
+       dns_ede_test_equals(expected, 3, &edectx2);
+
+       dns_ede_reset(&edectx1);
+       dns_ede_reset(&edectx2);
+}
+
 ISC_TEST_LIST_START
 
-ISC_TEST_ENTRY(dns_edectx)
+ISC_TEST_ENTRY(dns_ede_test_text_max_count)
+ISC_TEST_ENTRY(dns_ede_test_max_count)
+ISC_TEST_ENTRY(dns_ede_test_duplicates)
+ISC_TEST_ENTRY(dns_ede_test_infocode_range)
+ISC_TEST_ENTRY(dns_ede_test_copy)
 
 ISC_TEST_LIST_END
 
index 23b3ccbf7ba0fbc3aef1b941005d4f204ffc7b39..c26bec85e697119ae6d0a3f60735c6c16694fb1e 100644 (file)
@@ -18,8 +18,7 @@ check_PROGRAMS =              \
        listenlist_test         \
        notify_test             \
        plugin_test             \
-       query_test              \
-       client_test
+       query_test
 
 notify_test_SOURCES =          \
        notify_test.c           \
diff --git a/tests/ns/client_test.c b/tests/ns/client_test.c
deleted file mode 100644 (file)
index b19f8b8..0000000
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
- *
- * SPDX-License-Identifier: MPL-2.0
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, you can obtain one at https://mozilla.org/MPL/2.0/.
- *
- * See the COPYRIGHT file distributed with this work for additional
- * information regarding copyright ownership.
- */
-
-#include <inttypes.h>
-#include <sched.h> /* IWYU pragma: keep */
-#include <setjmp.h>
-#include <stdarg.h>
-#include <stddef.h>
-#include <stdlib.h>
-#include <unistd.h>
-
-#define UNIT_TESTING
-#include <cmocka.h>
-
-#include <isc/buffer.h>
-#include <isc/list.h>
-#include <isc/net.h>
-#include <isc/timer.h>
-#include <isc/tls.h>
-#include <isc/util.h>
-
-#include <ns/client.h>
-
-#include <tests/isc.h>
-
-typedef struct {
-       uint16_t code;
-       const char *txt;
-} client_tests_ede_expected_t;
-
-static ns_clientmgr_t client_ede_test_dummy_manager;
-
-static ns_client_t *
-client_ede_test_initclient(void) {
-       client_ede_test_dummy_manager.mctx = mctx;
-
-       ns_client_t *client = isc_mem_get(mctx, sizeof(*client));
-       memset(client, 0, sizeof(*client));
-       client->magic = NS_CLIENT_MAGIC;
-       client->manager = &client_ede_test_dummy_manager;
-
-       dns_ede_init(mctx, &client->edectx);
-
-       return client;
-}
-
-static void
-client_ede_test_free(ns_client_t *client) {
-       dns_ede_reset(&client->edectx);
-       isc_mem_put(mctx, client, sizeof(*client));
-}
-
-static void
-client_ede_test_equals(const client_tests_ede_expected_t *expected,
-                      size_t expected_count, const ns_client_t *client) {
-       size_t count = 0;
-
-       for (size_t i = 0; i < DNS_EDE_MAX_ERRORS; i++) {
-               dns_ednsopt_t *edns = client->edectx.ede[i];
-
-               if (edns == NULL) {
-                       break;
-               }
-
-               uint16_t code;
-               const unsigned char *txt;
-
-               assert_in_range(count, 0, expected_count);
-               assert_int_equal(edns->code, DNS_OPT_EDE);
-
-               code = ISC_U8TO16_BE(edns->value);
-               assert_int_equal(code, expected[count].code);
-
-               if (edns->length > sizeof(code)) {
-                       assert_non_null(expected[count].txt);
-                       txt = edns->value + sizeof(code);
-                       assert_memory_equal(expected[count].txt, txt,
-                                           edns->length - sizeof(code));
-               } else {
-                       assert_null(expected[count].txt);
-               }
-
-               count++;
-       }
-       assert_int_equal(count, expected_count);
-}
-
-ISC_RUN_TEST_IMPL(client_ede_test_text_max_count) {
-       ns_client_t *client = client_ede_test_initclient();
-
-       const char *txt1 = "foobar";
-       const char *txt2 = "It's been a long time since I rock-and-rolled"
-                          "Ooh, let me get it back, let me get it back";
-
-       dns_ede_add(&client->edectx, 2, txt1);
-       dns_ede_add(&client->edectx, 22, NULL);
-       dns_ede_add(&client->edectx, 3, txt2);
-
-       const client_tests_ede_expected_t expected[3] = {
-               { .code = 2, .txt = "foobar" },
-               { .code = 22, .txt = NULL },
-               { .code = 3,
-                 .txt = "It's been a long time since I rock-and-rolledOoh, "
-                        "let me get it " }
-       };
-
-       client_ede_test_equals(expected, 3, client);
-       client_ede_test_free(client);
-}
-
-ISC_RUN_TEST_IMPL(client_ede_test_max_count) {
-       ns_client_t *client = client_ede_test_initclient();
-
-       dns_ede_add(&client->edectx, 1, NULL);
-       dns_ede_add(&client->edectx, 22, "two");
-       dns_ede_add(&client->edectx, 3, "three");
-       dns_ede_add(&client->edectx, 4, "four");
-       dns_ede_add(&client->edectx, 5, "five");
-
-       const client_tests_ede_expected_t expected[3] = {
-               { .code = 1, .txt = NULL },
-               { .code = 22, .txt = "two" },
-               { .code = 3, .txt = "three" },
-       };
-
-       client_ede_test_equals(expected, 3, client);
-       client_ede_test_free(client);
-}
-
-ISC_RUN_TEST_IMPL(client_ede_test_duplicates) {
-       ns_client_t *client = client_ede_test_initclient();
-
-       dns_ede_add(&client->edectx, 1, NULL);
-       dns_ede_add(&client->edectx, 1, "two");
-       dns_ede_add(&client->edectx, 1, "three");
-
-       const client_tests_ede_expected_t expected[] = {
-               { .code = 1, .txt = NULL },
-       };
-
-       client_ede_test_equals(expected, 1, client);
-
-       client_ede_test_free(client);
-}
-
-ISC_TEST_LIST_START
-
-ISC_TEST_ENTRY(client_ede_test_text_max_count)
-ISC_TEST_ENTRY(client_ede_test_max_count)
-ISC_TEST_ENTRY(client_ede_test_duplicates)
-
-ISC_TEST_LIST_END
-
-ISC_TEST_MAIN