From: Michał Kępień Date: Tue, 14 Aug 2018 08:43:51 +0000 (+0200) Subject: Prevent rare rbt_insert_and_remove unit test failures X-Git-Tag: v9.13.3~61^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=13fe76379834b8d588abe5913a1a7676f4d6637e;p=thirdparty%2Fbind9.git Prevent rare rbt_insert_and_remove unit test failures When two or more absolute, two-label names are added to a completely empty RBT, an extra, empty node for the root name will be created due to node splitting. check_tree() expects that, but the extra node will not be created when just one name is added to a completely empty RBT. This problem could be handled inside check_tree(), but that would introduce unnecessary complexity into it since adding a single name will result in a different node count for a completely empty RBT (node count will be 1) and an RBT containing only an empty node for the root name, created due to prior node splitting (node count will be 2). Thus, first explicitly create a node for the root name to prevent rare check_tree() failures caused by a single name being added in the first iteration of the insert/remove loop. --- diff --git a/lib/dns/tests/rbt_test.c b/lib/dns/tests/rbt_test.c index 542f877c1f6..319354edd5e 100644 --- a/lib/dns/tests/rbt_test.c +++ b/lib/dns/tests/rbt_test.c @@ -910,6 +910,7 @@ insert_nodes(dns_rbt_t *mytree, char **names, node->data = n; names[*names_count] = isc_mem_strdup(mctx, namebuf); + ATF_REQUIRE(names[*names_count] != NULL); *names_count += 1; break; } @@ -995,6 +996,7 @@ ATF_TC_BODY(rbt_insert_and_remove, tc) { */ isc_result_t result; dns_rbt_t *mytree = NULL; + size_t *n; /* * We use an array for storing names instead of a set * structure. It's slow, but works and is good enough for tests. @@ -1013,6 +1015,11 @@ ATF_TC_BODY(rbt_insert_and_remove, tc) { result = dns_rbt_create(mctx, delete_data, NULL, &mytree); ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); + n = isc_mem_get(mctx, sizeof(size_t)); + ATF_REQUIRE(n != NULL); + result = dns_rbt_addname(mytree, dns_rootname, n); + ATF_REQUIRE_EQ(result, ISC_R_SUCCESS); + memset(names, 0, sizeof(names)); names_count = 0; @@ -1051,6 +1058,12 @@ ATF_TC_BODY(rbt_insert_and_remove, tc) { } } + result = dns_rbt_deletename(mytree, dns_rootname, false); + ATF_CHECK_EQ_MSG(result, ISC_R_SUCCESS, + "result: %s", isc_result_totext(result)); + ATF_CHECK_EQ_MSG(dns_rbt_nodecount(mytree), 0, + "%u != 0", dns_rbt_nodecount(mytree)); + dns_rbt_destroy(&mytree); dns_test_end();