From c8b151f0aaea7c8c1958a2d54afeeaf04a65e944 Mon Sep 17 00:00:00 2001
From: Jan Kadlec <jan.kadlec@nic.cz>
Date: Thu, 17 Jan 2013 19:24:28 +0100
Subject: [PATCH] Fixed references to testing data. + error fixes

- Fixed compilation errors and warning.
---
 src/Makefile.am                         | 109 +++-
 src/libknot/rrset.c                     |  86 ++--
 src/libknot/rrset.h                     |  11 +-
 src/tests/libknot/libknot/rrset_tests.c | 633 +++++++++++++-----------
 4 files changed, 505 insertions(+), 334 deletions(-)

diff --git a/src/Makefile.am b/src/Makefile.am
index 5974f16fd..00774cd32 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -123,14 +123,119 @@ knot_zcompile_SOURCES =				\
 	zscanner/scanner_functions.c
 	
 unittests_libknot_SOURCES =			\
+	libknot/rrset.c				\
+	libknot/rrset.h				\
+	common/slab/slab.c			\
+	zcompile/zcompile-error.c		\
+	zcompile/zcompile.c			\
+	zscanner/test/processing.h		\
+	zscanner/test/processing.c		\
+	libknot/util/utils.c			\
+	libknot/util/debug.c			\
+	libknot/util/debug.h			\
+	libknot/util/utils.h			\
+	libknot/util/tolower.h			\
+	libknot/util/tolower.c			\
+	libknot/util/wire.h			\
+	libknot/packet/packet.h			\
+	libknot/packet/packet.c			\
+	libknot/packet/query.h			\
+	libknot/packet/query.c			\
+	libknot/zone/zone.c			\
+	libknot/zone/zone-contents.c		\
+	libknot/zone/zone-tree.c		\
+	libknot/zone/zone-tree.h		\
+	libknot/zone/node.h			\
+	libknot/zone/zone.h			\
+	libknot/zone/zone-contents.h		\
+	libknot/zone/node.c			\
+	libknot/zone/dname-table.h		\
+	libknot/zone/dname-table.c		\
+	libknot/zone/zonedb.h			\
+	libknot/zone/zonedb.c			\
+	libknot/dname.c				\
+	libknot/dname.h				\
+	libknot/nsec3.h				\
+	libknot/nsec3.c				\
+	libknot/edns.h				\
+	libknot/edns.c				\
+	libknot/tsig.h				\
+	libknot/tsig.c				\
+	libknot/tsig-op.h			\
+	libknot/tsig-op.c			\
+	common/slab/slab.h			\
+	common/libtap/tap.c			\
+	common/libtap/tap.h			\
+	common/libtap/tap_unit.h		\
+	common/hattrie/ahtable.c		\
+	common/hattrie/ahtable.h		\
+	common/hattrie/hat-trie.c		\
+	common/hattrie/hat-trie.h		\
+	common/hattrie/murmurhash3.c		\
+	common/hattrie/murmurhash3.h		\
+	common/mempattern.h			\
+	common/mempattern.c			\
+	common/descriptor_new.h			\
+	common/descriptor_new.c			\
+	common/lists.c				\
+	common/base64.c				\
+	common/base64.h				\
+	common/lists.h				\
+	common/heap.h				\
+	common/heap.c				\
+	common/print.c				\
+	common/print.h				\
+	common/skip-list.c			\
+	common/base32hex.c			\
+	common/skip-list.h			\
+	common/general-tree.h			\
+	common/general-tree.c			\
+	common/tree.h				\
+	common/base32hex.h			\
+	common/evqueue.h			\
+	common/evqueue.c			\
+	common/evsched.h			\
+	common/evsched.c			\
+	common/acl.h				\
+	common/acl.c				\
+	common/sockaddr.h			\
+	common/sockaddr.c			\
+	common/crc.h				\
+	common/ref.h				\
+	common/ref.c				\
+	common/errors.h				\
+	common/errors.c				\
+	common/errcode.h			\
+	common/errcode.c			\
+	common/dSFMT.h				\
+	common/dSFMT-params.h			\
+	common/dSFMT-params521.h		\
+	common/dSFMT.c				\
+	common/prng.h				\
+	common/prng.c				\
+	common/fdset.h				\
+	common/fdset.c				\
+	common/fdset_poll.h			\
+	common/fdset_poll.c			\
+	common/fdset_kqueue.h			\
+	common/fdset_kqueue.c			\
+	common/fdset_epoll.h			\
+	common/fdset_epoll.c			\
+	common/log.c				\
+	common/log.h				\
+	zscanner/file_loader.h			\
+	zscanner/file_loader.c			\
+	zscanner/scanner.h			\
+	zscanner/scanner.c			\
+	zscanner/scanner_functions.h		\
+	zscanner/scanner_functions.c		\
 	tests/libknot/libknot/rrset_tests.c	\
 	tests/libknot/libknot/rrset_tests.h	\
 	tests/libknot/unittests_libknot.c
 
-
 knot_zcompile_LDADD = @LIBOBJS@
 
-unittests_libknot_LDADD = knot-zcompile.la @LIBOBJS@
+unittests_libknot_LDADD = @LIBOBJS@
 
 # automake complains on % rules:
 #   `%'-style pattern rules are a GNU make extension
diff --git a/src/libknot/rrset.c b/src/libknot/rrset.c
index ed3effff3..985510a54 100644
--- a/src/libknot/rrset.c
+++ b/src/libknot/rrset.c
@@ -355,7 +355,6 @@ void knot_rrset_set_owner(knot_rrset_t *rrset, knot_dname_t* owner)
 		rrset->owner = owner;
 	}
 }
-int knot_dname_compare_non_canon(const knot_dname_t *d1, const knot_dname_t *d2)
 
 /*----------------------------------------------------------------------------*/
 
