knot-dns/tests/knot/test_node.c

129 lines
4.4 KiB
C
Raw Permalink Normal View History

2019-03-11 06:10:07 -04:00
/* Copyright (C) 2019 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
2014-05-20 10:54:35 -04:00
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
2014-05-20 10:54:35 -04:00
*/
#include <assert.h>
#include <tap/basic.h>
#include "knot/zone/node.h"
#include "libknot/libknot.h"
2014-05-20 10:54:35 -04:00
static knot_rrset_t *create_dummy_rrset(const knot_dname_t *owner, uint16_t type)
2014-05-20 10:54:35 -04:00
{
knot_rrset_t *r = knot_rrset_new(owner, type, KNOT_CLASS_IN, 3600, NULL);
2014-05-20 10:54:35 -04:00
assert(r);
uint8_t wire[16] = { 0 };
memcpy(wire, "testtest", strlen("testtest"));
int ret = knot_rrset_add_rdata(r, wire, strlen("testtest"), NULL);
2014-05-20 10:54:35 -04:00
assert(ret == KNOT_EOK);
(void)ret;
2014-05-20 10:54:35 -04:00
return r;
}
static knot_rrset_t *create_dummy_rrsig(const knot_dname_t *owner, uint16_t type)
2014-05-20 10:54:35 -04:00
{
knot_rrset_t *r = knot_rrset_new(owner, KNOT_RRTYPE_RRSIG, KNOT_CLASS_IN,
3600, NULL);
2014-05-20 10:54:35 -04:00
assert(r);
uint8_t wire[sizeof(uint16_t)];
knot_wire_write_u16(wire, type);
int ret = knot_rrset_add_rdata(r, wire, sizeof(uint16_t), NULL);
2014-05-20 10:54:35 -04:00
assert(ret == KNOT_EOK);
(void)ret;
2014-05-20 10:54:35 -04:00
return r;
}
int main(int argc, char *argv[])
{
plan_lazy();
2015-02-19 09:14:30 -05:00
knot_dname_t *dummy_owner = knot_dname_from_str_alloc("test.");
2014-05-20 10:54:35 -04:00
// Test new
zone_node_t *node = node_new(dummy_owner, false, false, NULL);
2014-05-20 10:54:35 -04:00
ok(node != NULL, "Node: new");
assert(node);
ok(knot_dname_is_equal(node->owner, dummy_owner), "Node: new - set fields");
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
// Test RRSet addition
knot_rrset_t *dummy_rrset = create_dummy_rrset(dummy_owner, KNOT_RRTYPE_TXT);
2014-07-31 05:09:47 -04:00
int ret = node_add_rrset(node, dummy_rrset, NULL);
2014-05-20 10:54:35 -04:00
ok(ret == KNOT_EOK && node->rrset_count == 1 &&
knot_rdataset_eq(&dummy_rrset->rrs, &node->rrs[0].rrs), "Node: add RRSet.");
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
// Test RRSet getters
knot_rrset_t *n_rrset = node_create_rrset(node, KNOT_RRTYPE_TXT);
ok(n_rrset && knot_rrset_equal(n_rrset, dummy_rrset, true),
2014-05-20 10:54:35 -04:00
"Node: create existing RRSet.");
2015-02-19 09:14:30 -05:00
knot_rrset_free(n_rrset, NULL);
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
n_rrset = node_create_rrset(node, KNOT_RRTYPE_SOA);
ok(n_rrset == NULL, "Node: create non-existing RRSet.");
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
knot_rrset_t stack_rrset = node_rrset(node, KNOT_RRTYPE_TXT);
ok(knot_rrset_equal(&stack_rrset, dummy_rrset, true), "Node: get existing RRSet.");
2014-05-20 10:54:35 -04:00
stack_rrset = node_rrset(node, KNOT_RRTYPE_SOA);
ok(knot_rrset_empty(&stack_rrset), "Node: get non-existent RRSet.");
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
knot_rdataset_t *n_rdataset = node_rdataset(node, KNOT_RRTYPE_TXT);
ok(n_rdataset && knot_rdataset_eq(n_rdataset, &dummy_rrset->rrs),
"Node: get existing rdataset.");
n_rdataset = node_rdataset(node, KNOT_RRTYPE_SOA);
ok(n_rdataset == NULL, "Node: get non-existing rdataset.");
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
stack_rrset = node_rrset_at(node, 0);
ok(knot_rrset_equal(&stack_rrset, dummy_rrset, true),
2014-05-20 10:54:35 -04:00
"Node: get existing position.");
stack_rrset = node_rrset_at(node, 1);
ok(knot_rrset_empty(&stack_rrset), "Node: get non-existent position.");
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
// Test TTL mismatch
dummy_rrset->ttl = 1800;
2014-07-31 05:09:47 -04:00
ret = node_add_rrset(node, dummy_rrset, NULL);
2014-05-20 10:54:35 -04:00
ok(ret == KNOT_ETTL && node->rrset_count == 1,
"Node: add RRSet, TTL mismatch.");
2015-02-19 09:14:30 -05:00
knot_rrset_free(dummy_rrset, NULL);
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
// Test bool functions
ok(node_rrtype_exists(node, KNOT_RRTYPE_TXT), "Node: type exists.");
ok(!node_rrtype_exists(node, KNOT_RRTYPE_AAAA), "Node: type does not exist.");
ok(!node_rrtype_is_signed(node, KNOT_RRTYPE_TXT), "Node: type is not signed.");
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
dummy_rrset = create_dummy_rrsig(dummy_owner, KNOT_RRTYPE_TXT);
2014-07-31 05:09:47 -04:00
ret = node_add_rrset(node, dummy_rrset, NULL);
2014-05-20 10:54:35 -04:00
assert(ret == KNOT_EOK);
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
ok(node_rrtype_is_signed(node, KNOT_RRTYPE_TXT), "Node: type is signed.");
2015-02-19 09:14:30 -05:00
knot_rrset_free(dummy_rrset, NULL);
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
// Test remove RRset
node_remove_rdataset(node, KNOT_RRTYPE_AAAA);
ok(node->rrset_count == 2, "Node: remove non-existent rdataset.");
node_remove_rdataset(node, KNOT_RRTYPE_TXT);
ok(node->rrset_count == 1, "Node: remove existing rdataset.");
2015-02-19 09:14:30 -05:00
2014-05-20 10:54:35 -04:00
// "Test" freeing
2014-08-11 07:34:13 -04:00
node_free_rrsets(node, NULL);
2014-05-20 10:54:35 -04:00
ok(node->rrset_count == 0, "Node: free RRSets.");
2015-02-19 09:14:30 -05:00
node_free(node, NULL);
2015-02-19 09:14:30 -05:00
knot_dname_free(dummy_owner, NULL);
2014-05-20 10:54:35 -04:00
return 0;
}