diff --git a/src/libknot/rrset.c b/src/libknot/rrset.c index 2aba0770798fc9bea03a4be94be10952842e99ea..887e420df4237ea898de9cb9d812b03f1c415e6d 100644 --- a/src/libknot/rrset.c +++ b/src/libknot/rrset.c @@ -200,7 +200,7 @@ uint8_t* knot_rrset_create_rdata(knot_rrset_t *rrset, uint16_t size) /* Realloc indices. We will allocate exact size to save space. */ /* TODO this sucks big time - allocation of length 1. */ - /* But another variable holding allocated count is not a question. What now?*/ + /* But another variable holding allocated count is out of question. What now?*/ rrset->rdata_indices = xrealloc(rrset->rdata_indices, (rrset->rdata_count + 1) * sizeof(uint32_t)); diff --git a/src/tests/libknot/libknot/rrset_tests.c b/src/tests/libknot/libknot/rrset_tests.c index 41284df48299c301e716a079372804eaf415f1b1..4cd4bb30d1698fc78319936c8da27da00e689167 100644 --- a/src/tests/libknot/libknot/rrset_tests.c +++ b/src/tests/libknot/libknot/rrset_tests.c @@ -17,14 +17,8 @@ #include <assert.h> #include "tests/libknot/libknot/rrset_tests.h" -#include "libknot/common.h" -#include "libknot/util/descriptor.h" +#include "common/descriptor_new.h" #include "libknot/rrset.h" -#include "libknot/dname.h" -#include "libknot/rdata.h" -#include "libknot/util/utils.h" -#include "libknot/zone/node.h" -#include "libknot/util/debug.h" static int knot_rrset_tests_count(int argc, char *argv[]); static int knot_rrset_tests_run(int argc, char *argv[]); @@ -87,19 +81,6 @@ static knot_dname_t RR_DNAMES[RR_DNAMES_COUNT] = /* 192.168.1.1 */ static uint8_t address[4] = {0xc0, 0xa8, 0x01, 0x01}; -static knot_rdata_item_t RR_ITEMS[RR_ITEMS_COUNT] = - { {.dname = &RR_DNAMES[1]}, - {.dname = &RR_DNAMES[2]}, - {.raw_data = (uint16_t *)address} }; - -/*! \warning Do not change the order. */ -/* TODO this does not work as expected */ -static knot_rdata_t RR_RDATA[RR_RDATA_COUNT] = - { {&RR_ITEMS[0], 1, &RR_RDATA[0]}, /* first ns */ - {&RR_ITEMS[1], 1, &RR_RDATA[1]}, /* second ns */ - {&RR_ITEMS[0], 1, &RR_RDATA[3]}, /* both in cyclic list */ - {&RR_ITEMS[1], 1, &RR_RDATA[2]} }; - /*! \warning Do not change the order in those, if you want to test some other * feature with new dname, add it at the end of these arrays. */ @@ -123,695 +104,168 @@ static const struct test_domain "\x0\x4", 2} }; -static struct test_rrset test_rrsets[TEST_RRSETS] = { - { "example.com.", KNOT_RRTYPE_NS, KNOT_CLASS_IN, - 3600, NULL, NULL }, - { "example2.com.", KNOT_RRTYPE_NS, KNOT_CLASS_IN, - 3600, NULL, NULL }, - { "example3.com.", KNOT_RRTYPE_NS, KNOT_CLASS_IN, - 3600, NULL, NULL }, - { "example.com.", KNOT_RRTYPE_NS, KNOT_CLASS_IN, - 3600, NULL, NULL }, - { "example.com.", KNOT_RRTYPE_NS, KNOT_CLASS_IN, - 3600, NULL, NULL }, - { "example.com.", KNOT_RRTYPE_NS, KNOT_CLASS_IN, - 3600, NULL, NULL } -}; - -static const struct test_rrset test_rrsigs[TEST_RRSIGS] = { - { "example.com.", 46, 1, 3600, NULL }, - { "example2.com.", 46, 1, 3600, NULL }, - { "example3.com.", 46, 1, 3600, NULL }, - { "example4.com.", 46, 1, 3600, NULL }, - { "example5.com.", 46, 1, 3600, NULL }, - { "example6.com.", 46, 1, 3600, NULL } -}; - -static void generate_rdata(uint8_t *data, int size) -{ - for (int i = 0; i < size; ++i) { - data[i] = rand() % 256; - } -} - -static int fill_rdata_r(uint8_t *data, int max_size, uint16_t rrtype, - knot_rdata_t *rdata) -{ - assert(rdata != NULL); - assert(data != NULL); - assert(max_size > 0); - - uint8_t *pos = data; - int used = 0; - int wire_size = 0; - -// note("Filling RRType %u", rrtype); - - knot_rrtype_descriptor_t *desc = - knot_rrtype_descriptor_by_type(rrtype); - - uint item_count = desc->length; - knot_rdata_item_t *items = - (knot_rdata_item_t *)malloc(item_count - * sizeof(knot_rdata_item_t)); - - for (int i = 0; i < item_count; ++i) { - uint size = 0; - int domain = 0; - knot_dname_t *dname = NULL; - int binary = 0; - int stored_size = 0; - - switch (desc->wireformat[i]) { - case KNOT_RDATA_WF_COMPRESSED_DNAME: - case KNOT_RDATA_WF_UNCOMPRESSED_DNAME: - case KNOT_RDATA_WF_LITERAL_DNAME: - dname = knot_dname_new_from_wire( - (uint8_t *)test_domains_ok[0].wire, - test_domains_ok[0].size, NULL); - assert(dname != NULL); -// note("Created domain name: %s", -// knot_dname_name(dname)); -// note("Domain name ptr: %p", dname); - domain = 1; - size = knot_dname_size(dname); -// note("Size of created domain name: %u", size); - assert(size < KNOT_MAX_RDATA_ITEM_SIZE); - // store size of the domain name - *(pos++) = size; - // copy the domain name - memcpy(pos, knot_dname_name(dname), size); - pos += size; - break; - default: - binary = 1; - size = rand() % KNOT_MAX_RDATA_ITEM_SIZE; - } - - if (binary) { - // Rewrite the actual 2 bytes in the data array - // with length. - // (this is a bit ugly, but does the work ;-) - knot_wire_write_u16(pos, size); - //*pos = size; - } - - //note("Filling %u bytes", size); - used += size; - assert(used < max_size); - - if (domain) { - items[i].dname = dname; - wire_size += knot_dname_size(dname); -/* note("Saved domain name ptr on index %d: %p", - i, items[i].dname); */ - } else { - free(dname); -// note("Saved raw data ptr on index %d: %p",i, pos); - items[i].raw_data = (uint16_t *)pos; - pos += size; - wire_size += size; - if (binary && !stored_size) { - wire_size -= 2; - } - } - } - - int res = knot_rdata_set_items(rdata, items, item_count); - if (res != 0) { - diag("knot_rdata_set_items() returned %d.", res); - free(items); - return -1; - } else { - free(items); - return wire_size; - } -} - -/* fills test_rrsets with random rdata when empty */ -static void create_rdata() -{ - knot_rdata_t *r; - - uint8_t *data = - malloc(sizeof(uint8_t) * KNOT_MAX_RDATA_WIRE_SIZE); - - assert(data); - - for (int i = 0; i < TEST_RRSETS; i++) { - if (test_rrsets[i].rdata == NULL) { - r = knot_rdata_new(); - - /* from rdata tests */ - generate_rdata(data, KNOT_MAX_RDATA_WIRE_SIZE); - if (fill_rdata_r(data, KNOT_MAX_RDATA_WIRE_SIZE, - test_rrsets[i].type, r) <= 0) { - diag("Error creating rdata!"); - - } - - test_rrsets[i].rdata = r; - } - } - free(data); -} -static int check_rrset(const knot_rrset_t *rrset, int i, - int check_rdata, int check_items, - int check_rrsigs) +static int check_rrset_values(const knot_rrset_t *rrset, + knot_dname_t *dname, uint16_t type, + uint16_t rclass, uint16_t ttl) { - /* following implementation should be self-explanatory */ int errors = 0; - - if (rrset == NULL) { - diag("RRSet not created!"); - return 1; - } - - char *owner = knot_dname_to_str(rrset->owner); - if (strcmp(owner, test_rrsets[i].owner) != 0) { - diag("OWNER domain name wrong: '%s' (should be '%s')", - owner, test_rrsets[i].owner); + + if (rrset->dname != dname) { + diag("Wrong DNAME in the created RRSet.\n"); ++errors; } - free(owner); - - if (rrset->type != test_rrsets[i].type) { - diag("TYPE wrong: %u (should be: %u)", rrset->type, - test_rrsets[i].type); + + if (rrset->type != type) { + diag("Wrong type in the created RRSet.\n"); ++errors; } - - if (rrset->rclass != test_rrsets[i].rclass) { - diag("CLASS wrong: %u (should be: %u)", rrset->rclass, - test_rrsets[i].rclass); + + if (rrset->rclass != rclass) { + diag("Wrong class in the created RRSet.\n"); ++errors; } - - if (rrset->ttl != test_rrsets[i].ttl) { - diag("TTL wrong: %u (should be: %u)", rrset->ttl, - test_rrsets[i].ttl); + + if (rrset->ttl != ttl) { + diag("Wrong TTL in the created RRSet.\n"); ++errors; } - - if (check_rdata) { - /* TODO use rdata_compare */ - knot_rdata_t *rdata = rrset->rdata; - - if (rdata == NULL) { - diag("There are no RDATAs in the RRSet"); - ++errors; - } - - if (rdata != NULL) { - while (rdata->next != NULL && - rdata->next != rrset->rdata) { - rdata = rdata->next; - } - if (rdata->next == NULL) { - diag("The list of RDATAs is not cyclic!"); - ++errors; - } else { - assert(rdata->next == rrset->rdata); - } - } - } - - if (check_items) { - knot_rrtype_descriptor_t *desc = - knot_rrtype_descriptor_by_type(rrset->type); - if (knot_rdata_compare(rrset->rdata, - test_rrsets[i].rdata, - desc->wireformat) != 0) { - diag("Rdata items do not match."); - errors++; - } - } - - /* TODO this deserves a major improvement!!! */ - - /* - * Will work only with null terminated strings, - * consider changing to more versatile implementation - */ - - /* How about, once it's tested, using rdata_compare */ - - if (check_rrsigs) { - - const knot_rrset_t *rrsigs; - - rrsigs = knot_rrset_rrsigs(rrset); - if (strcmp((const char *)rrsigs->rdata->items[0].raw_data, - signature_strings[i])) { - diag("Signatures are not equal" - "to those set when creating." - "Comparing %s with %s", - rrsigs->rdata->items[0].raw_data, - signature_strings[i]); - errors++; - } - } + return errors; } -static int test_rrset_create() +static int test_rrset_new() { - int errors = 0; + /* Actual values don't matter in this case. */ + knot_dname_t *dname = (knot_dname_t *)0x1; + uint16_t type = 1; + uint16_t rclass = 1; + uint32_t ttl = 1; - for (int i = 0; i < TEST_RRSETS; ++i) { - knot_dname_t *owner = knot_dname_new_from_str( - test_rrsets[i].owner, - strlen(test_rrsets[i].owner), - NODE_ADDRESS); - if (owner == NULL) { - diag("Error creating owner domain name!"); - return 0; - } - knot_rrset_t *rrset = knot_rrset_new(owner, - test_rrsets[i].type, - test_rrsets[i].rclass, - test_rrsets[i].ttl); - - errors += check_rrset(rrset, i, 0, 0, 0); - - knot_rrset_free(&rrset); - knot_dname_free(&owner); + knot_rrset_t *rrset = knot_rrset_new(dname, type, rclass, ttl); + if (rrset == NULL) { + diag("Failed to create new RRSet.\n"); + return 0; } + + int check_errors = check_rrset_values(rrset, dname, type, rclass, ttl); + free(rrset); - //diag("Total errors: %d", errors); - - return (errors == 0); -} + diag("Total errors: %d", check_errors); -/* Not implemented - no way how to test unfreed memory from here (yet) */ -static int test_rrset_delete() -{ - return 0; + return (check_errors == 0); } -static int test_rrset_add_rdata() +static int test_rrset_create_rdata() { - /* rdata add */ - int errors = 0; - for (int i = 0; i < TEST_RRSETS; i++) { - knot_dname_t *owner = knot_dname_new_from_str( - test_rrsets[i].owner, - strlen(test_rrsets[i].owner), - NODE_ADDRESS); - if (owner == NULL) { - diag("Error creating owner domain name!"); - return 0; - } - - knot_rrset_t *rrset = knot_rrset_new(owner, - test_rrsets[i].type, - test_rrsets[i].rclass, - test_rrsets[i].ttl); - - knot_rrset_add_rdata(rrset, test_rrsets[i].rdata); - - errors += check_rrset(rrset, i, 1, 0, 0); - - knot_rrset_free(&rrset); - knot_dname_free(&owner); - } - - /* test whether adding works properly = keeps order of added elements */ - - /* - * Beware, this is dependent on the internal structure of rrset and - * may change. - */ - + /* Two cases need to be tested - empty RRSet and non-empty RRSet. */ + knot_rrset_t *rrset = knot_rrset_new(NULL, 0, 0, 0); - - knot_rdata_t *r; - - knot_rdata_item_t *item; - - static const char *test_strings[10] = - { "-2", "9", "2", "10", "1", "5", "8", "4", "6", "7" }; - - /* add items */ - - for (int i = 0; i < 10; i++) { - r = knot_rdata_new(); - item = malloc(sizeof(knot_rdata_item_t)); - item->raw_data = (uint16_t *)test_strings[i]; - //following statement creates a copy - knot_rdata_set_items(r, item, 1); - knot_rrset_add_rdata(rrset, r); - free(item); - } - - knot_rdata_t *tmp = rrset->rdata; - - /* check if order has been kept */ - - int i = 0; - while (tmp->next != rrset->rdata && !errors) { - if (strcmp(test_strings[i], (char *)tmp->items[0].raw_data)) { - diag("Adding RDATA error!, is %s should be %s", - tmp->items[0].raw_data, test_strings[i]); - errors++; - } - i++; - tmp = tmp->next; - - } - - tmp = rrset->rdata; - - knot_rdata_t *next; - - while (tmp->next != rrset->rdata) { - next = tmp->next; - knot_rdata_free(&tmp); - tmp = next; + assert(rrset); + + /* + * Again, actual data are not crutial, we need to see if indices + * are changed accordingly and so on, but the data are not important. + */ + uint16_t data1_length = 16; + uint8_t data1[data1_length]; + memset(data1, 1, data1_length); + + uint8_t *write_pointer = knot_rrset_create_rdata(rrset, data1_length); + if (write_pointer == NULL) { + diag("Could not create data of size %d\n", data1_length); + return 0; } - - knot_rdata_free(&tmp); - - knot_rrset_free(&rrset); - - return (errors == 0); -} - -static int test_rrset_rrsigs() -{ - int errors = 0; - - knot_rdata_item_t *item; - - knot_rdata_t *tmp; - - knot_dname_t *owner; - - knot_rrset_t *rrset; - - /* Gets rrsigs and checks, if signatures are the same */ - - for (int i = 0; i < TEST_RRSETS; i++) { - owner = knot_dname_new_from_str(test_rrsets[i].owner, - strlen(test_rrsets[i].owner), NODE_ADDRESS); - if (owner == NULL) { - diag("Error creating owner domain name!"); - return 0; - } - - rrset = knot_rrset_new(owner, test_rrsets[i].type, - test_rrsets[i].rclass, test_rrsets[i].ttl); - - knot_rrset_add_rdata(rrset, test_rrsets[i].rdata); - - //owners are the same - - assert(TEST_RRSETS == TEST_RRSIGS); - - knot_rrset_t *rrsig = knot_rrset_new(owner, - test_rrsigs[i].type, - test_rrsigs[i].rclass, - test_rrsigs[i].ttl); - - tmp = knot_rdata_new(); - item = malloc(sizeof(knot_rdata_item_t)); - /* signature is just a string, - * should be sufficient for testing */ - item->raw_data = (uint16_t *)signature_strings[i]; - knot_rdata_set_items(tmp, item, 1); - knot_rrset_add_rdata(rrsig, tmp); - - if (knot_rrset_set_rrsigs(rrset, rrsig) - != 0) { - diag("Could not set rrsig"); - errors++; - } - errors += check_rrset(rrset, i, 0, 0, 1); - knot_rrset_free(&rrset); - free(item); - knot_rdata_free(&tmp); - knot_rrset_free(&rrsig); + + /* Write dummy data. */ + memcpy(write_pointer, data1, data1_length); + + /* Check that indices are set right. */ + if (rrset->rdata_indices[0] != data1_length) { + diag("Wrong RDATA index after inserting RDATA to RRSet.\n"); + return 0; } - return (errors == 0); -} - -static int test_rrset_merge() -{ - knot_rrset_t *merger1; - knot_rrset_t *merger2; - knot_dname_t *owner1; - knot_dname_t *owner2; - - int r; - - owner1 = knot_dname_new_from_str(test_rrsets[3].owner, - strlen(test_rrsets[3].owner), NULL); - merger1 = knot_rrset_new(owner1, test_rrsets[3].type, - test_rrsets[3].rclass, - test_rrsets[3].ttl); - - knot_rrset_add_rdata(merger1, test_rrsets[3].rdata); - - owner2 = knot_dname_new_from_str(test_rrsets[4].owner, - strlen(test_rrsets[4].owner), NULL); - merger2 = knot_rrset_new(owner2, test_rrsets[4].type, - test_rrsets[4].rclass, - test_rrsets[4].ttl); - - knot_rrset_add_rdata(merger2, test_rrsets[4].rdata); - -// knot_rrset_dump(merger1, 1); - - int ret = 0; - if ((ret = knot_rrset_merge((void **)&merger1, - (void **)&merger2)) != 0) { - diag("Could not merge rrsets. (reason %d)", ret); + + /* Rdata count must be equal to one. */ + if (rrset->rdata_count != 1) { + diag("Wrong RDATA count after inserting RDATA to RRSet.\n"); return 0; } - -// knot_rrset_dump(merger1, 1); - - r = check_rrset(merger1, 5, 1, 1, 0); - - knot_rrset_free(&merger1); - knot_rrset_free(&merger2); - - if (r) { - diag("Merged rdata are wrongly set."); + + /* Make sure that the data in the RRSet are the same. */ + int ret = memcmp(rrset->rdata, data1, data1_length); + if (ret) { + diag("Wrong data inserted into RRSet.\n"); return 0; } - - return 1; -} - -static int test_rrset_owner(knot_rrset_t **rrsets) -{ - int errors = 0; - for (int i = 0; i < TEST_RRSETS; i++) { - char *dname_str = - knot_dname_to_str(knot_rrset_owner(rrsets[i])); - if (strcmp(dname_str, test_rrsets[i].owner)) { - diag("Got wrong value for owner from rrset."); - errors++; - } - free(dname_str); + + /* Insert second item - all other inserts will do the same thing. */ + uint16_t data2_length = 33; + uint8_t data2[data2_length]; + memset(data2, 1, data1_length); + + write_pointer = knot_rrset_create_rdata(rrset, data2_length); + if (write_pointer == NULL) { + diag("Could not create data of size %d\n", data2_length); + return 0; } - return errors; -} - -static int test_rrset_type(knot_rrset_t **rrsets) -{ - int errors = 0; - for (int i = 0; i < TEST_RRSETS; i++) { - if (knot_rrset_type(rrsets[i]) != test_rrsets[i].type) { - errors++; - diag("Got wrong value for type from rrset."); - } + + /* Write dummy data. */ + memcpy(write_pointer, data1, data1_length); + + /* Check that indices are set right. */ + if (rrset->rdata_indices[0] != data1_length) { + diag("Wrong RDATA first index after " + "inserting RDATA to RRSet.\n"); + return 0; } - return errors; -} - -static int test_rrset_class(knot_rrset_t **rrsets) -{ - int errors = 0; - for (int i = 0; i < TEST_RRSETS; i++) { - if (knot_rrset_class(rrsets[i]) != test_rrsets[i].rclass) { - errors++; - diag("Got wrong value for class from rrset."); - } + + if (rrset->rdata_indices[1] != data1_length + data2_length) { + diag("Wrong RDATA last index after " + "inserting RDATA to RRSet.\n"); + return 0; } - - return errors; -} - -static int test_rrset_ttl(knot_rrset_t **rrsets) -{ - int errors = 0; - for (int i = 0; i < TEST_RRSETS; i++) { - if (knot_rrset_ttl(rrsets[i]) != test_rrsets[i].ttl) { - errors++; - diag("Got wrong value for ttl from rrset."); - } + + /* Rdata count must be equal to two. */ + if (rrset->rdata_count != 2) { + diag("Wrong RDATA count after inserting second " + "RDATA to RRSet.\n"); + return 0; } - return errors; -} - -static int test_rrset_ret_rdata(knot_rrset_t **rrsets) -{ - int errors = 0; - - knot_rrtype_descriptor_t *desc; - - for (int i = 0; i < TEST_RRSETS; i++) { - - desc = knot_rrtype_descriptor_by_type(rrsets[i]->type); - assert(desc); - -// knot_rdata_dump(test_rrsets[i].rdata, 1); - // knot_rdata_dump(rrsets[i]->rdata, 1); - - if (knot_rdata_compare(knot_rrset_rdata(rrsets[i]), - test_rrsets[i].rdata, - desc->wireformat)) { - errors++; - diag("Got wrong value for rdata from rrset."); - } + + /* Make sure that the data in the RRSet are the same. */ + int ret = memcmp(rrset->rdata + data1_length, data2, data2_length); + if (ret) { + diag("Wrong data inserted into RRSet.\n"); + return 0; } - return errors; -} - -static int test_rrset_get_rdata(knot_rrset_t **rrsets) -{ - int errors = 0; - - knot_rrtype_descriptor_t *desc; - - for (int i = 0; i < TEST_RRSETS; i++) { - desc = knot_rrtype_descriptor_by_type(rrsets[i]->type); - assert(desc); - if (knot_rdata_compare(knot_rrset_get_rdata(rrsets[i]), - test_rrsets[i].rdata, - desc->wireformat)) { - errors++; - diag("Got wrong value for rdata from rrset. (Get)"); - } + + /* Test that data of length 0 are not inserted. */ + void *ret = knot_rrset_create_rdata(rrset, 0); + if (ret != NULL) { + diag("Empty RDATA inserted.\n"); + return 0; } - return errors; + + return 1; } -static int test_rrset_ret_rrsigs(knot_rrset_t **rrsets) +static int test_rrset_add_rdata() { - int errors = 0; - - for (int i = 0; i < TEST_RRSETS; i++) { - /* TODO should I test the insides of structure as well? */ - if (knot_rrset_rrsigs(rrsets[i]) != test_rrsets[i].rrsigs) { - errors++; - diag("Got wrong value for rrsigs from rrset."); - } - } - return errors; + /* + * This function is basically a wrapper around knot_rrset_create_rdata() + */ } -static int test_rrset_getters(uint type) +static int test_rrset_merge() { - int errors = 0; - - knot_rrset_t *rrsets[TEST_RRSETS]; - - for (int i = 0; i < TEST_RRSETS; i++) { - knot_dname_t *owner = knot_dname_new_from_str( - test_rrsets[i].owner, - strlen(test_rrsets[i].owner), - NODE_ADDRESS); - if (owner == NULL) { - diag("Error creating owner domain name!"); - return 0; - } - rrsets[i] = knot_rrset_new(owner, - test_rrsets[i].type, - test_rrsets[i].rclass, - test_rrsets[i].ttl); - - knot_rrset_add_rdata(rrsets[i], test_rrsets[i].rdata); - } - - switch (type) { - case 0: { - errors += test_rrset_owner(rrsets); - break; - } - case 1: { - errors += test_rrset_type(rrsets); - break; - } - case 2: { - errors += test_rrset_class(rrsets); - break; - } - case 3: { - errors += test_rrset_ttl(rrsets); - break; - } - case 4: { - errors += test_rrset_ret_rdata(rrsets); - break; - } - case 5: { - errors += test_rrset_get_rdata(rrsets); - break; - } - case 6: { - errors += test_rrset_ret_rrsigs(rrsets); - break; - } - } /* switch */ - - for (int i = 0; i < TEST_RRSETS; i++) { - knot_dname_free(&rrsets[i]->owner); - knot_rrset_free(&rrsets[i]); - } - - - return (errors == 0); } -static int test_rrset_deep_free() +static int test_rrset_get_rdata(knot_rrset_t **rrsets) { - /*!< \warning Cannot be run when some rdata are on stack! */ - int errors = 0; - - knot_rrset_t *tmp_rrset; - knot_dname_t *owner; - for (int i = 0; i < TEST_RRSETS; i++) { - owner = knot_dname_new_from_str( - test_rrsets[i].owner, - strlen(test_rrsets[i].owner), - NODE_ADDRESS); - if (owner == NULL) { - diag("Error creating owner domain name!"); - return 0; - } - - tmp_rrset = knot_rrset_new(owner, - test_rrsets[i].type, - test_rrsets[i].rclass, - test_rrsets[i].ttl); - - knot_rrset_add_rdata(tmp_rrset, test_rrsets[i].rdata); - - knot_rrset_deep_free(&tmp_rrset, 1, 1, 0); - - errors += (tmp_rrset != NULL); - } - - return (errors == 0); } -/*----------------------------------------------------------------------------*/ - static const int KNOT_RRSET_TEST_COUNT = 13; /*! This helper routine should report number of