@@ -456,7 +455,6 @@ static int rrset_rdata_compare_one(const knot_rrset_t *rrset1,
 	for (int i = 0; desc->block_types[i] != KNOT_RDATA_WF_END; i++) {
 		if (descriptor_item_is_dname(desc->block_types[i])) {
 			cmp = knot_dname_compare((knot_dname_t *)(r1 + offset),
-			                         n_canon
 			                         (knot_dname_t *)(r2 + offset));
 			offset += sizeof(knot_dname_t *);
 		} else if (descriptor_item_is_fixed(desc->block_types[i])) {
@@ -1500,54 +1498,31 @@ const uint8_t *knot_rrset_rdata_nsec3_salt(const knot_rrset_t *rrset,
 	return rrset_rdata_pointer(rrset, pos) + 4;
 }
 
-const knot_dname_t *knot_rrset_next_dname(const knot_rrset_t *rrset,
-                                          const knot_dname_t *prev_dname)
-{
-	return (const knot_dname_t *)knot_rrset_get_next_dname(rrset,
-	                                  (knot_dname_t *)prev_dname);
-}
-
-knot_dname_t *knot_rrset_get_next_dname(const knot_rrset_t *rrset,
-                                        knot_dname_t *prev_dname)
+static knot_dname_t **knot_rrset_rdata_get_next_dname_pointer(
+	const knot_rrset_t *rrset,
+	knot_dname_t **prev_dname, size_t pos)
 {
 	if (rrset == NULL) {
 		return NULL;
 	}
 	
-	for (uint16_t i = 0; i < rrset->rdata_count; i++) {
-		knot_dname_t **ret =
-			knot_rrset_rdata_get_next_dname_pointer(rrset,
-		                                                &prev_dname, i);
-		if (ret != NULL) {
-			return *ret;
-		}
-	}
-	
-	return NULL;
-}
-
-knot_dname_t **knot_rrset_get_next_dname_pointer(const knot_rrset_t *rrset,
-                                                 knot_dname_t **prev_dname)
-{
-	if (rrset == NULL) {
-		return NULL;
-	}
+	printf("previous: %s %d %p\n", (prev_dname != NULL) ? knot_dname_to_str(*prev_dname) : "null",
+	       pos, prev_dname);
 	
 	// Get descriptor
 	const rdata_descriptor_t *desc =
 		get_rdata_descriptor(rrset->type);
 	int next = 0;
+	size_t offset = 0;
+	uint8_t *rdata = rrset_rdata_pointer(rrset, pos);
 	if (prev_dname == NULL) {
 		next = 1;
 	}
-
-	for (uint16_t pos = 0; pos < rrset->rdata_count; pos++) {
-	size_t offset = 0;
-	uint8_t *rdata = rrset_rdata_pointer(rrset, pos);
 	// Cycle through blocks and find dnames
 	for (int i = 0; desc->block_types[i] != KNOT_RDATA_WF_END; i++) {
 		if (descriptor_item_is_dname(desc->block_types[i])) {
 			if (next) {
+//				toto je imho spatne, ale who knows TODO
 				assert(rdata + offset);
 				return (knot_dname_t **)(rdata + offset);
 			}
@@ -1590,37 +1565,59 @@ knot_dname_t **knot_rrset_get_next_dname_pointer(const knot_rrset_t *rrset,
 			 */
 			offset += sizeof(knot_dname_t *); // now it does
 		}
-		//TODO remainder matters too!
-	}
 	}
+	
 	return NULL;
 }
 
-knot_dname_t **knot_rrset_rdata_get_next_dname_pointer(
-	const knot_rrset_t *rrset,
-	knot_dname_t **prev_dname, size_t pos)
+const knot_dname_t *knot_rrset_next_dname(const knot_rrset_t *rrset,
+                                          const knot_dname_t *prev_dname)
+{
+	return (const knot_dname_t *)knot_rrset_get_next_dname(rrset,
+	                                  (knot_dname_t *)prev_dname);
+}
+
+knot_dname_t *knot_rrset_get_next_dname(const knot_rrset_t *rrset,
+                                        knot_dname_t *prev_dname)
 {
 	if (rrset == NULL) {
 		return NULL;
 	}
 	
-	printf("previous: %s %d %p\n", (prev_dname != NULL) ? knot_dname_to_str(*prev_dname) : "null",
-	       pos, prev_dname);
+	for (uint16_t i = 0; i < rrset->rdata_count; i++) {
+		knot_dname_t **ret =
+			knot_rrset_rdata_get_next_dname_pointer(rrset,
+		                                                &prev_dname, i);
+		if (ret != NULL) {
+			return *ret;
+		}
+	}
+	
+	return NULL;
+}
+
+knot_dname_t **knot_rrset_get_next_dname_pointer(const knot_rrset_t *rrset,
+                                                 knot_dname_t **prev_dname)
+{
+	if (rrset == NULL) {
+		return NULL;
+	}
 	
 	// Get descriptor
 	const rdata_descriptor_t *desc =
 		get_rdata_descriptor(rrset->type);
 	int next = 0;
-	size_t offset = 0;
-	uint8_t *rdata = rrset_rdata_pointer(rrset, pos);
 	if (prev_dname == NULL) {
 		next = 1;
 	}
+
+	for (uint16_t pos = 0; pos < rrset->rdata_count; pos++) {
+	size_t offset = 0;
+	uint8_t *rdata = rrset_rdata_pointer(rrset, pos);
 	// Cycle through blocks and find dnames
 	for (int i = 0; desc->block_types[i] != KNOT_RDATA_WF_END; i++) {
 		if (descriptor_item_is_dname(desc->block_types[i])) {
 			if (next) {
-//				toto je imho spatne, ale who knows TODO
 				assert(rdata + offset);
 				return (knot_dname_t **)(rdata + offset);
 			}
@@ -1663,8 +1660,9 @@ knot_dname_t **knot_rrset_rdata_get_next_dname_pointer(
 			 */
 			offset += sizeof(knot_dname_t *); // now it does
 		}
+		//TODO remainder matters too!
+	}
 	}
-	
 	return NULL;
 }
 
diff --git a/src/libknot/rrset.h b/src/libknot/rrset.h
index d223205d3..77be026b7 100644
--- a/src/libknot/rrset.h
+++ b/src/libknot/rrset.h
@@ -336,7 +336,7 @@ void knot_rrset_deep_free(knot_rrset_t **rrset, int free_owner,
  * \retval KNOT_EOK
  * \retval KNOT_EINVAL if the RRSets could not be merged, because their
  *         Owner, Type, Class or TTL does not match.
- *	/
+ */
 int knot_rrset_merge(void **r1, void **r2);
 
 
@@ -402,15 +402,6 @@ const uint8_t *knot_rrset_rdata_nsec3param_salt(const knot_rrset_t *rrset);
 knot_dname_t *knot_rrset_get_next_dname(const knot_rrset_t *rrset,
                                         knot_dname_t *prev_dname);
 
-const knot_dname_t *knot_rrset_rdata_next_dname(const knot_rrset_t *rrset,
-                                                const knot_dname_t *prev_dname,
-                                                size_t pos);
-
-knot_dname_t **knot_rrset_rdata_get_next_dname_pointer(
-	const knot_rrset_t *rrset,
-	knot_dname_t **prev_dname, size_t pos);
-
-
 knot_dname_t **knot_rrset_get_next_dname_pointer(const knot_rrset_t *rrset,
                                                  knot_dname_t **prev_dname);
 
diff --git a/src/tests/libknot/libknot/rrset_tests.c b/src/tests/libknot/libknot/rrset_tests.c
index 3cfd00483..b0cf0f719 100644
--- a/src/tests/libknot/libknot/rrset_tests.c
+++ b/src/tests/libknot/libknot/rrset_tests.c
@@ -22,6 +22,7 @@
 #include "common/errcode.h"
 #include "libknot/rrset.h"
 #include "libknot/util/wire.h"
+#include "common/mempattern.h"
 
 static int knot_rrset_tests_count(int argc, char *argv[]);
 static int knot_rrset_tests_run(int argc, char *argv[]);
@@ -39,9 +40,9 @@ unit_api rrset_tests_api = {
  */
 
 enum rrset_test_const {
-	TEST_RRSET_COUNT = 6,
-	TEST_RDATA_COUNT = 6,
-	TEST_DNAME_COUNT = 8,
+	TEST_RRSET_COUNT = 13,
+	TEST_RDATA_COUNT = 10,
+	TEST_DNAME_COUNT = 11,
 	TEST_RDATA_A_LESS = 0,
 	TEST_RDATA_A_GT = 1,
 	TEST_RDATA_NS_LESS = 2,
@@ -74,18 +75,18 @@ enum rrset_test_const {
 	TEST_DNAME_GREATER = 2
 };
 
-static uint8_t *test_dname_strings[TEST_DNAME_COUNT] = {
-	(uint8_t *)"a.dname.com.",
-	(uint8_t *)"b.dname.com.",
-	(uint8_t *)"c.dname.com.",
-	(uint8_t *)"d.dname.com.",
-	(uint8_t *)"e.dname.com.",
-	(uint8_t *)"f.dname.com.",
-	(uint8_t *)"ns1.nic.cz.",
-	(uint8_t *)"ns2.nic.cz.",
-	(uint8_t *)"ns3.nic.cz.",
-	(uint8_t *)"ns4.nic.cz.",
-	(uint8_t *)"ns5.nic.cz."
+static char *test_dname_strings[TEST_DNAME_COUNT] = {
+	"a.dname.com.",
+	"b.dname.com.",
+	"c.dname.com.",
+	"d.dname.com.",
+	"e.dname.com.",
+	"f.dname.com.",
+	"ns1.nic.cz.",
+	"ns2.nic.cz.",
+	"ns3.nic.cz.",
+	"ns4.nic.cz.",
+	"ns5.nic.cz."
 };
 
 static knot_dname_t *test_dnames[TEST_DNAME_COUNT];
@@ -101,64 +102,60 @@ typedef struct test_rdata test_rdata_t;
 
 struct test_rrset {
 	int owner_id;
-	knot_rrset_t *rrset;
+	knot_rrset_t rrset;
 	uint8_t *header_wire;
 	size_t header_wire_size;
 	uint8_t *rdata_wire;
 	size_t rdata_wire_size;
 	size_t rr_count;
-	test_rdata_t *test_rdata[16];
+	int test_rdata_indices[16];
+	test_rdata_t **test_rdata;
 };
 
 typedef struct test_rrset test_rrset_t;
 
 /* Artificial RDATA definitions: */
-test_rdata_t test_rdata_array[TEST_RDATA_COUNT] = {
-/* A type: */
+static test_rdata_t test_rdata_array[TEST_RDATA_COUNT] = {
 	[TEST_RDATA_A_LESS] = {(uint8_t *)"\x1\x1\x1\0", (uint8_t *)"\x1\x1\x1\1", 4, 4},
-/* A < previous */
 	[TEST_RDATA_A_GT] = {(uint8_t *)"\x1\x1\x1\1", (uint8_t *)"\x1\x1\x1\0", 4, 4},
-/* NS Domain names: (Will be filled dynamically) */
 	[TEST_RDATA_NS_LESS] = {NULL, NULL, sizeof(knot_dname_t *), 0},
 	[TEST_RDATA_NS_GT] = {NULL, NULL, sizeof(knot_dname_t *), 0},
-/* MX type: (raw data + DNAME) */
-	[TEST_RDATA_MX_DNAME_LESS] = {"\x0\x1", NULL, sizeof(knot_dname_t *) + 2, 0},
-	[TEST_RDATA_MX_DNAME_GT] = {"\x0\x1", NULL, sizeof(knot_dname_t *) + 2, 0},
-	[TEST_RDATA_MX_BIN_LESS] = {"\x0\x1", NULL, sizeof(knot_dname_t *) + 2, 0},
-	[TEST_RDATA_MX_BIN_GT] = {"\x0\x2", NULL, sizeof(knot_dname_t *) + 2, 0},
+	[TEST_RDATA_MX_DNAME_LESS] = {(uint8_t *)"\x0\x1", NULL, sizeof(knot_dname_t *) + 2, 0},
+	[TEST_RDATA_MX_DNAME_GT] = {(uint8_t *)"\x0\x1", NULL, sizeof(knot_dname_t *) + 2, 0},
+	[TEST_RDATA_MX_BIN_LESS] = {(uint8_t *)"\x0\x1", NULL, sizeof(knot_dname_t *) + 2, 0},
+	[TEST_RDATA_MX_BIN_GT] = {(uint8_t *)"\x0\x2", NULL, sizeof(knot_dname_t *) + 2, 0},
 	[TEST_RDATA_MINFO1] = {NULL, NULL, sizeof(knot_dname_t *) * 2, 0},
 	[TEST_RDATA_MINFO2] = {NULL, NULL, sizeof(knot_dname_t *) * 2, 0}
 };
 
 
-test_rrset_t test_rrset_array[TEST_RRSET_COUNT] = {
+static test_rrset_t test_rrset_array[TEST_RRSET_COUNT] = {
 	 [TEST_RRSET_A_LESS] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_A, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
-          NULL, 0, NULL, 0, 1, {test_rdata_array[TEST_RDATA_A_LESS]}}, // A < 
+          NULL, 0, NULL, 0, 1, {TEST_RDATA_A_LESS}, NULL},
 	 [TEST_RRSET_A_GT] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_A, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
-          NULL, 0, NULL, 0, 1, {test_rdata_array[TEST_RDATA_A_GT]}}, // A > 
-	 [TEST_RRSET_NS_LESS] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_NS, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL}
-          NULL, 0, NULL, 0, 1, {test_rdata_array[TEST_RDATA_NS_LESS]}}, // <
-	 [TEST_RRSET_NS_GT] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_NS, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL}
-          NULL, 0, NULL, 0, 1, {test_rdata_array[TEST_RDATA_NS_GT]}}, // <
-	 [TEST_RRSET_MX_DNAME_LESS] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MX, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL}
-          NULL, 0, NULL, 0, 1, {test_rdata_array[TEST_RDATA_MX_DNAME_LESS]}}, // <
-	 [TEST_RRSET_MX_DNAME_GT] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MX, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL}
-          NULL, 0, NULL, 0, 1, {test_rdata_array[TEST_RDATA_MX_DNAME_GT]}}, // <
-	 [TEST_RRSET_MX_BIN_LESS] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MX, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL}
-          NULL, 0, NULL, 0, 1, {test_rdata_array[TEST_RDATA_MX_BIN_LESS]}}, // <
-	 [TEST_RRSET_MX_BIN_GT] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MX, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL}
-          NULL, 0, NULL, 0, 1, {test_rdata_array[TEST_RDATA_MX_BIN_GT]}}, // <
-	 [TEST_RRSET_MINFO] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MINFO, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL}
-          NULL, 0, NULL, 0, 1, {test_rdata_array[TEST_RDATA_MINFO1]}}, // <
-	 [TEST_RRSET_MINFO_MULTIPLE] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MINFO, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL}
-          NULL, 0, NULL, 0, 2, {test_rdata_array[TEST_RDATA_MINFO1], test_rdata_array[TEST_RDATA_MINFO2]}}, // <
+          NULL, 0, NULL, 0, 1, {TEST_RDATA_A_GT}, NULL},
+	 [TEST_RRSET_NS_LESS] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_NS, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
+          NULL, 0, NULL, 0, 1, {TEST_RDATA_NS_LESS}, NULL},
+	 [TEST_RRSET_NS_GT] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_NS, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
+          NULL, 0, NULL, 0, 1, {TEST_RDATA_NS_GT}, NULL},
+	 [TEST_RRSET_MX_DNAME_LESS] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MX, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
+          NULL, 0, NULL, 0, 1, {TEST_RDATA_MX_DNAME_LESS}, NULL},
+	 [TEST_RRSET_MX_DNAME_GT] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MX, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
+          NULL, 0, NULL, 0, 1, {TEST_RDATA_MX_DNAME_GT}, NULL},
+	 [TEST_RRSET_MX_BIN_LESS] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MX, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
+          NULL, 0, NULL, 0, 1, {TEST_RDATA_MX_BIN_LESS}, NULL},
+	 [TEST_RRSET_MX_BIN_GT] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MX, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
+          NULL, 0, NULL, 0, 1, {TEST_RDATA_MX_BIN_GT}, NULL},
+	 [TEST_RRSET_MINFO] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MINFO, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
+          NULL, 0, NULL, 0, 1, {TEST_RDATA_MINFO1}, NULL},
+	 [TEST_RRSET_MINFO_MULTIPLE] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_MINFO, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
+          NULL, 0, NULL, 0, 2, {TEST_RDATA_MINFO1, TEST_RDATA_MINFO2}, NULL},
 	 [TEST_RRSET_MERGE_RESULT1] = {TEST_DNAME_GENERIC, {NULL, KNOT_RRTYPE_A, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
-          NULL, 0, NULL, 0, 2, {test_rdata_array[TEST_RDATA_A_LESS], test_rdata_array[TEST_RDATA_A_GT]}}, // A < 
+          NULL, 0, NULL, 0, 2, {TEST_RDATA_A_LESS, TEST_RDATA_A_GT}, NULL},
 	 [TEST_RRSET_OWNER_LESS] = {TEST_DNAME_LESS, {NULL, KNOT_RRTYPE_A, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
-          NULL, 0, NULL, 0, 1, {test_rdata_array[TEST_RDATA_A_LESS]}}, // A < 
+          NULL, 0, NULL, 0, 1, {TEST_RDATA_A_LESS}, NULL},
 	 [TEST_RRSET_OWNER_GT] = {TEST_DNAME_GREATER, {NULL, KNOT_RRTYPE_A, KNOT_CLASS_IN, 3600, NULL, NULL, 0, NULL},
-          NULL, 0, NULL, 0, 1, {test_rdata_array[TEST_RDATA_A_LESS]}}, // A < 
-	}
+          NULL, 0, NULL, 0, 1, {TEST_RDATA_A_LESS}, NULL}
 };
 
 static void create_test_dnames()
