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