mirror of
https://gitlab.nic.cz/knot/knot-dns.git
synced 2026-02-03 18:49:28 -05:00
100 lines
2.9 KiB
C
100 lines
2.9 KiB
C
/* Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
|
|
|
|
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/>.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include "test_conf.h"
|
|
#include "knot/server/server.h"
|
|
#include "knot/zone/adjust.h"
|
|
#include "contrib/mempattern.h"
|
|
|
|
/* Some domain names. */
|
|
#define ROOT_DNAME ((const uint8_t *)"")
|
|
#define EXAMPLE_DNAME ((const uint8_t *)"\x7""example")
|
|
#define IDSERVER_DNAME ((const uint8_t *)"\2""id""\6""server")
|
|
|
|
/* Create fake root zone. */
|
|
static inline void create_root_zone(server_t *server, knot_mm_t *mm)
|
|
{
|
|
/* SOA RDATA. */
|
|
#define SOA_RDLEN 30
|
|
static const uint8_t SOA_RDATA[SOA_RDLEN] = {
|
|
0x02, 'n', 's', 0x00, /* ns. */
|
|
0x04, 'm', 'a', 'i', 'l', 0x00,/* mail. */
|
|
0x77, 0xdf, 0x1e, 0x63, /* serial */
|
|
0x00, 0x01, 0x51, 0x80, /* refresh */
|
|
0x00, 0x00, 0x1c, 0x20, /* retry */
|
|
0x00, 0x0a, 0x8c, 0x00, /* expire */
|
|
0x00, 0x00, 0x0e, 0x10 /* min ttl */
|
|
};
|
|
|
|
/* Insert root zone. */
|
|
zone_t *root = zone_new(ROOT_DNAME);
|
|
root->server = server;
|
|
root->contents = zone_contents_new(root->name, true);
|
|
|
|
knot_rrset_t *soa = knot_rrset_new(root->name, KNOT_RRTYPE_SOA, KNOT_CLASS_IN,
|
|
7200, mm);
|
|
knot_rrset_add_rdata(soa, SOA_RDATA, SOA_RDLEN, mm);
|
|
node_add_rrset(root->contents->apex, soa, NULL);
|
|
knot_rrset_free(soa, mm);
|
|
|
|
/* Bake the zone. */
|
|
(void)zone_adjust_full(root->contents, 1);
|
|
|
|
/* Switch zone db. */
|
|
knot_zonedb_free(&server->zone_db);
|
|
server->zone_db = knot_zonedb_new();
|
|
knot_zonedb_insert(server->zone_db, root);
|
|
}
|
|
|
|
/* Create fake server. */
|
|
static inline int create_fake_server(server_t *server, knot_mm_t *mm, const char *db_storage)
|
|
{
|
|
int ret;
|
|
|
|
/* Create test configuration. */
|
|
/* String `db_storage' obtained from test_mkdtemp() may be up to 4096 bytes. */
|
|
char conf_str[4096 + 512];
|
|
(void)snprintf(conf_str, sizeof(conf_str),
|
|
"server:\n"
|
|
" identity: bogus.ns\n"
|
|
" version: 0.11\n"
|
|
" nsid: \n"
|
|
"database:\n"
|
|
" storage: %s\n"
|
|
"zone:\n"
|
|
" - domain: .\n"
|
|
" zonefile-sync: -1\n",
|
|
db_storage);
|
|
|
|
/* Load test configuration. */
|
|
ret = test_conf(conf_str, NULL);
|
|
if (ret != KNOT_EOK) {
|
|
return ret;
|
|
}
|
|
|
|
/* Create name server. */
|
|
ret = server_init(server, 1);
|
|
if (ret != KNOT_EOK) {
|
|
return ret;
|
|
}
|
|
|
|
/* Insert root zone. */
|
|
create_root_zone(server, mm);
|
|
|
|
return KNOT_EOK;
|
|
}
|