Rework dns_test_makezone()
The dns_test_makezone() helper function always assigns the created zone
to some view, which is not always necessary and complicates cleanup of
non-managed zones as they are required not to be assigned to any view.
Rework dns_test_makezone() in order to make it easier to use in unit
tests operating on non-managed zones. Use dns_name_fromstring() instead
of dns_name_fromtext() to simplify code. Do not use the CHECK() macro
and add comments to make code flow simpler to follow. Use
dns_test_makeview() instead of dns_view_create().
Adjust existing unit tests using this function so that they still pass.
(cherry picked from commit bfbeef3609)
This commit is contained in:
@@ -208,57 +208,68 @@ dns_test_makeview(const char *name, dns_view_t **viewp) {
|
||||
return (result);
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a zone with origin 'name', return a pointer to the zone object in
|
||||
* 'zonep'. If 'view' is set, add the zone to that view; otherwise, create
|
||||
* a new view for the purpose.
|
||||
*
|
||||
* If the created view is going to be needed by the caller subsequently,
|
||||
* then 'keepview' should be set to true; this will prevent the view
|
||||
* from being detached. In this case, the caller is responsible for
|
||||
* detaching the view.
|
||||
*/
|
||||
isc_result_t
|
||||
dns_test_makezone(const char *name, dns_zone_t **zonep, dns_view_t *view,
|
||||
isc_boolean_t keepview)
|
||||
isc_boolean_t createview)
|
||||
{
|
||||
isc_result_t result;
|
||||
dns_fixedname_t fixed_origin;
|
||||
dns_zone_t *zone = NULL;
|
||||
isc_buffer_t buffer;
|
||||
dns_fixedname_t fixorigin;
|
||||
isc_result_t result;
|
||||
dns_name_t *origin;
|
||||
|
||||
if (view == NULL)
|
||||
CHECK(dns_view_create(mctx, dns_rdataclass_in, "view", &view));
|
||||
else if (!keepview)
|
||||
keepview = ISC_TRUE;
|
||||
REQUIRE(view == NULL || !createview);
|
||||
|
||||
zone = *zonep;
|
||||
if (zone == NULL)
|
||||
CHECK(dns_zone_create(&zone, mctx));
|
||||
/*
|
||||
* Create the zone structure.
|
||||
*/
|
||||
result = dns_zone_create(&zone, mctx);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
return (result);
|
||||
}
|
||||
|
||||
isc_buffer_constinit(&buffer, name, strlen(name));
|
||||
isc_buffer_add(&buffer, strlen(name));
|
||||
origin = dns_fixedname_initname(&fixorigin);
|
||||
CHECK(dns_name_fromtext(origin, &buffer, dns_rootname, 0, NULL));
|
||||
CHECK(dns_zone_setorigin(zone, origin));
|
||||
dns_zone_setview(zone, view);
|
||||
/*
|
||||
* Set zone type and origin.
|
||||
*/
|
||||
dns_zone_settype(zone, dns_zone_master);
|
||||
dns_zone_setclass(zone, view->rdclass);
|
||||
dns_view_addzone(view, zone);
|
||||
origin = dns_fixedname_initname(&fixed_origin);
|
||||
result = dns_name_fromstring(origin, name, 0, NULL);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
goto detach_zone;
|
||||
}
|
||||
result = dns_zone_setorigin(zone, origin);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
goto detach_zone;
|
||||
}
|
||||
|
||||
if (!keepview)
|
||||
dns_view_detach(&view);
|
||||
/*
|
||||
* If requested, create a view.
|
||||
*/
|
||||
if (createview) {
|
||||
result = dns_test_makeview("view", &view);
|
||||
if (result != ISC_R_SUCCESS) {
|
||||
goto detach_zone;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* If a view was passed as an argument or created above, attach the
|
||||
* created zone to it. Otherwise, set the zone's class to IN.
|
||||
*/
|
||||
if (view != NULL) {
|
||||
dns_zone_setview(zone, view);
|
||||
dns_zone_setclass(zone, view->rdclass);
|
||||
dns_view_addzone(view, zone);
|
||||
} else {
|
||||
dns_zone_setclass(zone, dns_rdataclass_in);
|
||||
}
|
||||
|
||||
*zonep = zone;
|
||||
|
||||
return (ISC_R_SUCCESS);
|
||||
|
||||
cleanup:
|
||||
if (zone != NULL)
|
||||
dns_zone_detach(&zone);
|
||||
if (view != NULL)
|
||||
dns_view_detach(&view);
|
||||
detach_zone:
|
||||
dns_zone_detach(&zone);
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
|
||||
@@ -54,9 +54,25 @@ dns_test_end(void);
|
||||
isc_result_t
|
||||
dns_test_makeview(const char *name, dns_view_t **viewp);
|
||||
|
||||
/*%
|
||||
* Create a zone with origin 'name', return a pointer to the zone object in
|
||||
* 'zonep'.
|
||||
*
|
||||
* If 'view' is set, the returned zone will be assigned to the passed view.
|
||||
* 'createview' must be set to false when 'view' is non-NULL.
|
||||
*
|
||||
* If 'view' is not set and 'createview' is true, a new view is also created
|
||||
* and the returned zone is assigned to it. This imposes two requirements on
|
||||
* the caller: 1) the returned zone has to be subsequently assigned to a zone
|
||||
* manager, otherwise its cleanup will fail, 2) the created view has to be
|
||||
* cleaned up by the caller.
|
||||
*
|
||||
* If 'view' is not set and 'createview' is false, the returned zone will not
|
||||
* be assigned to any view.
|
||||
*/
|
||||
isc_result_t
|
||||
dns_test_makezone(const char *name, dns_zone_t **zonep, dns_view_t *view,
|
||||
isc_boolean_t keepview);
|
||||
isc_boolean_t createview);
|
||||
|
||||
isc_result_t
|
||||
dns_test_setupzonemgr(void);
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
* information regarding copyright ownership.
|
||||
*/
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/*! \file */
|
||||
|
||||
#include <config.h>
|
||||
@@ -219,12 +217,12 @@ ATF_TC_BODY(asyncload_zt, tc) {
|
||||
dns_zone_setfile(zone1, "testdata/zt/zone1.db");
|
||||
view = dns_zone_getview(zone1);
|
||||
|
||||
result = dns_test_makezone("bar", &zone2, view, ISC_TRUE);
|
||||
result = dns_test_makezone("bar", &zone2, view, ISC_FALSE);
|
||||
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
|
||||
dns_zone_setfile(zone2, "testdata/zt/zone1.db");
|
||||
|
||||
/* This one will fail to load */
|
||||
result = dns_test_makezone("fake", &zone3, view, ISC_TRUE);
|
||||
result = dns_test_makezone("fake", &zone3, view, ISC_FALSE);
|
||||
ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
|
||||
dns_zone_setfile(zone3, "testdata/zt/nonexistent.db");
|
||||
|
||||
|
||||
Reference in New Issue
Block a user