dns_test_end();
}
-ATF_TC(rbt_remove_empty);
-ATF_TC_HEAD(rbt_remove_empty, tc) {
- atf_tc_set_md_var(tc, "descr",
- "Test removal from a tree when "
- "upper nodes are empty");
-}
-ATF_TC_BODY(rbt_remove_empty, tc) {
- /*
- * This test is similar to the rbt_remove test, but checks node
- * deletion when upper nodes are empty.
- */
- isc_result_t result;
- size_t j;
-
- UNUSED(tc);
-
- isc_mem_debugging = ISC_MEM_DEBUGRECORD;
-
- result = dns_test_begin(NULL, ISC_TRUE);
- ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
- /*
- * Delete single nodes and check if the rest of the nodes exist.
- */
- for (j = 0; j < ordered_names_count; j++) {
- dns_rbt_t *mytree = NULL;
- dns_rbtnode_t *node;
- size_t i;
- isc_boolean_t tree_ok;
- dns_rbtnodechain_t chain;
- size_t start_node;
-
- /* Create a tree. */
- result = dns_rbt_create(mctx, delete_data, NULL, &mytree);
- ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
- /* Insert test data into the tree. */
- for (i = 0; i < domain_names_count; i++) {
- node = NULL;
- result = insert_helper(mytree, domain_names[i], &node);
- ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
- }
-
- /* Check that all names exist in order. */
- for (i = 0; i < ordered_names_count; i++) {
- dns_fixedname_t fname;
- dns_name_t *name;
-
- build_name_from_str(ordered_names[i], &fname);
-
- name = dns_fixedname_name(&fname);
- node = NULL;
- result = dns_rbt_findnode(mytree, name, NULL,
- &node, NULL,
- DNS_RBTFIND_EMPTYDATA,
- NULL, NULL);
- ATF_CHECK_EQ(result, ISC_R_SUCCESS);
-
- /* Check that node data is empty */
- ATF_REQUIRE(node != NULL);
- ATF_REQUIRE_EQ(node->data, NULL);
- }
-
- /* Now, delete the j'th node from the tree. */
- {
- dns_fixedname_t fname;
- dns_name_t *name;
-
- build_name_from_str(ordered_names[j], &fname);
-
- name = dns_fixedname_name(&fname);
-
- node = NULL;
- result = dns_rbt_findnode(mytree, name, NULL, &node,
- NULL, DNS_RBTFIND_EMPTYDATA,
- NULL, NULL);
- ATF_CHECK_EQ(result, ISC_R_SUCCESS);
-
- result = dns_rbt_deletenode(mytree, node, ISC_FALSE);
- ATF_CHECK_EQ(result, ISC_R_SUCCESS);
- }
-
- /* Check RB tree properties. */
- tree_ok = dns__rbt_checkproperties(mytree);
- ATF_CHECK_EQ(tree_ok, ISC_TRUE);
-
- dns_rbtnodechain_init(&chain, mctx);
-
- /* Now, walk through nodes in order. */
- if (j == 0) {
- /*
- * Node for ordered_names[0] was already deleted
- * above. We start from node 1.
- */
- dns_fixedname_t fname;
- dns_name_t *name;
-
- build_name_from_str(ordered_names[0], &fname);
- name = dns_fixedname_name(&fname);
- node = NULL;
- result = dns_rbt_findnode(mytree, name, NULL,
- &node, NULL,
- DNS_RBTFIND_EMPTYDATA,
- NULL, NULL);
- ATF_CHECK(result != ISC_R_SUCCESS);
-
- build_name_from_str(ordered_names[1], &fname);
- name = dns_fixedname_name(&fname);
- node = NULL;
- result = dns_rbt_findnode(mytree, name, NULL,
- &node, &chain,
- DNS_RBTFIND_EMPTYDATA,
- NULL, NULL);
- ATF_CHECK_EQ(result, ISC_R_SUCCESS);
- start_node = 1;
- } else {
- /* Start from node 0. */
- dns_fixedname_t fname;
- dns_name_t *name;
-
- build_name_from_str(ordered_names[0], &fname);
- name = dns_fixedname_name(&fname);
- node = NULL;
- result = dns_rbt_findnode(mytree, name, NULL,
- &node, &chain,
- DNS_RBTFIND_EMPTYDATA,
- NULL, NULL);
- ATF_CHECK_EQ(result, ISC_R_SUCCESS);
- start_node = 0;
- }
-
- /*
- * node and chain have been set by the code above at
- * this point.
- */
- for (i = start_node; i < ordered_names_count; i++) {
- dns_fixedname_t fntmp1, fntmp2;
- dns_name_t *ntmp1, *ntmp2;
- dns_fixedname_t fname_j, fname_i;
- dns_name_t *name_j, *name_i;
-
- build_name_from_str("j.z.d.e.f", &fntmp1);
- ntmp1 = dns_fixedname_name(&fntmp1);
- build_name_from_str("z.d.e.f", &fntmp2);
- ntmp2 = dns_fixedname_name(&fntmp2);
-
- build_name_from_str(ordered_names[j], &fname_j);
- name_j = dns_fixedname_name(&fname_j);
- build_name_from_str(ordered_names[i], &fname_i);
- name_i = dns_fixedname_name(&fname_i);
-
- if (dns_name_equal(name_j, ntmp1) &&
- dns_name_equal(name_i, ntmp2))
- {
- /*
- * The only special case in the
- * tree. Here, "z.d.e.f" will not exist
- * as it would have been removed during
- * removal of "j.z.d.e.f".
- */
- continue;
- }
-
- if (dns_name_equal(name_i, name_j)) {
- dns_fixedname_t fntmp3, fntmp4, fntmp5, fntmp6;
- dns_name_t *ntmp3, *ntmp4, *ntmp5, *ntmp6;
-
- /*
- * This may be true for the last node if
- * we seek ahead in the loop using
- * dns_rbtnodechain_next() below.
- */
- if (node == NULL) {
- break;
- }
-
- /*
- * All ordered nodes are empty
- * initially. If an empty removed node
- * exists because it is a super-domain,
- * just skip it.
- */
- build_name_from_str("d.e.f", &fntmp3);
- ntmp3 = dns_fixedname_name(&fntmp3);
- build_name_from_str("w.y.d.e.f", &fntmp4);
- ntmp4 = dns_fixedname_name(&fntmp4);
- build_name_from_str("z.d.e.f", &fntmp5);
- ntmp5 = dns_fixedname_name(&fntmp5);
- build_name_from_str("g.h", &fntmp6);
- ntmp6 = dns_fixedname_name(&fntmp6);
-
- if (dns_name_equal(name_j, ntmp3) ||
- dns_name_equal(name_j, ntmp4) ||
- dns_name_equal(name_j, ntmp5) ||
- dns_name_equal(name_j, ntmp6))
- {
- result = dns_rbtnodechain_next(&chain,
- NULL,
- NULL);
- if (result == ISC_R_NOMORE) {
- node = NULL;
- } else {
- dns_rbtnodechain_current(&chain,
- NULL,
- NULL,
- &node);
- }
- }
- continue;
- }
-
- ATF_REQUIRE(node != NULL);
-
- result = dns_rbtnodechain_next(&chain, NULL, NULL);
- if (result == ISC_R_NOMORE) {
- node = NULL;
- } else {
- dns_rbtnodechain_current(&chain, NULL, NULL,
- &node);
- }
- }
-
- /* We should have reached the end of the tree. */
- ATF_REQUIRE_EQ(node, NULL);
-
- dns_rbt_destroy(&mytree);
- }
-
- dns_test_end();
-}
-
static void
insert_nodes(dns_rbt_t *mytree, char **names,
size_t *names_count, isc_uint32_t num_names)
ATF_TP_ADD_TC(tp, rbt_check_distance_ordered);
ATF_TP_ADD_TC(tp, rbt_insert);
ATF_TP_ADD_TC(tp, rbt_remove);
- ATF_TP_ADD_TC(tp, rbt_remove_empty);
ATF_TP_ADD_TC(tp, rbt_insert_and_remove);
#ifdef ISC_PLATFORM_USETHREADS
#ifdef DNS_BENCHMARK_TESTS