knot-dns/tests/knot/test_changeset.c

167 lines
5.5 KiB
C
Raw Permalink Normal View History

2019-04-24 07:05:26 -04:00
/* Copyright (C) 2019 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
2014-06-24 08:03:06 -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-06-24 08:03:06 -04:00
*/
#include <config.h>
#include <assert.h>
#include <tap/basic.h>
#include "libknot/errcode.h"
#include "libknot/error.h"
2014-06-24 08:03:06 -04:00
#include "knot/updates/changesets.h"
int main(int argc, char *argv[])
{
plan_lazy();
2014-06-24 08:03:06 -04:00
// Test with NULL changeset
ok(changeset_size(NULL) == 0, "changeset: NULL size");
ok(changeset_empty(NULL), "changeset: NULL empty");
// Test creation.
knot_dname_t *d = knot_dname_from_str_alloc("test.");
2014-06-24 08:03:06 -04:00
assert(d);
2014-07-22 12:23:47 -04:00
changeset_t *ch = changeset_new(d);
knot_dname_free(d, NULL);
2014-06-24 08:03:06 -04:00
ok(ch != NULL, "changeset: new");
if (!ch) {
return 1;
}
2014-06-24 08:03:06 -04:00
ok(changeset_empty(ch), "changeset: empty");
ch->soa_to = (knot_rrset_t *)0xdeadbeef;
ok(!changeset_empty(ch), "changeset: empty SOA");
ch->soa_to = NULL;
2014-06-24 08:03:06 -04:00
ok(changeset_size(ch) == 0, "changeset: empty size");
// Test additions.
d = knot_dname_from_str_alloc("non.terminals.test.");
2014-06-24 08:03:06 -04:00
assert(d);
knot_rrset_t *apex_txt_rr = knot_rrset_new(d, KNOT_RRTYPE_TXT, KNOT_CLASS_IN, 3600, NULL);
2014-06-24 08:03:06 -04:00
assert(apex_txt_rr);
uint8_t data[8] = "\7teststr";
knot_rrset_add_rdata(apex_txt_rr, data, sizeof(data), NULL);
2014-06-24 08:03:06 -04:00
2016-07-27 04:50:16 -04:00
int ret = changeset_add_addition(ch, apex_txt_rr, CHANGESET_CHECK);
is_int(KNOT_EOK, ret, "changeset: add RRSet");
2014-06-24 08:03:06 -04:00
ok(changeset_size(ch) == 1, "changeset: size add");
2016-07-27 04:50:16 -04:00
ret = changeset_add_removal(ch, apex_txt_rr, CHANGESET_CHECK);
is_int(KNOT_EOK, ret, "changeset: rem RRSet");
ok(changeset_size(ch) == 0, "changeset: size remove");
ok(changeset_empty(ch), "changeset: empty");
2016-07-27 04:50:16 -04:00
changeset_add_addition(ch, apex_txt_rr, CHANGESET_CHECK);
2014-06-24 08:03:06 -04:00
// Add another RR to node.
knot_rrset_t *apex_spf_rr = knot_rrset_new(d, KNOT_RRTYPE_SPF, KNOT_CLASS_IN, 3600, NULL);
2014-06-24 08:03:06 -04:00
assert(apex_spf_rr);
knot_rrset_add_rdata(apex_spf_rr, data, sizeof(data), NULL);
2016-07-27 04:50:16 -04:00
ret = changeset_add_addition(ch, apex_spf_rr, CHANGESET_CHECK);
is_int(KNOT_EOK, ret, "changeset: add multiple");
2014-06-24 08:03:06 -04:00
// Add another node.
knot_dname_free(d, NULL);
d = knot_dname_from_str_alloc("here.come.more.non.terminals.test");
2014-06-24 08:03:06 -04:00
assert(d);
knot_rrset_t *other_rr = knot_rrset_new(d, KNOT_RRTYPE_TXT, KNOT_CLASS_IN, 3600, NULL);
2014-06-24 08:03:06 -04:00
assert(other_rr);
knot_rrset_add_rdata(other_rr, data, sizeof(data), NULL);
2016-07-27 04:50:16 -04:00
ret = changeset_add_addition(ch, other_rr, CHANGESET_CHECK);
is_int(KNOT_EOK, ret, "changeset: remove multiple");
2014-06-24 08:03:06 -04:00
// Test add traversal.
changeset_iter_t it;
ret = changeset_iter_add(&it, ch);
is_int(KNOT_EOK, ret, "changeset: create iter add");
2014-06-24 08:03:06 -04:00
// Order: non.terminals.test. TXT, SPF, here.come.more.non.terminals.test. TXT.
knot_rrset_t iter = changeset_iter_next(&it);
bool trav_ok = knot_rrset_equal(&iter, apex_txt_rr, true);
iter = changeset_iter_next(&it);
trav_ok = trav_ok && knot_rrset_equal(&iter, apex_spf_rr, true);
iter = changeset_iter_next(&it);
trav_ok = trav_ok && knot_rrset_equal(&iter, other_rr, true);
2014-06-24 08:03:06 -04:00
ok(trav_ok, "changeset: add traversal");
iter = changeset_iter_next(&it);
changeset_iter_clear(&it);
2014-06-24 08:03:06 -04:00
ok(knot_rrset_empty(&iter), "changeset: traversal: skip non-terminals");
2016-07-27 04:50:16 -04:00
changeset_add_removal(ch, apex_txt_rr, CHANGESET_CHECK);
changeset_add_removal(ch, apex_txt_rr, CHANGESET_CHECK);
2014-06-24 08:03:06 -04:00
// Test remove traversal.
ret = changeset_iter_rem(&it, ch);
is_int(KNOT_EOK, ret, "changeset: create iter rem");
iter = changeset_iter_next(&it);
ok(knot_rrset_equal(&iter, apex_txt_rr, true),
2014-06-24 08:03:06 -04:00
"changeset: rem traversal");
changeset_iter_clear(&it);
2014-06-24 08:03:06 -04:00
// Test all traversal - just count.
ret = changeset_iter_all(&it, ch);
is_int(KNOT_EOK, ret, "changeset: create iter all");
2014-06-24 08:03:06 -04:00
size_t size = 0;
iter = changeset_iter_next(&it);
2014-06-24 08:03:06 -04:00
while (!knot_rrset_empty(&iter)) {
++size;
iter = changeset_iter_next(&it);
2014-06-24 08:03:06 -04:00
}
changeset_iter_clear(&it);
ok(size == 3, "changeset: iter all");
2014-06-24 08:03:06 -04:00
// Create new changeset.
knot_dname_free(d, NULL);
d = knot_dname_from_str_alloc("test.");
2014-06-24 08:03:06 -04:00
assert(d);
2014-07-22 12:23:47 -04:00
changeset_t *ch2 = changeset_new(d);
knot_dname_free(d, NULL);
2014-06-24 08:03:06 -04:00
assert(ch2);
// Add something to add section.
knot_dname_free(apex_txt_rr->owner, NULL);
apex_txt_rr->owner = knot_dname_from_str_alloc("something.test.");
2014-06-24 08:03:06 -04:00
assert(apex_txt_rr->owner);
2016-07-27 04:50:16 -04:00
ret = changeset_add_addition(ch2, apex_txt_rr, CHANGESET_CHECK);
2014-06-24 08:03:06 -04:00
assert(ret == KNOT_EOK);
// Add something to remove section.
knot_dname_free(apex_txt_rr->owner, NULL);
2014-06-24 08:03:06 -04:00
apex_txt_rr->owner =
knot_dname_from_str_alloc("and.now.for.something.completely.different.test.");
2014-06-24 08:03:06 -04:00
assert(apex_txt_rr->owner);
2016-07-27 04:50:16 -04:00
ret = changeset_add_removal(ch2, apex_txt_rr, CHANGESET_CHECK);
2014-06-24 08:03:06 -04:00
assert(ret == KNOT_EOK);
// Test merge.
ret = changeset_merge(ch, ch2, 0);
ok(ret == KNOT_EOK && changeset_size(ch) == 5, "changeset: merge");
2014-06-24 08:03:06 -04:00
// Test cleanup.
changeset_clear(ch);
2014-06-24 08:03:06 -04:00
ok(changeset_empty(ch), "changeset: clear");
free(ch);
list_t chgs;
init_list(&chgs);
add_head(&chgs, &ch2->n);
changesets_clear(&chgs);
2014-06-24 08:03:06 -04:00
ok(changeset_empty(ch2), "changeset: clear list");
free(ch2);
knot_rrset_free(apex_txt_rr, NULL);
knot_rrset_free(apex_spf_rr, NULL);
knot_rrset_free(other_rr, NULL);
2014-06-24 08:03:06 -04:00
return 0;
}