Refactor test covering dns_ede API
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.
This commit is contained in:
@@ -32,60 +32,162 @@
|
||||
|
||||
#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",
|
||||
},
|
||||
};
|
||||
typedef struct {
|
||||
uint16_t code;
|
||||
const char *txt;
|
||||
} ede_test_expected_t;
|
||||
|
||||
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];
|
||||
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_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);
|
||||
|
||||
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(dns_ede_test_text_max_count) {
|
||||
dns_edectx_t edectx;
|
||||
|
||||
dns_ede_init(mctx, &edectx);
|
||||
|
||||
for (size_t i = 0; i < DNS_EDE_MAX_ERRORS; i++) {
|
||||
dns_ede_add(&edectx, vectors[i].info_code,
|
||||
vectors[i].extra_text);
|
||||
}
|
||||
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";
|
||||
|
||||
for (size_t i = 0; pos < DNS_EDE_MAX_ERRORS; pos++) {
|
||||
dns_ednsopt_t *edns = edectx.ede[i];
|
||||
size_t textlen = 0;
|
||||
dns_ede_add(&edectx, 2, txt1);
|
||||
dns_ede_add(&edectx, 22, NULL);
|
||||
dns_ede_add(&edectx, 3, txt2);
|
||||
|
||||
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);
|
||||
}
|
||||
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 " }
|
||||
};
|
||||
|
||||
assert_memory_equal(buf, edectx.ede[i]->value,
|
||||
sizeof(becode) + textlen);
|
||||
}
|
||||
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
|
||||
|
||||
|
||||
@@ -17,8 +17,7 @@ LDADD += \
|
||||
check_PROGRAMS = \
|
||||
notify_test \
|
||||
plugin_test \
|
||||
query_test \
|
||||
client_test
|
||||
query_test
|
||||
|
||||
notify_test_SOURCES = \
|
||||
notify_test.c \
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user