diff options
Diffstat (limited to 'contrib/unbound/testcode/unittcpreuse.c')
-rw-r--r-- | contrib/unbound/testcode/unittcpreuse.c | 236 |
1 files changed, 0 insertions, 236 deletions
diff --git a/contrib/unbound/testcode/unittcpreuse.c b/contrib/unbound/testcode/unittcpreuse.c deleted file mode 100644 index 087c6c1b9d50..000000000000 --- a/contrib/unbound/testcode/unittcpreuse.c +++ /dev/null @@ -1,236 +0,0 @@ -/* - * testcode/unittcpreuse.c - unit test for tcp_reuse. - * - * Copyright (c) 2021, NLnet Labs. All rights reserved. - * - * This software is open source. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * Neither the name of the NLNET LABS nor the names of its contributors may - * be used to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED - * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ -/** - * \file - * Tests the tcp_reuse functionality. - */ - -#include "config.h" -#include "testcode/unitmain.h" -#include "util/log.h" -#include "util/random.h" -#include "services/outside_network.h" - -/** add number of new IDs to the reuse tree, randomly chosen */ -static void tcpid_addmore(struct reuse_tcp* reuse, - struct outside_network* outnet, unsigned int addnum) -{ - unsigned int i; - struct waiting_tcp* w; - for(i=0; i<addnum; i++) { - uint16_t id = reuse_tcp_select_id(reuse, outnet); - unit_assert(!reuse_tcp_by_id_find(reuse, id)); - w = calloc(1, sizeof(*w)); - unit_assert(w); - w->id = id; - w->outnet = outnet; - w->next_waiting = (void*)reuse->pending; - reuse_tree_by_id_insert(reuse, w); - } -} - -/** fill up the reuse ID tree and test assertions */ -static void tcpid_fillup(struct reuse_tcp* reuse, - struct outside_network* outnet) -{ - int t, numtest=3; - for(t=0; t<numtest; t++) { - rbtree_init(&reuse->tree_by_id, reuse_id_cmp); - tcpid_addmore(reuse, outnet, 65535); - reuse_del_readwait(&reuse->tree_by_id); - } -} - -/** test TCP ID selection */ -static void tcpid_test(void) -{ - struct pending_tcp pend; - struct outside_network outnet; - unit_show_func("services/outside_network.c", "reuse_tcp_select_id"); - memset(&pend, 0, sizeof(pend)); - pend.reuse.pending = &pend; - memset(&outnet, 0, sizeof(outnet)); - outnet.rnd = ub_initstate(NULL); - rbtree_init(&pend.reuse.tree_by_id, reuse_id_cmp); - tcpid_fillup(&pend.reuse, &outnet); - ub_randfree(outnet.rnd); -} - -/** check that the tree has present number of nodes and the LRU is linked - * properly. */ -static void check_tree_and_list(struct outside_network* outnet, int present) -{ - int i; - struct reuse_tcp *reuse, *next_reuse; - unit_assert(present == (int)outnet->tcp_reuse.count); - if(present < 1) { - unit_assert(outnet->tcp_reuse_first == NULL); - unit_assert(outnet->tcp_reuse_last == NULL); - return; - } - unit_assert(outnet->tcp_reuse_first->item_on_lru_list); - unit_assert(!outnet->tcp_reuse_first->lru_prev); - reuse = outnet->tcp_reuse_first; - for(i=0; i<present-1; i++) { - unit_assert(reuse->item_on_lru_list); - unit_assert(reuse->lru_next); - unit_assert(reuse->lru_next != reuse); - next_reuse = reuse->lru_next; - unit_assert(next_reuse->lru_prev == reuse); - reuse = next_reuse; - } - unit_assert(!reuse->lru_next); - unit_assert(outnet->tcp_reuse_last->item_on_lru_list); - unit_assert(outnet->tcp_reuse_last == reuse); -} - -/** creates pending_tcp. Copy of outside_network.c:create_pending_tcp without - * the comm_point creation */ -static int create_pending_tcp(struct outside_network* outnet) -{ - size_t i; - if(outnet->num_tcp == 0) - return 1; /* no tcp needed, nothing to do */ - if(!(outnet->tcp_conns = (struct pending_tcp **)calloc( - outnet->num_tcp, sizeof(struct pending_tcp*)))) - return 0; - for(i=0; i<outnet->num_tcp; i++) { - if(!(outnet->tcp_conns[i] = (struct pending_tcp*)calloc(1, - sizeof(struct pending_tcp)))) - return 0; - outnet->tcp_conns[i]->next_free = outnet->tcp_free; - outnet->tcp_free = outnet->tcp_conns[i]; - } - return 1; -} - -/** empty the tcp_reuse tree and LRU list */ -static void empty_tree(struct outside_network* outnet) -{ - size_t i; - struct reuse_tcp* reuse; - reuse = outnet->tcp_reuse_first; - i = outnet->tcp_reuse.count; - while(reuse) { - reuse_tcp_remove_tree_list(outnet, reuse); - check_tree_and_list(outnet, --i); - reuse = outnet->tcp_reuse_first; - } -} - -/** check removal of the LRU element on the given position of total elements */ -static void check_removal(struct outside_network* outnet, int position, int total) -{ - int i; - struct reuse_tcp* reuse; - empty_tree(outnet); - for(i=0; i<total; i++) { - reuse_tcp_insert(outnet, outnet->tcp_conns[i]); - } - check_tree_and_list(outnet, total); - reuse = outnet->tcp_reuse_first; - for(i=0; i<position; i++) reuse = reuse->lru_next; - reuse_tcp_remove_tree_list(outnet, reuse); - check_tree_and_list(outnet, total-1); -} - -/** check snipping off the last element of the LRU with total elements */ -static void check_snip(struct outside_network* outnet, int total) -{ - int i; - struct reuse_tcp* reuse; - empty_tree(outnet); - for(i=0; i<total; i++) { - reuse_tcp_insert(outnet, outnet->tcp_conns[i]); - } - check_tree_and_list(outnet, total); - reuse = reuse_tcp_lru_snip(outnet); - while(reuse) { - reuse_tcp_remove_tree_list(outnet, reuse); - check_tree_and_list(outnet, --total); - reuse = reuse_tcp_lru_snip(outnet); - } - unit_assert(outnet->tcp_reuse_first == NULL); - unit_assert(outnet->tcp_reuse_last == NULL); - unit_assert(outnet->tcp_reuse.count == 0); -} - -/** test tcp_reuse tree and LRU list functions */ -static void tcp_reuse_tree_list_test(void) -{ - size_t i; - struct outside_network outnet; - struct reuse_tcp* reuse; - memset(&outnet, 0, sizeof(outnet)); - rbtree_init(&outnet.tcp_reuse, reuse_cmp); - outnet.num_tcp = 5; - outnet.tcp_reuse_max = outnet.num_tcp; - if(!create_pending_tcp(&outnet)) fatal_exit("out of memory"); - /* add all to the tree */ - unit_show_func("services/outside_network.c", "reuse_tcp_insert"); - for(i=0; i<outnet.num_tcp; i++) { - reuse_tcp_insert(&outnet, outnet.tcp_conns[i]); - check_tree_and_list(&outnet, i+1); - } - /* check touching */ - unit_show_func("services/outside_network.c", "reuse_tcp_lru_touch"); - for(i=0; i<outnet.tcp_reuse.count; i++) { - for(reuse = outnet.tcp_reuse_first; reuse->lru_next; reuse = reuse->lru_next); - reuse_tcp_lru_touch(&outnet, reuse); - check_tree_and_list(&outnet, outnet.num_tcp); - } - /* check removal */ - unit_show_func("services/outside_network.c", "reuse_tcp_remove_tree_list"); - check_removal(&outnet, 2, 5); - check_removal(&outnet, 1, 3); - check_removal(&outnet, 1, 2); - /* check snip */ - unit_show_func("services/outside_network.c", "reuse_tcp_lru_snip"); - check_snip(&outnet, 4); - - for(i=0; i<outnet.num_tcp; i++) - if(outnet.tcp_conns[i]) { - free(outnet.tcp_conns[i]); - } - free(outnet.tcp_conns); -} - -void tcpreuse_test(void) -{ - unit_show_feature("tcp_reuse"); - tcpid_test(); - tcp_reuse_tree_list_test(); -} |