From: Michał Kępień Date: Tue, 13 Mar 2018 13:06:04 +0000 (+0100) Subject: Rework dns_test_makezone() X-Git-Tag: v9.13.0~28^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bfbeef3609dba1929e3df4ab980291a56387006a;p=thirdparty%2Fbind9.git 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. --- diff --git a/lib/dns/tests/dnstest.c b/lib/dns/tests/dnstest.c index 4fe5647aef7..8c8e5bfec98 100644 --- a/lib/dns/tests/dnstest.c +++ b/lib/dns/tests/dnstest.c @@ -201,57 +201,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; - - zone = *zonep; - if (zone == NULL) - CHECK(dns_zone_create(&zone, mctx)); - - 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); + REQUIRE(view == NULL || !createview); + + /* + * Create the zone structure. + */ + result = dns_zone_create(&zone, mctx); + if (result != ISC_R_SUCCESS) { + return (result); + } + + /* + * 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); } diff --git a/lib/dns/tests/dnstest.h b/lib/dns/tests/dnstest.h index e9f48097b8e..f255493a70d 100644 --- a/lib/dns/tests/dnstest.h +++ b/lib/dns/tests/dnstest.h @@ -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); diff --git a/lib/dns/tests/zt_test.c b/lib/dns/tests/zt_test.c index 6fed4a4769a..699569716ff 100644 --- a/lib/dns/tests/zt_test.c +++ b/lib/dns/tests/zt_test.c @@ -9,8 +9,6 @@ * information regarding copyright ownership. */ -/* $Id$ */ - /*! \file */ #include @@ -222,13 +220,13 @@ ATF_TC_BODY(asyncload_zt, tc) { dns_masterformat_text, &dns_master_style_default); 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", dns_masterformat_text, &dns_master_style_default); /* 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", dns_masterformat_text, &dns_master_style_default);