@@ -168,22 +165,32 @@ static void create_test_dnames()
 			knot_dname_new_from_str(test_dname_strings[i],
 		                                strlen(test_dname_strings[i]),
 		                                NULL);
-		if (test_dnames[i] == NULL) {
-			diag("Failed to create test dname.\n");
-			return -1;
-		}
 	}
 }
 
 static void create_test_rdata()
 {
 	/* NS, MX and MINFO types need init. */
-	memcpy(test_rdata_array[TEST_RDATA_MX_1].rdata + 2, &test_dnames[0],
+	memcpy(test_rdata_array[TEST_RDATA_NS_LESS].rdata + 2, &test_dnames[0],
+	       sizeof(knot_dname_t *));
+	memcpy(test_rdata_array[TEST_RDATA_NS_GT].rdata + 2, &test_dnames[0],
+	       sizeof(knot_dname_t *));
+	memcpy(test_rdata_array[TEST_RDATA_MX_DNAME_LESS].rdata + 2, &test_dnames[0],
 	       sizeof(knot_dname_t *));
-	memcpy(test_rdata_array[TEST_RDATA_MX_2].rdata + 2, &test_dnames[1],
+	memcpy(test_rdata_array[TEST_RDATA_MX_DNAME_GT].rdata + 2, &test_dnames[1],
 	       sizeof(knot_dname_t *));
-	memcpy(test_rdata_array[TEST_RDATA_MX_3].rdata + 2, &test_dnames[2],
+	memcpy(test_rdata_array[TEST_RDATA_MX_BIN_LESS].rdata + 2, &test_dnames[2],
 	       sizeof(knot_dname_t *));
+	memcpy(test_rdata_array[TEST_RDATA_MX_BIN_GT].rdata + 2, &test_dnames[2],
+	       sizeof(knot_dname_t *));
+	memcpy(test_rdata_array[TEST_RDATA_MINFO1].rdata, &test_dnames[0],
+	       sizeof(knot_dname_t *));
+	memcpy(test_rdata_array[TEST_RDATA_MINFO1].rdata + sizeof(knot_dname_t *),
+	       &test_dnames[1], sizeof(knot_dname_t *));
+	memcpy(test_rdata_array[TEST_RDATA_MINFO2].rdata, &test_dnames[2],
+	       sizeof(knot_dname_t *));
+	memcpy(test_rdata_array[TEST_RDATA_MINFO2].rdata + sizeof(knot_dname_t *),
+	       &test_dnames[3], sizeof(knot_dname_t *));
 }
 
 static void create_test_rrsets()
@@ -191,28 +198,31 @@ static void create_test_rrsets()
 	for (int i = 0; i < TEST_RRSET_COUNT; i++) {
 		test_rrset_t test_rrset = test_rrset_array[i];
 		/* Assign owner. */
-		test_rrset.rrset->owner = test_dnames[test_rrset.owner_id];
+		test_rrset.rrset.owner = test_dnames[test_rrset.owner_id];
 		/* Create header wire. */
 		test_rrset.header_wire =
-			xmalloc(test_rrset.rrset->owner->size + 8 + 2);
+			xmalloc(test_rrset.rrset.owner->size + 8 + 2);
 		/* Copy owner wire to header wire. */
-		memcpy(test_rrset.header_wire, test_rrset.rrset->owner->name,
-		       test_rrset.rrset->owner->size);
+		memcpy(test_rrset.header_wire, test_rrset.rrset.owner->name,
+		       test_rrset.rrset.owner->size);
 		/* Copy type to wire. */
-		size_t offset = test_rrset.rrset->owner->size;
+		size_t offset = test_rrset.rrset.owner->size;
 		knot_wire_write_u16(test_rrset.header_wire + offset,
-		                    test_rrset.rrset->type);
+		                    test_rrset.rrset.type);
 		offset += sizeof(uint16_t);
 		/* Copy class to wire. */
 		knot_wire_write_u16(test_rrset.header_wire + offset,
-		                    test_rrset.rrset->rclass);
+		                    test_rrset.rrset.rclass);
 		offset += sizeof(uint16_t);
 		/* Copy TTL to wire. */
 		knot_wire_write_u32(test_rrset.header_wire + offset,
-		                    test_rrset.rrset->TTL);
+		                    test_rrset.rrset.ttl);
 		offset += sizeof(uint32_t);
 		uint16_t rdlength = 0;
+		test_rrset.test_rdata =
+			xmalloc(sizeof(void *) * test_rrset.rr_count);
 		for (int j = 0; j < test_rrset.rr_count; j++) {
+			test_rrset.test_rdata[j] = &test_rdata_array[j];
 			rdlength += test_rrset.test_rdata[j]->wire_size;
 		}
 		/* Copy RDLENGTH to wire. */
@@ -220,21 +230,21 @@ static void create_test_rrsets()
 		                    rdlength);
 		/* Assign RDATA (including indices). */
 		offset = 0;
