From 5297eb140538a073f27dac8df75acc171511f43f Mon Sep 17 00:00:00 2001 From: Jan Kadlec <jan@hp4-jankadlec.(none)> Date: Mon, 22 Nov 2010 14:02:46 +0100 Subject: [PATCH] Changes to both rrset and node APIs as well as test for those APIs. Node API and tests should be complete. Refs #108, #109, #110, #116 --- src/dnslib/node.c | 20 ++++-- src/dnslib/rrset.c | 45 ++----------- src/tests/dnslib/dnslib_node_tests.c | 97 ++++++++++++++++++++++++--- src/tests/dnslib/dnslib_rrset_tests.c | 14 ++-- src/tests/dnslib_tests.c | 4 +- 5 files changed, 116 insertions(+), 64 deletions(-) diff --git a/src/dnslib/node.c b/src/dnslib/node.c index a6b304974..9f3df3ff9 100644 --- a/src/dnslib/node.c +++ b/src/dnslib/node.c @@ -12,12 +12,17 @@ #include "node.h" #include "rrset.h" -int compare_rrset_types( void *rrset_1, void *rrset_2 ) +//void print_node(void *key, void *val) +//{ +// dnslib_rrset_t *rrset = (dnslib_node_t*) val; +// int *key_i = (int*)key; +// printf("key %d\n", key_i); +// printf("%d\n", rrset->type); +//} + +int compare_rrset_types( void *key1, void *key2 ) { - return (((dnslib_rrset_t *)rrset_1)->type == - ((dnslib_rrset_t *)rrset_2)->type ? 0 : - ((dnslib_rrset_t *)rrset_1)->type < - ((dnslib_rrset_t *)rrset_2)->type ? -1 : 1); + return (key1 == key2 ? 0 : key1 < key2 ? -1 : 1); } dnslib_node_t *dnslib_node_new( dnslib_dname_t *owner, dnslib_node_t *parent ) @@ -37,16 +42,17 @@ dnslib_node_t *dnslib_node_new( dnslib_dname_t *owner, dnslib_node_t *parent ) int dnslib_node_add_rrset( dnslib_node_t *node, dnslib_rrset_t *rrset ) { - if ((skip_insert(node->rrsets, &rrset->type, &rrset, NULL)) != 0) { + if ((skip_insert(node->rrsets, (void*)rrset->type, (void*)rrset, NULL)) != 0) { return -2; } + return 0; } const dnslib_rrset_t *dnslib_node_get_rrset( const dnslib_node_t *node, uint16_t type ) { - return (dnslib_rrset_t*)skip_find(node->rrsets, &type); + return (dnslib_rrset_t*)skip_find(node->rrsets, type); } const dnslib_node_t *dnslib_node_get_parent( const dnslib_node_t *node ) diff --git a/src/dnslib/rrset.c b/src/dnslib/rrset.c index 6854b6b6a..0f5964d15 100644 --- a/src/dnslib/rrset.c +++ b/src/dnslib/rrset.c @@ -41,53 +41,18 @@ int dnslib_rrset_add_rdata( dnslib_rrset_t *rrset, dnslib_rdata_t *rdata ) } if (rrset->rdata == NULL) { - if ((rrset->rdata = dnslib_rdata_new()) == NULL) { - ERR_ALLOC_FAILED; - return -1; - } - rrset->rdata->items = rdata->items; - rrset->rdata->count = rdata->count; + rrset->rdata = rdata; rrset->rdata->next = rrset->rdata; } else { - dnslib_rdata_t *new_element = dnslib_rdata_new(); - if (new_element == NULL) { - ERR_ALLOC_FAILED; - return -1; - } - dnslib_rdata_t *tmp; tmp = rrset->rdata; - new_element->items = rdata->items; - - new_element->count = rdata->count; - - dnslib_rrtype_descriptor_t *desc = - dnslib_rrtype_descriptor_by_type(rrset->type); - - //TODO change to rdata_compare - - if (atoi(rdata->items[0].raw_data) < atoi(tmp->items[0].raw_data)) { - //TODO remove this cycle and assert - tmp = rrset->rdata; - while (tmp->next != rrset->rdata) { - tmp = tmp->next; - } - - new_element->next = rrset->rdata; - rrset->rdata = new_element; - - assert(tmp->next == new_element); - } else { - while (tmp->next != rrset->rdata && - atoi(rdata->items[0].raw_data) > - atoi(tmp->next->items[0].raw_data)) { - tmp = tmp->next; - } - new_element->next = tmp->next; - tmp->next = new_element; + while (tmp->next != rrset->rdata) { + tmp = tmp->next; } + rdata->next = tmp->next; + tmp->next = rdata; } return 0; } diff --git a/src/tests/dnslib/dnslib_node_tests.c b/src/tests/dnslib/dnslib_node_tests.c index a338ae690..83eefe64d 100644 --- a/src/tests/dnslib/dnslib_node_tests.c +++ b/src/tests/dnslib/dnslib_node_tests.c @@ -20,7 +20,7 @@ unit_api dnslib_node_tests_api = { */ // C will not accept const int in other const definition -enum { TEST_NODES = 1}; +enum { TEST_NODES = 2, RRSETS = 2}; struct test_node { dnslib_dname_t owner; @@ -28,12 +28,19 @@ struct test_node { uint size; }; +static dnslib_dname_t test_dnames[TEST_NODES] = { + {(uint8_t *)"\3www\7example\3com", 17}, + {(uint8_t *)"\3www\7example\3com", 17} +}; + static struct test_node test_nodes[TEST_NODES] = { + {{(uint8_t *)"\3com", 4}, (dnslib_node_t *)NULL}, {{(uint8_t *)"\3www\7example\3com", 17}, (dnslib_node_t *)0xBADDCAFE} }; -static dnslib_rrset_t rrsets[1] = { - {{(uint8_t *)"\3www\7example\3com", 17}, 1, 1, 3600, NULL, NULL, NULL, 0} +static dnslib_rrset_t rrsets[RRSETS] = { + {&test_dnames[0], 1, 1, 3600, NULL, NULL, NULL, 0}, + {&test_dnames[1], 2, 1, 3600, NULL, NULL, NULL, 0} }; static int test_node_create() @@ -64,15 +71,73 @@ static int test_node_add_rrset() errors++; diag("Failed to insert rrset into node"); } - if (dnslib_node_get_rrset(tmp, rrset->type) == NULL) { - errors++; - diag("Failed to get rrset from node"); + dnslib_node_free(&tmp); + } + + return (errors == 0); +} + +static int test_node_get_rrset() +{ + dnslib_node_t *tmp; + dnslib_rrset_t *rrset; + int errors = 0; + + dnslib_node_t *nodes[TEST_NODES]; + + for (int i = 0; i < TEST_NODES && !errors; i++) { + tmp = dnslib_node_new(&test_nodes[i].owner, test_nodes[i].parent); + nodes[i]=tmp; + for (int j = 0; j < RRSETS; j++) { + dnslib_node_add_rrset(tmp, &rrsets[j]); } } + + for (int i = 0; i < TEST_NODES && !errors; i++) { + for (int j = 0; j < RRSETS; j++) { + rrset = &rrsets[j]; + if (dnslib_node_get_rrset(nodes[i], rrset->type) != rrset) { + errors++; + diag("Failed to get proper rrset from node"); + } + } + dnslib_node_free(&nodes[i]); + } + return (errors == 0); } -static const int DNSLIB_NODE_TEST_COUNT = 1; +static int test_node_get_parent() +{ + dnslib_node_t *tmp; + dnslib_rrset_t *rrset; + int errors = 0; + + dnslib_node_t *nodes[TEST_NODES]; + + for (int i = 0; i < TEST_NODES && !errors; i++) { + tmp = dnslib_node_new(&test_nodes[i].owner, test_nodes[i].parent); + nodes[i]=tmp; + rrset = &rrsets[i]; + dnslib_node_add_rrset(tmp, rrset); + } + + for (int i = 0; i < TEST_NODES && !errors; i++) { + rrset = &rrsets[i]; + if (dnslib_node_get_parent(nodes[i]) != test_nodes[i].parent) { + errors++; + diag("Failed to get proper parent from node"); + } + dnslib_node_free(&nodes[i]); + } +} + +static int test_node_delete() +{ + return 0; +} + +static const int DNSLIB_NODE_TEST_COUNT = 5; /*! This helper routine should report number of * scheduled tests for given parameters. @@ -87,11 +152,25 @@ static int dnslib_node_tests_count(int argc, char *argv[]) static int dnslib_node_tests_run(int argc, char *argv[]) { - ok(test_node_create(), "node: create"); + int ret; + ret = test_node_create(); + ok(ret, "node: create"); - //skip + skip(!ret, 3) ok(test_node_add_rrset(), "node: add"); + ok(test_node_get_rrset(), "node: get"); + + ok(test_node_get_parent(), "node: get parent"); + + endskip; + + todo(); + + ok(test_node_delete(), "node: delete"); + + endtodo; + return 0; } diff --git a/src/tests/dnslib/dnslib_rrset_tests.c b/src/tests/dnslib/dnslib_rrset_tests.c index ce646dcef..242efcce9 100644 --- a/src/tests/dnslib/dnslib_rrset_tests.c +++ b/src/tests/dnslib/dnslib_rrset_tests.c @@ -289,17 +289,17 @@ static int test_rrset_rdata() } tmp = rrset->rdata; - - int last = atoi((const char *)rrset->rdata->items[0].raw_data); - + + int i = 0; while (tmp->next!=rrset->rdata && !errors) { - tmp = tmp->next; - if (last > atoi((const char *)tmp->items[0].raw_data)) { - diag("Sorting of RDATA error!"); + if (atoi(test_strings[i]) != atoi(tmp->items[0].raw_data)) { + diag("Adding RDATA error!, is %s should be %s", + tmp->items[0].raw_data, test_strings[i]); errors++; } - last = atoi((const char *)tmp->items[0].raw_data); + i++; + tmp = tmp->next; } dnslib_rrset_free(&rrset); diff --git a/src/tests/dnslib_tests.c b/src/tests/dnslib_tests.c index be425eeca..70427026b 100644 --- a/src/tests/dnslib_tests.c +++ b/src/tests/dnslib_tests.c @@ -3,6 +3,7 @@ #include "dnslib/dnslib_dname_tests.c" #include "dnslib/dnslib_rdata_tests.c" #include "dnslib/dnslib_node_tests.c" +#include "dnslib/dnslib_rrset_tests.c" static int dnslib_tests_count(int argc, char *argv[]); static int dnslib_tests_run(int argc, char *argv[]); @@ -39,6 +40,7 @@ static int dnslib_tests_run(int argc, char *argv[]) res += dnslib_rdata_tests_run(argc, argv); note("Testing module: node"); res += dnslib_node_tests_run(argc, argv); - + note("Testing module: rrset"); + res += dnslib_rrset_tests_run(argc, argv); return res; } -- GitLab