-		test_rrset.rrset->rdata_indices =
+		test_rrset.rrset.rdata_indices =
 			xmalloc(sizeof(uint32_t) * test_rrset.rr_count);
 		for (int j = 0; j < test_rrset.rr_count; j++) {
 			if (j > 0) {
-				test_rrset.rrset->rdata_indices[j - 1] =
+				test_rrset.rrset.rdata_indices[j - 1] =
 					test_rrset.test_rdata[j]->size;
 			}
 			
-			memcpy(test_rrset.rrset->rdata + offset,
+			memcpy(test_rrset.rrset.rdata + offset,
 			       test_rrset.test_rdata[j]->rdata,
 			       test_rrset.test_rdata[j]->size);
 			offset += test_rrset.test_rdata[j]->size;
 		}
 		/* Store sum of indices to the last index. */
-		test_rrset.rrset->rdata_indices[test_rrset.rr_count - 1] =
+		test_rrset.rrset.rdata_indices[test_rrset.rr_count - 1] =
 			offset;
 		/* Store RDATA wire. */
 		offset = 0;
@@ -254,7 +264,7 @@ static int check_rrset_values(const knot_rrset_t *rrset,
 {
 	int errors = 0;
 	
-	if (rrset->dname != dname) {
+	if (rrset->owner != dname) {
 		diag("Wrong DNAME in the created RRSet.\n");
 		++errors;
 	}
@@ -385,16 +395,16 @@ static int test_rrset_create_rdata()
 	}
 	
 	/* Make sure that the data in the RRSet are the same. */
-	ret = memcmp(rrset->rdata + test_rdata_array[0].size, data2,
-	             test_rdata_array[1].rdata);
+	ret = memcmp(rrset->rdata + test_rdata_array[0].size,
+	             test_rdata_array[1].rdata, test_rdata_array[1].size);
 	if (ret) {
 		diag("Wrong data inserted into RRSet.\n");
 		return 0;
 	}
 	
 	/* Test that data of length 0 are not inserted. */
-	void *ret = knot_rrset_create_rdata(rrset, 0);
-	if (ret != NULL) {
+	void *ret_ptr = knot_rrset_create_rdata(rrset, 0);
+	if (ret_ptr != NULL) {
 		diag("Empty RDATA inserted.\n");
 		return 0;
 	}
@@ -402,14 +412,17 @@ static int test_rrset_create_rdata()
 	return 1;
 }
 
-static int test_rrset_rdata_item_size(const knot_rrset_t *rrset)
+static int test_rrset_rdata_item_size()
 {
-	if (rrset_rdata_item_size(rrset, 0) != DATA1_LENGTH) {
+	/*!< \todo More thorough test. */
+	knot_rrset_t *rrset =
+		&test_rrset_array[TEST_RRSET_MINFO_MULTIPLE].rrset;
+	if (rrset_rdata_item_size(rrset, 0) != sizeof(knot_dname_t *)) {
 		diag("Wrong item length read from RRSet (first item).\n");
 		return 0;
 	}
 	
-	if (rrset_rdata_item_size(rrset, 1) != DATA2_LENGTH) {
+	if (rrset_rdata_item_size(rrset, 1) != sizeof(knot_dname_t *)) {
 		diag("Wrong item length read from RRSet (last item).\n");
 		return 0;
 	}
@@ -417,104 +430,115 @@ static int test_rrset_rdata_item_size(const knot_rrset_t *rrset)
 	return 1;
 }
 
-static int test_rrset_get_rdata(const knot_rrset_t *rrset)
+static int test_rrset_get_rdata()
 {
-	uint8_t *pointer = knot_rrset_get_rdata(rrset, 0);
-	if (pointer == NULL) {
-		diag("Could not ger RDATA from RRSet.\n");
-		return 0;
-	}
-	
-	int ret = memcmp(pointer, RDATA_INIT_1, DATA1_LENGTH);
-	if (ret) {
-		diag("Got bad RDATA from RRSet.\n");
-		return 0;
-	}
-	
-	pointer = knot_rrset_get_rdata(rrset, 1);
-	if (pointer == NULL) {
-		diag("Could not ger RDATA from RRSet.\n");
-		return 0;
-	}
-	
-	ret = memcmp(pointer, RDATA_INIT_2, DATA2_LENGTH);
-	if (ret) {
-		diag("Got bad RDATA from RRSet.\n");
-		return 0;
-	}
+//	uint8_t *pointer = knot_rrset_get_rdata(rrset, 0);
+//	if (pointer == NULL) {
+//		diag("Could not ger RDATA from RRSet.\n");
+//		return 0;
+//	}
+	
+//	int ret = memcmp(pointer, RDATA_INIT_1, DATA1_LENGTH);
+//	if (ret) {
+//		diag("Got bad RDATA from RRSet.\n");
+//		return 0;
+//	}
+	
+//	pointer = knot_rrset_get_rdata(rrset, 1);
+//	if (pointer == NULL) {
+//		diag("Could not ger RDATA from RRSet.\n");
+//		return 0;
+//	}
+	
+//	ret = memcmp(pointer, RDATA_INIT_2, DATA2_LENGTH);
+//	if (ret) {
+//		diag("Got bad RDATA from RRSet.\n");
+//		return 0;
+//	}
 	
 	return 1;
 }
 
-static int test_rrset_shallow_copy(const knot_rrset_t *rrset)
+static int test_rrset_shallow_copy()
 {
-	knot_rrset_t *rrset_copy = NULL;
-	
-	int ret = knot_rrset_shallow_copy(rrset, &rrset_copy);
-	if (ret != KNOT_EOK) {
-		diag("Could not copy RRSet.\n");
-		return 0;
-	}
+	for (int i = 0; i < TEST_RRSET_COUNT; i++) {
+		knot_rrset_t *rrset_copy = NULL;
+		knot_rrset_t *rrset = &test_rrset_array[i].rrset;
+		int ret = knot_rrset_shallow_copy(rrset,
+		                                  &rrset_copy);
+		if (ret != KNOT_EOK) {
+			knot_rrset_free(&rrset_copy);
+			diag("Could not copy RRSet.\n");
+			return 0;
+		}
 	
-	/* Check that created RRSet has the same as the old one. */
-	int errors = check_rrset_values(rrset_copy, rrset->owner, rrset->type,
-	                                rrset->rclass, rrset->ttl,
-	                                rrset->rdata_count);
-	if (errors) {
-		return 0;
-	}
+		/* Check that created RRSet has the same as the old one. */
+		int errors = check_rrset_values(rrset_copy, rrset->owner, rrset->type,
+		                                rrset->rclass, rrset->ttl,
+		                                rrset->rdata_count);
+		if (errors) {
+			knot_rrset_free(&rrset_copy);
+			return 0;
+		}
 	
-	/* Check that created RRSet has the same RDATA. */
-	if (rrset->rdata != rrset_copy->rdata) {
-		diag("RDATA in the new RRSet do not match.\n");
-		return 0;
-	}
+		/* Check that created RRSet has the same RDATA. */
+		if (rrset->rdata != rrset_copy->rdata) {
+			diag("RDATA in the new RRSet do not match.\n");
+			knot_rrset_free(&rrset_copy);
+			return 0;
+		}
 	
-	/* Check that RDATA indices are the same. */
-	if (rrset->rdata_indices != rrset_copy->rdata_indices) {
-		diag("RDATA indices in the new RRSet do not match.\n");
-		return 0;
+		/* Check that RDATA indices are the same. */
+		if (rrset->rdata_indices != rrset_copy->rdata_indices) {
+			diag("RDATA indices in the new RRSet do not match.\n");
+			knot_rrset_free(&rrset_copy);
+			return 0;
+		}
 	}
 	
-	knot_rrset_free(&rrset_copy);
-	return (errors == 0);
+	return 1;
 }
 
-static int test_rrset_deep_copy(const knot_rrset_t *rrset)
+static int test_rrset_deep_copy()
 {
+	for (int i = 0; i < TEST_RRSET_COUNT; i++) {
+		knot_rrset_t *rrset_copy = NULL;
+		knot_rrset_t *rrset = &test_rrset_array[i].rrset;
+		int ret = knot_rrset_deep_copy(rrset, &rrset_copy, 1);
+		if (ret != KNOT_EOK) {
+			diag("Could not copy RRSet.\n");
+			return 0;
+		}
 	
-	knot_rrset_t *rrset_copy = NULL;
-	
-	int ret = knot_rrset_deep_copy(rrset, &rrset_copy);
-	if (ret != KNOT_EOK) {
-		diag("Could not copy RRSet.\n");
-		return 0;
-	}
-	
-	/* Check that created RRSet has the same as the old one. */
-	int errors = check_rrset_values(rrset_copy, rrset->owner, rrset->type,
-	                                rrset->rclass, rrset->ttl,
-	                                rrset->rdata_count);
-	if (errors) {
-		return 0;
-	}
+		/* Check that created RRSet has the same as the old one. */
+		int errors = check_rrset_values(rrset_copy, rrset->owner, rrset->type,
+		                                rrset->rclass, rrset->ttl,
+		                                rrset->rdata_count);
+		if (errors) {
+			knot_rrset_deep_free(&rrset_copy, 1, 1);
+			return 0;
+		}
 	
-	/* Check that RDATA indices contain the same data. */
-	ret = memcmp(rrset->rdata_indices, rrset_copy->rdata_indices,
-	             rrset->rdata_count);
-	if (ret) {
-		diag("Copied RRSet has different RDATA indices.\n");
-		return 0;
-	}
+		/* Check that RDATA indices contain the same data. */
+		ret = memcmp(rrset->rdata_indices, rrset_copy->rdata_indices,
+		             rrset->rdata_count);
+		if (ret) {
+			diag("Copied RRSet has different RDATA indices.\n");
+			knot_rrset_deep_free(&rrset_copy, 1, 1);
+			return 0;
+		}
 	
-	/*
-	 * Go through RDATA and compare blocks. Cannot compare the whole thing
-	 * since DNAMEs are copied as well and will have different address.
-	 */
-	ret = knot_rrset_compare_rdata(rrset, rrset_copy);
-	if (ret) {
-		diag("Copied RRSet has different RDATA.\n");
-		return 0;
+		/*
+		 * Go through RDATA and compare blocks. Cannot compare the whole thing
+		 * since DNAMEs are copied as well and will have different address.
+		 */
+		ret = knot_rrset_compare_rdata(rrset, rrset_copy);
+		if (ret) {
+			diag("Copied RRSet has different RDATA.\n");
+			knot_rrset_deep_free(&rrset_copy, 1, 1);
+			return 0;
+		}
+		knot_rrset_deep_free(&rrset_copy, 1, 1);
 	}
 	
 	return 1;
@@ -528,7 +552,7 @@ static int test_rrset_to_wire()
 	for (int i = 0; i < TEST_RRSET_COUNT; i++) {
 		wire_size = 65535;
 		/* Convert to wire. */
-		int ret = knot_rrset_to_wire(test_rrset_array[i].rrset, wire,
+		int ret = knot_rrset_to_wire(&test_rrset_array[i].rrset, wire,
 		                             &wire_size, &rr_count);
 		if (ret) {
 			diag("Could not convert RRSet to wire.\n");
@@ -538,7 +562,7 @@ static int test_rrset_to_wire()
 		/* Check that the header is OK. */
 		ret = memcmp(wire, test_rrset_array[i].header_wire,
 		             test_rrset_array[i].header_wire_size);
-		if (cmp) {
+		if (ret) {
 			diag("Header of RRSet %d is wrongly converted.\n",
 			     i);
 			return 0;
@@ -546,9 +570,9 @@ static int test_rrset_to_wire()
 		
 		/* Check that the RDATA are OK. */
 		ret = memcmp(wire + test_rrset_array[i].header_wire_size,
-		             test_rrset_array[i].rdata,
-		             test_rrset_array[i].rdata_size);
-		if (cmp) {
+		             test_rrset_array[i].rdata_wire,
+		             test_rrset_array[i].rdata_wire_size);
+		if (ret) {
 			diag("RDATA of RRSet %d are wrongly converted.\n",
 			     i);
 			return 0;
@@ -557,7 +581,7 @@ static int test_rrset_to_wire()
 	
 	/* Check that function does not crash if given small wire. */
 	wire_size = 5; // even header does not fit
-	ret = knot_rrset_to_wire(test_rrset_array[i].rrset, wire,
+	int ret = knot_rrset_to_wire(&test_rrset_array[0].rrset, wire,
 	                         &wire_size, &rr_count);
 	if (ret != KNOT_ESPACE) {
 		diag("RRSet was converted to wire even though twe wire was"
@@ -565,7 +589,7 @@ static int test_rrset_to_wire()
 		return 0;
 	}
 	wire_size = 25; // even RDATA do not fit TODO check those values
-	ret = knot_rrset_to_wire(test_rrset_array[i].rrset, wire,
+	ret = knot_rrset_to_wire(&test_rrset_array[0].rrset, wire,
 	                         &wire_size, &rr_count);
 	if (ret != KNOT_ESPACE) {
 		diag("RRSet was converted to wire even though twe wire was"
@@ -578,13 +602,15 @@ static int test_rrset_to_wire()
 
 static int test_rrset_merge()
 {
-	knot_rrset_t *merge_to =
-		knot_rrset_deep_copy(test_rrset_array[0].rrset);
-	knot_rrset_t *merge_from =
-		knot_rrset_deep_copy(test_rrset_array[1].rrset);
+	knot_rrset_t *merge_to;
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_MERGE_UNIQUE1].rrset,
+	                     &merge_to, 1);
+	knot_rrset_t *merge_from;
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_MERGE_UNIQUE2].rrset,
+	                     &merge_from, 1);
 	assert(merge_to);
 	assert(merge_from);
-	int ret = knot_rrset_merge(&merge_to, &merge_from);
+	int ret = knot_rrset_merge((void **)&merge_to, (void **)&merge_from);
 	if (ret) {
 		diag("Could not merge RRSets.\n");
 		knot_rrset_deep_free(&merge_to, 1, 1);
@@ -594,13 +620,15 @@ static int test_rrset_merge()
 	
 	//TODO check that merge operation does not cahgne second rr
 	//TODO check that two RRSet that are not mergable will not merge
-	if (knot_rrset_compare(test_rrset_array[2].rrset, merge_from,
+	if (knot_rrset_compare(&test_rrset_array[TEST_RRSET_MERGE_UNIQUE2].rrset,
+	                       merge_from,
 	                       KNOT_RRSET_COMPARE_WHOLE)) {
 		diag("Merge corrupted second RRSet.\n");
 		return 0;
 	}
 	
-	if (merge_to->rdata_count != test_rrset_array[0].rrset->rdata_count +
+	if (merge_to->rdata_count !=
+	    test_rrset_array[TEST_RRSET_MERGE_UNIQUE1].rrset.rdata_count +
 	    merge_from->rdata_count) {
 		diag("Not all RDATA were merged.\n");
 		knot_rrset_deep_free(&merge_to, 1, 1);
@@ -610,7 +638,8 @@ static int test_rrset_merge()
 	
 	/* Check that the first RRSet now contains RDATA from the second. */
 	/* Indices first. */
-	ret = memcmp(merge_to->rdata_indices, test_rrset_array[TODOmergnuty].rrset,
+	ret = memcmp(merge_to->rdata_indices,
+	             test_rrset_array[TEST_RRSET_MERGE_RESULT1].rrset.rdata_indices,
 	             merge_to->rdata_count);
 	if (ret) {
 		diag("Merge operation corrupted the first RRSet's indices.\n");
@@ -620,8 +649,8 @@ static int test_rrset_merge()
 	}
 	
 	/* Check actual RDATA. */
-	ret = knot_rrset_compare_rdata(merge_to->rdata,
-	                               test_rrset_array[TODOmergnuty].rrset);
+	ret = knot_rrset_compare_rdata(merge_to,
+	                               &test_rrset_array[TEST_RRSET_MERGE_RESULT1].rrset);
 	if (ret) {
 		diag("Merged RDATA are wrong.\n");
 		knot_rrset_deep_free(&merge_to, 1, 1);
@@ -638,24 +667,27 @@ static int test_rrset_merge()
 static int test_rrset_merge_no_dupl()
 {
 	/* Test that merge of two identical RRSets results in no-op. */
-	knot_rrset_t *merge_to =
-		knot_rrset_deep_copy(test_rrset_array[0].rrset);
-	knot_rrset_t *merge_from =
-		knot_rrset_deep_copy(test_rrset_array[0].rrset);
-	int ret = knot_rrset_merge_no_dupl(&merge_to, &merge_from);
+	knot_rrset_t *merge_to = NULL;
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_MERGE_UNIQUE1].rrset,
+	                     &merge_to, 1);
+	knot_rrset_t *merge_from = NULL;
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_MERGE_UNIQUE1].rrset,
+	                     &merge_from, 1);
+	int ret = knot_rrset_merge_no_dupl((void **)&merge_to,
+	                                   (void **)&merge_from);
 	if (ret != KNOT_EOK) {
 		diag("Merge of identical RRSets failed.\n");
 		return 0;
 	}
 	
-	if (knot_rrset_compare(test_rrset_array[0].rrset, merge_to,
-	                       KNOT_RRSET_COMPARE_WHOLE)) {
+	if (knot_rrset_compare(&test_rrset_array[TEST_RRSET_MERGE_UNIQUE1].rrset,
+	                       merge_to, KNOT_RRSET_COMPARE_WHOLE)) {
 		diag("Merge corrupted first RRSet.\n");
 		return 0;
 	}
 	
-	if (knot_rrset_compare(test_rrset_array[0].rrset, merge_from,
-	                       KNOT_RRSET_COMPARE_WHOLE)) {
+	if (knot_rrset_compare(&test_rrset_array[TEST_RRSET_MERGE_UNIQUE1].rrset,
+	                       merge_from, KNOT_RRSET_COMPARE_WHOLE)) {
 		diag("Merge corrupted second RRSet.\n");
 		return 0;
 	}
@@ -664,24 +696,29 @@ static int test_rrset_merge_no_dupl()
 	knot_rrset_deep_free(&merge_from, 1, 1);
 	
 	/* Merge normal, non-duplicated RRSets. */
-	merge_to = knot_rrset_deep_copy(test_rrset_array[0].rrset);
-	merge_from = knot_rrset_deep_copy(test_rrset_array[1].rrset);
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_MERGE_UNIQUE1].rrset,
+	                     &merge_to, 1);
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_MERGE_UNIQUE2].rrset,
+	                     &merge_from, 1);
 	assert(merge_to);
 	assert(merge_from);
 	
-	ret = knot_rrset_merge_no_dupl(&merge_to, &merge_from);
+	ret = knot_rrset_merge_no_dupl((void **)&merge_to,
+	                               (void **)&merge_from);
 	if (ret != KNOT_EOK) {
 		diag("Merge of identical RRSets failed.\n");
 		return 0;
 	}
 	
-	if (knot_rrset_compare(test_rrset_array[2].rrset, merge_from,
+	if (knot_rrset_compare(&test_rrset_array[TEST_RRSET_MERGE_UNIQUE2].rrset,
+	                       merge_from,
 	                       KNOT_RRSET_COMPARE_WHOLE)) {
 		diag("Merge corrupted second RRSet.\n");
 		return 0;
 	}
 	
-	if (knot_rrset_compare(test_rrset_array[2].rrset, merge_to,
+	if (knot_rrset_compare(&test_rrset_array[TEST_RRSET_MERGE_RESULT1].rrset,
+	                       merge_to,
 	                       KNOT_RRSET_COMPARE_WHOLE)) {
 		diag("Merge did not create correct RDATA.\n");
 		return 0;
@@ -691,24 +728,28 @@ static int test_rrset_merge_no_dupl()
 	knot_rrset_deep_free(&merge_from, 1, 1);
 	
 	/* Merge RRSets with both duplicated and unique RDATAs. */
-	merge_to = knot_rrset_deep_copy(test_rrset_array[3].rrset);
-	merge_from = knot_rrset_deep_copy(test_rrset_array[4].rrset);
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_MERGE_UNIQUE1].rrset,
+	                     &merge_to, 1);
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_MERGE_RESULT1].rrset,
+	                     &merge_from, 1);
 	assert(merge_to);
 	assert(merge_from);
 	
-	ret = knot_rrset_merge_no_dupl(&merge_to, &merge_from);
+	ret = knot_rrset_merge_no_dupl((void **)&merge_to, (void **)&merge_from);
 	if (ret != KNOT_EOK) {
 		diag("Merge of identical RRSets failed.\n");
 		return 0;
 	}
 	
-	if (knot_rrset_compare(test_rrset_array[2].rrset, merge_from,
+	if (knot_rrset_compare(&test_rrset_array[TEST_RRSET_MERGE_RESULT1].rrset,
+	                       merge_from,
 	                       KNOT_RRSET_COMPARE_WHOLE)) {
 		diag("Merge corrupted second RRSet.\n");
 		return 0;
 	}
 	
-	if (knot_rrset_compare(test_rrset_array[2].rrset, merge_to,
+	if (knot_rrset_compare(&test_rrset_array[TEST_RRSET_MERGE_RESULT1].rrset,
+	                       merge_to,
 	                       KNOT_RRSET_COMPARE_WHOLE)) {
 		diag("Merge did not create correct RDATA.\n");
 		return 0;
@@ -716,147 +757,131 @@ static int test_rrset_merge_no_dupl()
 	
 	knot_rrset_deep_free(&merge_to, 1, 1);
 	knot_rrset_deep_free(&merge_from, 1, 1);
+	
+	return 1;
 }
 
 static int test_rrset_compare_rdata()
 {
 	/* Comparing different RDATA types should result in EINVAL. */
-	knot_rrset_t *rrset1 = test_rrset_array[4234].rrset;
-	knot_rrset_t *rrset2 = test_rrset_array[4223].rrset;
+	knot_rrset_t *rrset1 = &test_rrset_array[TEST_RRSET_A_LESS].rrset;
+	knot_rrset_t *rrset2 = &test_rrset_array[TEST_RRSET_NS_GT].rrset;
 	
 	if (knot_rrset_compare_rdata(rrset1, rrset2) != KNOT_EINVAL) {
 		diag("rrset_compare_rdata() did comparison when it "
 		     "shouldn't have.\n");
-		knot_rrset_deep_free(rrset2, 1, 1);
 		return 0;
 	}
 	
 	/* Equal - raw data only. */
-	rrset1 = test_rrset_array[2].rrset;
-	rrset2 = knot_rrset_deep_copy(test_rrset_array[2].rrset);
+	rrset1 = &test_rrset_array[TEST_RRSET_A_LESS].rrset;
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_A_LESS].rrset,
+	                     &rrset2, 1);
 	
 	if (knot_rrset_compare_rdata(rrset1, rrset2) != 0) {
 		diag("rrset_compare_rdata() returned wrong"
 		     "value, should be 0. (raw data)\n");
-		knot_rrset_deep_free(rrset2, 1, 1);
 		return 0;
 	}
 	
-	knot_rrset_deep_free(rrset1, 1, 1);
-	knot_rrset_deep_free(rrset2, 1, 1);
+	knot_rrset_deep_free(&rrset2, 1, 1);
 	
 	/* Equal - DNAME only. */
-	rrset1 = test_rrset_array[3].rrset;
-	rrset2 = knot_rrset_deep_copy(test_rrset_array[3].rrset);
+	rrset1 = &test_rrset_array[TEST_RRSET_NS_LESS].rrset;
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_NS_LESS].rrset,
+	                     &rrset2, 1);
 	
 	if (knot_rrset_compare_rdata(rrset1, rrset2) != 0) {
 		diag("rrset_compare_rdata() returned wrong"
 		     "value, should be 0. (DNAME only)\n");
-		knot_rrset_deep_free(rrset2, 1, 1);
+		knot_rrset_deep_free(&rrset2, 1, 1);
 		return 0;
 	}
 	
-	knot_rrset_deep_free(rrset1, 1, 1);
-	knot_rrset_deep_free(rrset2, 1, 1);
+	knot_rrset_deep_free(&rrset2, 1, 1);
 	
 	/* Equal - combination. */
-	rrset1 = test_rrset_array[4].rrset;
-	rrset2 = knot_rrset_deep_copy(test_rrset_array[4].rrset);
+	rrset1 = &test_rrset_array[TEST_RRSET_MX_BIN_LESS].rrset;
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_MX_BIN_LESS].rrset,
+	                     &rrset2, 1);
 	
 	if (knot_rrset_compare_rdata(rrset1, rrset2) != 0) {
 		diag("rrset_compare_rdata() returned wrong"
 		     "value, should be 0. (combination)\n");
-		knot_rrset_deep_free(rrset2, 1, 1);
+		knot_rrset_deep_free(&rrset2, 1, 1);
 		return 0;
 	}
 	
-	knot_rrset_deep_free(rrset1, 1, 1);
-	knot_rrset_deep_free(rrset2, 1, 1);
+	knot_rrset_deep_free(&rrset2, 1, 1);
 	
 	/* Smaller - raw data only. */
-	rrset1 = test_rrset_array[42342].rrset;
-	rrset2 = test_rrset_array[23442].rrset;
+	rrset1 = &test_rrset_array[TEST_RRSET_A_LESS].rrset;
+	rrset2 = &test_rrset_array[TEST_RRSET_A_GT].rrset;
 	
 	if (knot_rrset_compare_rdata(rrset1, rrset2) >= 0) {
 		diag("rrset_compare_rdata() returned wrong"
 		     "value, should be -1. (raw data only)\n");
-		knot_rrset_deep_free(rrset2, 1, 1);
 		return 0;
 	}
 	
-	knot_rrset_deep_free(rrset1, 1, 1);
-	knot_rrset_deep_free(rrset2, 1, 1);
+	/* Greater - raw data only. */
+	if (knot_rrset_compare_rdata(rrset2, rrset1) <= 0) {
+		diag("rrset_compare_rdata() returned wrong"
+		     "value, should be 1. (raw data only)\n");
+		return 0;
+	}
 	
 	/* Smaller - DNAME only. */
-	rrset1 = test_rrset_array[42342].rrset;
-	rrset2 = test_rrset_array[23442].rrset;
+	rrset1 = &test_rrset_array[TEST_RRSET_NS_LESS].rrset;
+	rrset2 = &test_rrset_array[TEST_RRSET_NS_GT].rrset;
 	
 	if (knot_rrset_compare_rdata(rrset1, rrset2) >= 0) {
 		diag("rrset_compare_rdata() returned wrong"
 		     "value, should be -1. (DNAME only)\n");
-		knot_rrset_deep_free(rrset2, 1, 1);
 		return 0;
 	}
 	
-	knot_rrset_deep_free(rrset1, 1, 1);
-	knot_rrset_deep_free(rrset2, 1, 1);
+	/* Greater - DNAME only. */
+	if (knot_rrset_compare_rdata(rrset2, rrset1) <= 0) {
+		diag("rrset_compare_rdata() returned wrong"
+		     "value, should be 1. (DNAME only)\n");
+		return 0;
+	}
 	
-	/* Smaller - combination. */
-	rrset1 = test_rrset_array[42342].rrset;
-	rrset2 = test_rrset_array[23442].rrset;
+	/* Smaller - combination, difference in binary part. */
+	rrset1 = &test_rrset_array[TEST_RRSET_MX_BIN_LESS].rrset;
+	rrset2 = &test_rrset_array[TEST_RRSET_MX_BIN_GT].rrset;
 	
 	if (knot_rrset_compare_rdata(rrset1, rrset2) >= 0) {
 		diag("rrset_compare_rdata() returned wrong"
 		     "value, should be -1. (combination)\n");
-		knot_rrset_deep_free(rrset2, 1, 1);
 		return 0;
 	}
 	
-	knot_rrset_deep_free(rrset1, 1, 1);
-	knot_rrset_deep_free(rrset2, 1, 1);
-	
-	/* Greater - raw data only. */
-	rrset1 = test_rrset_array[42342].rrset;
-	rrset2 = test_rrset_array[23442].rrset;
-	
-	if (knot_rrset_compare_rdata(rrset1, rrset2) <= 0) {
+	/* Greater - combination, difference in binary part. */
+	if (knot_rrset_compare_rdata(rrset2, rrset1) <= 0) {
 		diag("rrset_compare_rdata() returned wrong"
-		     "value, should be -1. (raw data only)\n");
-		knot_rrset_deep_free(rrset2, 1, 1);
+		     "value, should be 1. (combination)\n");
 		return 0;
 	}
 	
-	knot_rrset_deep_free(rrset1, 1, 1);
-	knot_rrset_deep_free(rrset2, 1, 1);
-	
-	/* Greater - DNAME only. */
-	rrset1 = test_rrset_array[42342].rrset;
-	rrset2 = test_rrset_array[23442].rrset;
+	/* Smaller - combination, difference in DNAME part. */
+	rrset1 = &test_rrset_array[TEST_RRSET_MX_DNAME_LESS].rrset;
+	rrset2 = &test_rrset_array[TEST_RRSET_MX_DNAME_GT].rrset;
 	
-	if (knot_rrset_compare_rdata(rrset1, rrset2) <= 0) {
+	if (knot_rrset_compare_rdata(rrset1, rrset2) >= 0) {
 		diag("rrset_compare_rdata() returned wrong"
-		     "value, should be -1. (DNAME only)\n");
-		knot_rrset_deep_free(rrset2, 1, 1);
+		     "value, should be -1. (combination)\n");
 		return 0;
 	}
 	
-	knot_rrset_deep_free(rrset1, 1, 1);
-	knot_rrset_deep_free(rrset2, 1, 1);
-	
-	/* Greater - combination. */
-	rrset1 = test_rrset_array[42342].rrset;
-	rrset2 = test_rrset_array[23442].rrset;
-	
-	if (knot_rrset_compare_rdata(rrset1, rrset2) <= 0) {
+	/* Greater - combination, difference in DNAME part. */
+	if (knot_rrset_compare_rdata(rrset2, rrset1) <= 0) {
 		diag("rrset_compare_rdata() returned wrong"
-		     "value, should be -1. (combination)\n");
-		knot_rrset_deep_free(rrset2, 1, 1);
+		     "value, should be 1. (combination)\n");
 		return 0;
 	}
 	
-	knot_rrset_deep_free(rrset1, 1, 1);
-	knot_rrset_deep_free(rrset2, 1, 1);
-	
 	return 1;
 }
 
@@ -868,8 +893,10 @@ static int test_rrset_compare()
 	 */
 	
 	/* Equal. */
-	knot_rrset_t *rrset1 = test_rrset_array[0].rrset;
-	knot_rrset_t *rrset2 = knot_rrset_deep_copy(test_rrset_array[0].rrset);
+	knot_rrset_t *rrset1 = &test_rrset_array[TEST_RRSET_A_LESS].rrset;
+	knot_rrset_t *rrset2;
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_A_LESS].rrset,
+	                     &rrset2, 1);
 	
 	if (knot_rrset_compare(rrset1, rrset2,
 	                       KNOT_RRSET_COMPARE_HEADER) != 0) {
@@ -881,19 +908,18 @@ static int test_rrset_compare()
 	knot_rrset_deep_free(&rrset2, 1, 1);
 	
 	/* Less. */
-	rrset1 = test_rrset_array[1].rrset;
-	rrset2 = test_rrset_array[0].rrset;
+	rrset1 = &test_rrset_array[TEST_RRSET_A_LESS].rrset;
+	rrset2 = &test_rrset_array[TEST_RRSET_NS_LESS].rrset;
 	
 	if (knot_rrset_compare(rrset1, rrset2,
 	                       KNOT_RRSET_COMPARE_HEADER) >= 0) {
 		diag("Wrong RRSet comparison, should be 0.\n");
-		knot_rrset_deep_free(&rrset2, 1, 1);
 		return 0;
 	}
 	
 	/* Greater. */
-	rrset1 = test_rrset_array[0].rrset;
-	rrset2 = test_rrset_array[1].rrset;
+	rrset1 = &test_rrset_array[TEST_RRSET_NS_LESS].rrset;
+	rrset2 = &test_rrset_array[TEST_RRSET_A_LESS].rrset;
 	
 	if (knot_rrset_compare(rrset1, rrset2,
 	                       KNOT_RRSET_COMPARE_HEADER) <= 0) {
@@ -901,28 +927,30 @@ static int test_rrset_compare()
 		knot_rrset_deep_free(&rrset2, 1, 1);
 		return 0;
 	}
+	
+	return 1;
 }
 
-static int test_rrset_rdata_get_next_dname()
+static int test_rrset_get_next_dname()
 {
 	/* There are few suitable RR types for this test - we'll use MINFO. */
-	knot_rrset_t *rrset = test_rrset_array[TEST_RRSET_MINFO].rrset;
+	knot_rrset_t *rrset = &test_rrset_array[TEST_RRSET_MINFO].rrset;
 	knot_dname_t *dname1 = NULL;
 	knot_dname_t *dname2 = NULL;
 	
 	knot_dname_t *dname = NULL;
-	dname = knot_rrset_rdata_get_next_dname(rrset, dname, 0);
+	dname = knot_rrset_get_next_dname(rrset, dname);
 	if (dname != dname1) {
 		diag("Failed to extract correct first DNAME from RRSet.\n");
 		return 0;
 	}
-	dname = knot_rrset_rdata_get_next_dname(rrset, dname, 0);
+	dname = knot_rrset_get_next_dname(rrset, dname);
 	if (dname != dname2) {
 		diag("Failed to extract correct second DNAME from RRSet.\n");
 		return 0;
 	}
 	
-	dname = knot_rrset_rdata_get_next_dname(rrset, dname, 0);
+	dname = knot_rrset_get_next_dname(rrset, dname);
 	if (dname != NULL) {
 		diag("Failed to return NULL after all DNAMEs "
 		     "have been extracted.\n");
@@ -931,7 +959,7 @@ static int test_rrset_rdata_get_next_dname()
 	
 	/* Test that RRSet with no DNAMEs in it returns NULL. */
 	dname = NULL;
-	dname = knot_rrset_rdata_get_next_dname(rrset, dname, 0);
+	dname = knot_rrset_get_next_dname(rrset, dname);
 	if (dname != NULL) {
 		diag("rrset_rdata_get_next_dname() found DNAME in RRSet with "
 		     "no DNAMEs.\n");
@@ -941,10 +969,10 @@ static int test_rrset_rdata_get_next_dname()
 	return 1;
 }
 
-static int test_rrset_next_dname()
+static int test_rrset_next_dname_pointer()
 {
 	/* Same test as in above, but we'll use multiple RRs within one SET. */
-	knot_rrset_t *rrset = test_rrset_array[TEST_RRSET_MINFO_MULTIPLE].rrset;
+	knot_rrset_t *rrset = &test_rrset_array[TEST_RRSET_MINFO_MULTIPLE].rrset;
 	knot_dname_t *extracted_dnames[4];
 	extracted_dnames[0] = test_dnames[0];
 	extracted_dnames[1] = test_dnames[1];
@@ -961,20 +989,21 @@ static int test_rrset_next_dname()
 	}
 	
 	/* Try writes into DNAMEs you've gotten. */
-	rrset = knot_rrset_deep_copy(test_rrset_array[MINFO_MULTIPLE_INDEX].rrset);
+	knot_rrset_deep_copy(&test_rrset_array[TEST_RRSET_MINFO_MULTIPLE].rrset,
+	                     &rrset, 1);
 	dname = NULL;
 	i = 4;
 	while ((dname = knot_rrset_get_next_dname_pointer(rrset, dname))) {
 		knot_dname_free(dname);
-		*dname == extracted_dnames[i];
+		memcpy(dname, &test_dnames[i], sizeof(knot_dname_t *));
 		i++;
 	}
 	
 	knot_dname_t *dname_read = NULL;
 	i = 4;
-	while ((dname_read = knot_rrset_get_next_dname_pointer(rrset,
-	                                                       dname_read))) {
-		if (dname_read != extracted_dnames[i]) {
+	while ((dname_read = knot_rrset_get_next_dname(rrset,
+	                                               dname_read))) {
+		if (dname_read != test_dnames[i]) {
 			diag("Rewriting of DNAMEs in RDATA was "
 			     "not successful.\n");
 			knot_rrset_deep_free(&rrset, 1, 1);
@@ -1008,9 +1037,57 @@ static int knot_rrset_tests_run(int argc, char *argv[])
 	create_test_rdata();
 	create_test_rrsets();
 	
-	res = test_rrset_create();
+	res = test_rrset_new();
 	ok(res, "rrset: create");
 	res_final *= res;
+	
+	res = test_rrset_create_rdata();
+	ok(res, "rrset: create_rdata");
+	res_final *= res;
+	
+	res = test_rrset_get_rdata();
+	ok(res, "rrset: get rdata");
+	res_final *= res;
 
+	res = test_rrset_shallow_copy();
+	ok(res, "rrset: shallow copy");
+	res_final *= res;
+	
+	res = test_rrset_deep_copy();
+	ok(res, "rrset: deep copy");
+	res_final *= res;
+	
+	res = test_rrset_to_wire();
+	ok(res, "rrset: to wire");
+	res_final *= res;
+	
+	res = test_rrset_rdata_item_size();
+	ok(res, "rrset: rdata_item_size");
+	res_final *= res;
+	
+	res = test_rrset_merge();
+	ok(res, "rrset: merge");
+	res_final *= res;
+	
+	res = test_rrset_merge_no_dupl();
+	ok(res, "rrset: merge no dupl");
+	res_final *= res;
+	
+	res = test_rrset_compare_rdata();
+	ok(res, "rrset: rdata_item_size");
+	res_final *= res;
+	
+	res = test_rrset_compare();
+	ok(res, "rrset: rdata_item_size");
+	res_final *= res;
+	
+	res = test_rrset_get_next_dname();
+	ok(res, "rrset: next dname");
+	res_final *= res;
+	
+	res = test_rrset_next_dname_pointer();
+	ok(res, "rrset: next dname pointer");
+	res_final *= res;
+	
 	return res_final;
 }
-- 
GitLab