]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
convert dbversion_test
authorEvan Hunt <each@isc.org>
Fri, 9 Nov 2018 18:23:49 +0000 (10:23 -0800)
committerEvan Hunt <each@isc.org>
Thu, 15 Nov 2018 04:17:04 +0000 (20:17 -0800)
lib/dns/tests/Kyuafile
lib/dns/tests/Makefile.in
lib/dns/tests/dbversion_test.c

index 2bd698934afed5cee3971226a9bb450d46f9b141..1a28e702ed8b82f4adc761f5f4b8acb1873eefe1 100644 (file)
@@ -5,7 +5,7 @@ tap_test_program{name='acl_test'}
 tap_test_program{name='db_test'}
 tap_test_program{name='dbdiff_test'}
 tap_test_program{name='dbiterator_test'}
-atf_test_program{name='dbversion_test'}
+tap_test_program{name='dbversion_test'}
 tap_test_program{name='dh_test'}
 tap_test_program{name='dispatch_test'}
 tap_test_program{name='dnstap_test'}
index fb58d96f02bdf88cf28df323fda47907d3c279ad..0a8a3a8e40a6e9fd68c2a8a9b0d969bd2c2a621e 100644 (file)
@@ -118,9 +118,9 @@ dbiterator_test@EXEEXT@: dbiterator_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPL
                ${DNSLIBS} ${ISCLIBS} ${LIBS} ${CMOCKA_LIBS}
 
 dbversion_test@EXEEXT@: dbversion_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
-       ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
-                       dbversion_test.@O@ dnstest.@O@ ${DNSLIBS} \
-                               ${ISCLIBS} ${LIBS}
+       ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${CMOCKA_CFLAGS} \
+               ${LDFLAGS} -o $@ dbversion_test.@O@ dnstest.@O@ \
+               ${DNSLIBS} ${ISCLIBS} ${LIBS} ${CMOCKA_LIBS}
 
 dh_test@EXEEXT@: dh_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
        ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${CMOCKA_CFLAGS} \
index 43aa1fe7e5201084dbfcc3b6d92994103b62ad71..16e8bbae66a927b374f9dc731bab8b39d5c2c7e5 100644 (file)
@@ -9,23 +9,28 @@
  * information regarding copyright ownership.
  */
 
+#include <config.h>
 
-/*! \file */
+#if HAVE_CMOCKA
 
-#include <config.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
 
-#include <inttypes.h>
 #include <stdlib.h>
-#include <time.h>
+#include <string.h>
 #include <unistd.h>
 
-#include <atf-c.h>
+#define UNIT_TESTING
+#include <cmocka.h>
 
 #include <isc/file.h>
 #include <isc/result.h>
 #include <isc/serial.h>
 #include <isc/stdtime.h>
 #include <isc/msgcat.h>
+#include <isc/string.h>
+#include <isc/util.h>
 
 #include <dns/db.h>
 #include <dns/rdatalist.h>
 #include "dnstest.h"
 
 static char tempname[11] = "dtXXXXXXXX";
+static dns_db_t *db1 = NULL, *db2 = NULL;
+static dns_dbversion_t *v1 = NULL, *v2 = NULL;
+
+#ifndef ISC_CHECK_NONE
+/*
+ * The code below enables us to trap assertion failures for testing
+ * purposes. local_callback() is set as the callback function for
+ * isc_assertion_failed(). It calls mock_assert() so that CMOCKA
+ * will be able to see it, then returns to the calling functon via
+ * longjmp() so that the abort() call in isc_assertion_failed() will
+ * never be reached. Use check_assertion() to check for assertions
+ * instead of expect_assert_failure().
+ */
+jmp_buf assertion;
+
+#define check_assertion(function_call)                         \
+       do {                                                    \
+               const int r = setjmp(assertion);                \
+               if (r == 0) {                                   \
+                       expect_assert_failure(function_call);   \
+               }                                               \
+       } while(false);
 
 static void
 local_callback(const char *file, int line, isc_assertiontype_t type,
               const char *cond)
 {
-       UNUSED(file); UNUSED(line); UNUSED(type); UNUSED(cond);
-       if (strcmp(tempname, "dtXXXXXXXX"))
-               unlink(tempname);
-       atf_tc_pass();
-       exit(0);
+       UNUSED(type);
+
+       mock_assert(1, cond, file, line);
+       longjmp(assertion, 1);
 }
+#else
+#define check_assertion(function_call)
+#endif /* ISC_CHECK_NONE */
 
-static dns_db_t *db1 = NULL, *db2 = NULL;
-static dns_dbversion_t *v1 = NULL, *v2 = NULL;
+static int
+_setup(void **state) {
+       isc_result_t res;
 
-static void
-setup_db(void) {
-       isc_result_t result;
-       result = dns_db_create(mctx, "rbt", dns_rootname, dns_dbtype_zone,
+       UNUSED(state);
+
+#ifndef ISC_CHECK_NONE
+       isc_assertion_setcallback(local_callback);
+#endif
+
+       res = dns_test_begin(NULL, false);
+       assert_int_equal(res, ISC_R_SUCCESS);
+
+       res = dns_db_create(mctx, "rbt", dns_rootname, dns_dbtype_zone,
                               dns_rdataclass_in, 0, NULL, &db1);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       assert_int_equal(res, ISC_R_SUCCESS);
        dns_db_newversion(db1, &v1);
+       assert_non_null(v1);
 
-       result = dns_db_create(mctx, "rbt", dns_rootname, dns_dbtype_zone,
+       res = dns_db_create(mctx, "rbt", dns_rootname, dns_dbtype_zone,
                               dns_rdataclass_in, 0, NULL, &db2);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       assert_int_equal(res, ISC_R_SUCCESS);
        dns_db_newversion(db2, &v2);
+       assert_non_null(v1);
+
+       return (0);
 }
 
-static void
-close_db(void) {
+static int
+_teardown(void **state) {
+       UNUSED(state);
+
+       if (strcmp(tempname, "dtXXXXXXXX") != 0) {
+               unlink(tempname);
+       }
+
        if (v1 != NULL) {
                dns_db_closeversion(db1, &v1, false);
-               ATF_REQUIRE_EQ(v1, NULL);
+               assert_null(v1);
        }
        if (db1 != NULL) {
                dns_db_detach(&db1);
-               ATF_REQUIRE_EQ(db1, NULL);
+               assert_null(db1);
        }
 
        if (v2 != NULL) {
                dns_db_closeversion(db2, &v2, false);
-               ATF_REQUIRE_EQ(v2, NULL);
+               assert_null(v2);
        }
        if (db2 != NULL) {
                dns_db_detach(&db2);
-               ATF_REQUIRE_EQ(db2, NULL);
+               assert_null(db2);
        }
+
+       dns_test_end();
+
+       return (0);
 }
 
-#define VERSION(callback) ((callback == NULL) ? v1 : v2)
-#define VERSIONP(callback) ((callback == NULL) ? &v1 : &v2)
 /*
- * Individual unit tests
+ * Check dns_db_attachversion() passes with matching db and version, and
+ * asserts with mis-matching db and version.
  */
 static void
-attachversion(isc_assertioncallback_t callback) {
-       isc_result_t result;
+attachversion(void **state) {
        dns_dbversion_t *v = NULL;
 
-       result = dns_test_begin(NULL, false);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       setup_db();
+       UNUSED(state);
 
-       isc_assertion_setcallback(callback);
-       dns_db_attachversion(db1, VERSION(callback), &v);
-       if (callback != NULL) {
-#ifndef ISC_CHECK_NONE
-               atf_tc_fail("dns_db_attachversion did not assert");
-#else
-               atf_tc_pass();
-#endif
-       }
-       ATF_REQUIRE_EQ(v, v1);
+       dns_db_attachversion(db1, v1, &v);
+       assert_ptr_equal(v, v1);
        dns_db_closeversion(db1, &v, false);
-       ATF_REQUIRE_EQ(v, NULL);
-
-       close_db();
-       dns_test_end();
-}
-
-ATF_TC(attachversion);
-ATF_TC_HEAD(attachversion, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_attachversion passes with matching db/verison");
-}
-ATF_TC_BODY(attachversion, tc) {
-
-       UNUSED(tc);
+       assert_null(v);
 
-       attachversion(NULL);
-}
-
-ATF_TC(attachversion_bad);
-ATF_TC_HEAD(attachversion_bad, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_attachversion aborts with mis-matching db/verison");
-}
-ATF_TC_BODY(attachversion_bad, tc) {
-
-       UNUSED(tc);
-
-       attachversion(local_callback);
+       check_assertion(dns_db_attachversion(db1, v2, &v));
 }
 
+/*
+ * Check dns_db_closeversion() passes with matching db and version, and
+ * asserts with mis-matching db and version.
+ */
 static void
-closeversion(isc_assertioncallback_t callback) {
-       isc_result_t result;
-
-       result = dns_test_begin(NULL, false);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+closeversion(void **state) {
+       UNUSED(state);
 
-       setup_db();
+       assert_non_null(v1);
+       dns_db_closeversion(db1, &v1, false);
+       assert_null(v1);
 
-       isc_assertion_setcallback(callback);
-       dns_db_closeversion(db1, VERSIONP(callback), false);
-       if (callback != NULL) {
-#ifndef ISC_CHECK_NONE
-               atf_tc_fail("dns_db_closeversion did not assert");
-#else
-               atf_tc_pass();
-#endif
-       }
-       ATF_REQUIRE_EQ(v1, NULL);
-
-       close_db();
-       dns_test_end();
-}
-
-ATF_TC(closeversion);
-ATF_TC_HEAD(closeversion, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_closeversion passes with matching db/verison");
-}
-ATF_TC_BODY(closeversion, tc) {
-
-       UNUSED(tc);
-
-       closeversion(NULL);
-}
-
-ATF_TC(closeversion_bad);
-ATF_TC_HEAD(closeversion_bad, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_closeversion asserts with mis-matching db/verison");
-}
-ATF_TC_BODY(closeversion_bad, tc) {
-
-       UNUSED(tc);
-
-       closeversion(local_callback);
+       check_assertion(dns_db_closeversion(db1, &v2, false));
 }
 
+/*
+ * Check dns_db_find() passes with matching db and version, and
+ * asserts with mis-matching db and version.
+ */
 static void
-find(isc_assertioncallback_t callback) {
-       isc_result_t result;
+find(void **state) {
+       isc_result_t res;
        dns_rdataset_t rdataset;
        dns_fixedname_t fixed;
+       dns_name_t *name = NULL;
 
-       result = dns_test_begin(NULL, false);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       UNUSED(state);
 
-       setup_db();
+       name = dns_fixedname_initname(&fixed);
 
        dns_rdataset_init(&rdataset);
-       dns_fixedname_init(&fixed);
+       res = dns_db_find(db1, dns_rootname, v1, dns_rdatatype_soa,
+                         0, 0, NULL, name, &rdataset, NULL);
+       assert_int_equal(res, DNS_R_NXDOMAIN);
 
-       isc_assertion_setcallback(callback);
-       result = dns_db_find(db1, dns_rootname, VERSION(callback),
-                            dns_rdatatype_soa, 0, 0, NULL,
-                            dns_fixedname_name(&fixed), &rdataset, NULL);
-       if (callback != NULL) {
-#ifndef ISC_CHECK_NONE
-               atf_tc_fail("dns_db_find did not assert");
-#else
-               atf_tc_pass();
-#endif
+       if (dns_rdataset_isassociated(&rdataset)) {
+               dns_rdataset_disassociate(&rdataset);
        }
-       ATF_REQUIRE_EQ(result, DNS_R_NXDOMAIN);
-
-       close_db();
-
-       dns_test_end();
-}
-ATF_TC(find);
-ATF_TC_HEAD(find, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_find passes with matching db/version");
-}
-ATF_TC_BODY(find, tc) {
-
-       UNUSED(tc);
-
-       find(NULL);
-}
-
-ATF_TC(find_bad);
-ATF_TC_HEAD(find_bad, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_find asserts with mis-matching db/version");
-}
-ATF_TC_BODY(find_bad, tc) {
 
-       UNUSED(tc);
-
-       find(local_callback);
+       dns_rdataset_init(&rdataset);
+       check_assertion(dns_db_find(db1, dns_rootname, v2,
+                                   dns_rdatatype_soa, 0, 0, NULL,
+                                   name, &rdataset, NULL));
 }
 
+/*
+ * Check dns_db_allrdatasets() passes with matching db and version, and
+ * asserts with mis-matching db and version.
+ */
 static void
-allrdatasets(isc_assertioncallback_t callback) {
-       isc_result_t result;
+allrdatasets(void **state) {
+       isc_result_t res;
        dns_dbnode_t *node = NULL;
        dns_rdatasetiter_t *iterator = NULL;
 
-       result = dns_test_begin(NULL, false);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       UNUSED(state);
 
-       setup_db();
+       res = dns_db_findnode(db1, dns_rootname, false, &node);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-       result = dns_db_findnode(db1, dns_rootname, false, &node);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       res = dns_db_allrdatasets(db1, node, v1, 0, &iterator);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-       isc_assertion_setcallback(callback);
-       result = dns_db_allrdatasets(db1, node, VERSION(callback), 0,
-                                    &iterator);
-       if (callback != NULL) {
-#ifndef ISC_CHECK_NONE
-               atf_tc_fail("dns_db_allrdatasets did not assert");
-#else
-               atf_tc_pass();
-#endif
-       }
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       check_assertion(dns_db_allrdatasets(db1, node, v2, 0, &iterator));
 
        dns_rdatasetiter_destroy(&iterator);
-       ATF_REQUIRE_EQ(iterator, NULL);
+       assert_null(iterator);
 
        dns_db_detachnode(db1, &node);
-       ATF_REQUIRE_EQ(node, NULL);
-
-       close_db();
-
-       dns_test_end();
-}
-
-ATF_TC(allrdatasets);
-ATF_TC_HEAD(allrdatasets, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_allrdatasets passes with matching db/version");
-}
-ATF_TC_BODY(allrdatasets, tc) {
-
-       UNUSED(tc);
+       assert_null(node);
 
-       allrdatasets(NULL);
-}
-
-ATF_TC(allrdatasets_bad);
-ATF_TC_HEAD(allrdatasets_bad, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_allrdatasets aborts with mis-matching db/version");
-}
-ATF_TC_BODY(allrdatasets_bad, tc) {
-
-       UNUSED(tc);
 
-       allrdatasets(local_callback);
 }
 
+/*
+ * Check dns_db_findrdataset() passes with matching db and version, and
+ * asserts with mis-matching db and version.
+ */
 static void
-findrdataset(isc_assertioncallback_t callback) {
-       isc_result_t result;
+findrdataset(void **state) {
+       isc_result_t res;
        dns_rdataset_t rdataset;
-       dns_fixedname_t fixed;
        dns_dbnode_t *node = NULL;
 
-       result = dns_test_begin(NULL, false);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       UNUSED(state);
 
-       setup_db();
+       res = dns_db_findnode(db1, dns_rootname, false, &node);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
        dns_rdataset_init(&rdataset);
-       dns_fixedname_init(&fixed);
-
-       result = dns_db_findnode(db1, dns_rootname, false, &node);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       res = dns_db_findrdataset(db1, node, v1, dns_rdatatype_soa,
+                                    0, 0, &rdataset, NULL);
+       assert_int_equal(res, ISC_R_NOTFOUND);
 
-       isc_assertion_setcallback(callback);
-       result = dns_db_findrdataset(db1, node, VERSION(callback),
-                                    dns_rdatatype_soa, 0, 0, &rdataset, NULL);
-       if (callback != NULL) {
-#ifndef ISC_CHECK_NONE
-               atf_tc_fail("dns_db_findrdataset did not assert");
-#else
-               atf_tc_pass();
-#endif
+       if (dns_rdataset_isassociated(&rdataset)) {
+               dns_rdataset_disassociate(&rdataset);
        }
-       ATF_REQUIRE_EQ(result, ISC_R_NOTFOUND);
-
-       dns_db_detachnode(db1, &node);
-       ATF_REQUIRE_EQ(node, NULL);
-
-       close_db();
 
-       dns_test_end();
-}
-
-ATF_TC(findrdataset);
-ATF_TC_HEAD(findrdataset, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_findrdataset passes with matching db/version");
-}
-ATF_TC_BODY(findrdataset, tc) {
-
-       UNUSED(tc);
-
-       findrdataset(NULL);
-}
-
-ATF_TC(findrdataset_bad);
-ATF_TC_HEAD(findrdataset_bad, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_findrdataset aborts with mis-matching db/version");
-}
-ATF_TC_BODY(findrdataset_bad, tc) {
-
-       UNUSED(tc);
+       dns_rdataset_init(&rdataset);
+       check_assertion(dns_db_findrdataset(db1, node, v2,
+                                           dns_rdatatype_soa, 0, 0,
+                                           &rdataset, NULL));
 
-       findrdataset(local_callback);
+       dns_db_detachnode(db1, &node);
+       assert_null(node);
 }
 
+/*
+ * Check dns_db_deleterdataset() passes with matching db and version, and
+ * asserts with mis-matching db and version.
+ */
 static void
-deleterdataset(isc_assertioncallback_t callback) {
-       isc_result_t result;
-       dns_rdataset_t rdataset;
-       dns_fixedname_t fixed;
+deleterdataset(void **state) {
+       isc_result_t res;
        dns_dbnode_t *node = NULL;
 
-       result = dns_test_begin(NULL, false);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       setup_db();
+       UNUSED(state);
 
-       dns_rdataset_init(&rdataset);
-       dns_fixedname_init(&fixed);
-
-       result = dns_db_findnode(db1, dns_rootname, false, &node);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       res = dns_db_findnode(db1, dns_rootname, false, &node);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-       isc_assertion_setcallback(callback);
-       result = dns_db_deleterdataset(db1, node, VERSION(callback),
-                                      dns_rdatatype_soa, 0);
-       if (callback != NULL) {
-#ifndef ISC_CHECK_NONE
-               atf_tc_fail("dns_db_deleterdataset did not assert");
-#else
-               atf_tc_pass();
-#endif
-       }
-       ATF_REQUIRE_EQ(result, DNS_R_UNCHANGED);
+       res = dns_db_deleterdataset(db1, node, v1, dns_rdatatype_soa, 0);
+       assert_int_equal(res, DNS_R_UNCHANGED);
 
+       check_assertion(dns_db_deleterdataset(db1, node, v2,
+                                             dns_rdatatype_soa, 0));
        dns_db_detachnode(db1, &node);
-       ATF_REQUIRE_EQ(node, NULL);
-
-       close_db();
-
-       dns_test_end();
-}
-
-ATF_TC(deleterdataset);
-ATF_TC_HEAD(deleterdataset, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_deleterdataset passes with matching db/version");
-}
-ATF_TC_BODY(deleterdataset, tc) {
-
-       UNUSED(tc);
-
-       deleterdataset(NULL);
-}
-
-ATF_TC(deleterdataset_bad);
-ATF_TC_HEAD(deleterdataset_bad, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_deleterdataset aborts with mis-matching db/version");
-}
-ATF_TC_BODY(deleterdataset_bad, tc) {
-
-       UNUSED(tc);
-
-       deleterdataset(local_callback);
+       assert_null(node);
 }
 
+/*
+ * Check dns_db_subtractrdataset() passes with matching db and version, and
+ * asserts with mis-matching db and version.
+ */
 static void
-subtract(isc_assertioncallback_t callback) {
-       isc_result_t result;
+subtract(void **state) {
+       isc_result_t res;
        dns_rdataset_t rdataset;
-       dns_fixedname_t fixed;
-       dns_dbnode_t *node = NULL;
        dns_rdatalist_t rdatalist;
+       dns_dbnode_t *node = NULL;
 
-       result = dns_test_begin(NULL, false);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       setup_db();
+       UNUSED(state);
 
        dns_rdataset_init(&rdataset);
        dns_rdatalist_init(&rdatalist);
-       dns_fixedname_init(&fixed);
 
        rdatalist.rdclass = dns_rdataclass_in;
 
-       result = dns_rdatalist_tordataset(&rdatalist, &rdataset);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       result = dns_db_findnode(db1, dns_rootname, false, &node);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       isc_assertion_setcallback(callback);
-       result = dns_db_subtractrdataset(db1, node, VERSION(callback),
-                                        &rdataset, 0, NULL);
-       if (callback != NULL) {
-#ifndef ISC_CHECK_NONE
-               atf_tc_fail("dns_db_subtractrdataset did not assert");
-#else
-               atf_tc_pass();
-#endif
-       }
-       ATF_REQUIRE_EQ(result, DNS_R_UNCHANGED);
+       res = dns_rdatalist_tordataset(&rdatalist, &rdataset);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-       dns_db_detachnode(db1, &node);
-       ATF_REQUIRE_EQ(node, NULL);
+       res = dns_db_findnode(db1, dns_rootname, false, &node);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-       close_db();
+       res = dns_db_subtractrdataset(db1, node, v1, &rdataset, 0, NULL);
+       assert_int_equal(res, DNS_R_UNCHANGED);
 
-       dns_test_end();
-}
-
-ATF_TC(subtractrdataset);
-ATF_TC_HEAD(subtractrdataset, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_subtractrdataset passes with matching db/version");
-}
-ATF_TC_BODY(subtractrdataset, tc) {
-
-       UNUSED(tc);
-
-       subtract(NULL);
-}
+       if (dns_rdataset_isassociated(&rdataset)) {
+               dns_rdataset_disassociate(&rdataset);
+       }
 
-ATF_TC(subtractrdataset_bad);
-ATF_TC_HEAD(subtractrdataset_bad, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_subtractrdataset aborts with mis-matching db/version");
-}
-ATF_TC_BODY(subtractrdataset_bad, tc) {
+       dns_rdataset_init(&rdataset);
+       res = dns_rdatalist_tordataset(&rdatalist, &rdataset);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-       UNUSED(tc);
+       check_assertion(dns_db_subtractrdataset(db1, node, v2,
+                                               &rdataset, 0, NULL));
 
-       subtract(local_callback);
+       dns_db_detachnode(db1, &node);
+       assert_null(node);
 }
 
+/*
+ * Check dns_db_dump() passes with matching db and version, and
+ * asserts with mis-matching db and version.
+ */
 static void
-dump(isc_assertioncallback_t callback) {
-       isc_result_t result;
+dump(void **state) {
+       isc_result_t res;
        FILE *f = NULL;
 
-       result = dns_test_begin(NULL, false);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       setup_db();
+       UNUSED(state);
 
-       result = isc_file_openunique(tempname, &f);
+       res = isc_file_openunique(tempname, &f);
        fclose(f);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-       isc_assertion_setcallback(callback);
-       result = dns_db_dump(db1, VERSION(callback), tempname);
-       (void)unlink(tempname);
-       if (callback != NULL) {
-#ifndef ISC_CHECK_NONE
-               atf_tc_fail("dns_db_dump did not assert");
-#else
-               atf_tc_pass();
-#endif
-       }
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       close_db();
-
-       dns_test_end();
-}
+       res = dns_db_dump(db1, v1, tempname);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-ATF_TC(dump);
-ATF_TC_HEAD(dump, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_dump passes with matching db/version");
-}
-ATF_TC_BODY(dump, tc) {
-
-       UNUSED(tc);
-
-       dump(NULL);
-}
-
-ATF_TC(dump_bad);
-ATF_TC_HEAD(dump_bad, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_dump aborts with mis-matching db/version");
-}
-ATF_TC_BODY(dump_bad, tc) {
-
-       UNUSED(tc);
-
-       dump(local_callback);
+       check_assertion(dns_db_dump(db1, v2, tempname));
 }
 
+/*
+ * Check dns_db_addrdataset() passes with matching db and version, and
+ * asserts with mis-matching db and version.
+ */
 static void
-addrdataset(isc_assertioncallback_t callback) {
-       isc_result_t result;
+addrdataset(void **state) {
+       isc_result_t res;
        dns_rdataset_t rdataset;
-       dns_fixedname_t fixed;
        dns_dbnode_t *node = NULL;
        dns_rdatalist_t rdatalist;
 
-       result = dns_test_begin(NULL, false);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       setup_db();
+       UNUSED(state);
 
        dns_rdataset_init(&rdataset);
        dns_rdatalist_init(&rdatalist);
-       dns_fixedname_init(&fixed);
 
        rdatalist.rdclass = dns_rdataclass_in;
 
-       result = dns_rdatalist_tordataset(&rdatalist, &rdataset);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       result = dns_db_findnode(db1, dns_rootname, false, &node);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       isc_assertion_setcallback(callback);
-       result = dns_db_addrdataset(db1, node, VERSION(callback), 0, &rdataset,
-                                   0, NULL);
-       if (callback != NULL) {
-#ifndef ISC_CHECK_NONE
-               atf_tc_fail("dns_db_adddataset did not assert");
-#else
-               atf_tc_pass();
-#endif
-       }
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       dns_db_detachnode(db1, &node);
-       ATF_REQUIRE_EQ(node, NULL);
-
-       close_db();
+       res = dns_rdatalist_tordataset(&rdatalist, &rdataset);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-       dns_test_end();
-}
+       res = dns_db_findnode(db1, dns_rootname, false, &node);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-ATF_TC(addrdataset);
-ATF_TC_HEAD(addrdataset, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_addrdataset passes with matching db/version");
-}
-ATF_TC_BODY(addrdataset, tc) {
+       res = dns_db_addrdataset(db1, node, v1, 0, &rdataset, 0, NULL);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-       UNUSED(tc);
+       check_assertion(dns_db_addrdataset(db1, node, v2,
+                                          0, &rdataset, 0, NULL));
 
-       addrdataset(NULL);
-}
-
-ATF_TC(addrdataset_bad);
-ATF_TC_HEAD(addrdataset_bad, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_addrdataset aborts with mis-matching db/version");
-}
-ATF_TC_BODY(addrdataset_bad, tc) {
-
-       UNUSED(tc);
-
-       addrdataset(local_callback);
+       dns_db_detachnode(db1, &node);
+       assert_null(node);
 }
 
+/*
+ * Check dns_db_getnsec3parameters() passes with matching db and version,
+ * and asserts with mis-matching db and version.
+ */
 static void
-getnsec3parameters(isc_assertioncallback_t callback) {
-       isc_result_t result;
+getnsec3parameters(void **state) {
+       isc_result_t res;
        dns_hash_t hash;
        uint8_t flags;
        uint16_t iterations;
        unsigned char salt[DNS_NSEC3_SALTSIZE];
        size_t salt_length = sizeof(salt);
 
-       result = dns_test_begin(NULL, false);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       setup_db();
+       UNUSED(state);
 
-       isc_assertion_setcallback(callback);
-       result = dns_db_getnsec3parameters(db1, VERSION(callback), &hash,
-                                          &flags, &iterations, salt,
+       res = dns_db_getnsec3parameters(db1, v1, &hash,
+                                       &flags, &iterations, salt,
                                           &salt_length);
-       if (callback != NULL) {
-#ifndef ISC_CHECK_NONE
-               atf_tc_fail("dns_db_dump did not assert");
-#else
-               atf_tc_pass();
-#endif
-       }
-       ATF_REQUIRE_EQ(result, ISC_R_NOTFOUND);
-
-       close_db();
-
-       dns_test_end();
-}
-
-ATF_TC(getnsec3parameters);
-ATF_TC_HEAD(getnsec3parameters, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_getnsec3parameters passes with matching db/version");
-}
-ATF_TC_BODY(getnsec3parameters, tc) {
-
-       UNUSED(tc);
-
-       getnsec3parameters(NULL);
-}
-
-ATF_TC(getnsec3parameters_bad);
-ATF_TC_HEAD(getnsec3parameters_bad, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_db_getnsec3parameters aborts with mis-matching db/version");
-}
-ATF_TC_BODY(getnsec3parameters_bad, tc) {
+       assert_int_equal(res, ISC_R_NOTFOUND);
 
-       UNUSED(tc);
-
-       getnsec3parameters(local_callback);
+       check_assertion(dns_db_getnsec3parameters(db1, v2, &hash,
+                                                 &flags, &iterations,
+                                                 salt, &salt_length));
 }
 
+/*
+ * Check dns_db_resigned() passes with matching db and version, and
+ * asserts with mis-matching db and version.
+ */
 static void
-resigned(isc_assertioncallback_t callback) {
-       isc_result_t result;
+resigned(void **state) {
+       isc_result_t res;
        dns_rdataset_t rdataset, added;
        dns_dbnode_t *node = NULL;
        dns_rdatalist_t rdatalist;
@@ -670,10 +421,7 @@ resigned(isc_assertioncallback_t callback) {
        isc_buffer_t b;
        unsigned char buf[1024];
 
-       result = dns_test_begin(NULL, false);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
-
-       setup_db();
+       UNUSED(state);
 
        /*
         * Create a dummy RRSIG record and set a resigning time.
@@ -696,93 +444,72 @@ resigned(isc_assertioncallback_t callback) {
        rrsig.siglen = 0;
        rrsig.signature = NULL;
 
-       result = dns_rdata_fromstruct(&rdata, dns_rdataclass_in,
-                                     dns_rdatatype_rrsig, &rrsig, &b);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       res = dns_rdata_fromstruct(&rdata, dns_rdataclass_in,
+                                  dns_rdatatype_rrsig, &rrsig, &b);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
        rdatalist.rdclass = dns_rdataclass_in;
        rdatalist.type = dns_rdatatype_rrsig;
        ISC_LIST_APPEND(rdatalist.rdata, &rdata, link);
 
-       result = dns_rdatalist_tordataset(&rdatalist, &rdataset);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       res = dns_rdatalist_tordataset(&rdatalist, &rdataset);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
        rdataset.attributes |= DNS_RDATASETATTR_RESIGN;
        rdataset.resign = 7200;
 
-       result = dns_db_findnode(db1, dns_rootname, false, &node);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       res = dns_db_findnode(db1, dns_rootname, false, &node);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
-       result = dns_db_addrdataset(db1, node, v1, 0, &rdataset, 0, &added);
-       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+       res = dns_db_addrdataset(db1, node, v1, 0, &rdataset, 0, &added);
+       assert_int_equal(res, ISC_R_SUCCESS);
 
        dns_db_detachnode(db1, &node);
-       ATF_REQUIRE_EQ(node, NULL);
+       assert_null(node);
 
-       isc_assertion_setcallback(callback);
-       dns_db_resigned(db1, &added, VERSION(callback));
-       if (callback != NULL) {
-#ifndef ISC_CHECK_NONE
-               atf_tc_fail("dns_db_resigned did not assert");
-#else
-               atf_tc_pass();
-#endif
-       }
-       dns_rdataset_disassociate(&added);
-
-       close_db();
-
-       dns_test_end();
-}
-
-ATF_TC(resigned);
-ATF_TC_HEAD(resigned, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_rdataset_resigned passes with matching db/version");
-}
-ATF_TC_BODY(resigned, tc) {
+       check_assertion(dns_db_resigned(db1, &added, v2));
 
-       UNUSED(tc);
+       dns_db_resigned(db1, &added, v1);
 
-       resigned(NULL);
-}
-
-ATF_TC(resigned_bad);
-ATF_TC_HEAD(resigned_bad, tc) {
-  atf_tc_set_md_var(tc, "descr", "check dns_rdataset_resigned aborts with mis-matching db/version");
+       dns_rdataset_disassociate(&added);
 }
-ATF_TC_BODY(resigned_bad, tc) {
 
-       UNUSED(tc);
-
-       resigned(local_callback);
+int
+main(void) {
+       const struct CMUnitTest tests[] = {
+               cmocka_unit_test_setup_teardown(dump, _setup, _teardown),
+               cmocka_unit_test_setup_teardown(find, _setup, _teardown),
+               cmocka_unit_test_setup_teardown(allrdatasets,
+                                               _setup, _teardown),
+               cmocka_unit_test_setup_teardown(findrdataset,
+                                               _setup, _teardown),
+               cmocka_unit_test_setup_teardown(deleterdataset,
+                                               _setup, _teardown),
+               cmocka_unit_test_setup_teardown(subtract,
+                                               _setup, _teardown),
+               cmocka_unit_test_setup_teardown(addrdataset,
+                                               _setup, _teardown),
+               cmocka_unit_test_setup_teardown(getnsec3parameters,
+                                               _setup, _teardown),
+               cmocka_unit_test_setup_teardown(resigned,
+                                               _setup, _teardown),
+               cmocka_unit_test_setup_teardown(attachversion,
+                                               _setup, _teardown),
+               cmocka_unit_test_setup_teardown(closeversion,
+                                               _setup, _teardown),
+       };
+
+       return (cmocka_run_group_tests(tests, NULL, NULL));
+}
+
+#else /* HAVE_CMOCKA */
+
+#include <stdio.h>
+
+int
+main(void) {
+       printf("1..0 # Skipped: cmocka not available\n");
+       return (0);
 }
 
-/*
- * Main
- */
-ATF_TP_ADD_TCS(tp) {
-       ATF_TP_ADD_TC(tp, dump);
-       ATF_TP_ADD_TC(tp, dump_bad);
-       ATF_TP_ADD_TC(tp, find);
-       ATF_TP_ADD_TC(tp, find_bad);
-       ATF_TP_ADD_TC(tp, allrdatasets);
-       ATF_TP_ADD_TC(tp, allrdatasets_bad);
-       ATF_TP_ADD_TC(tp, findrdataset);
-       ATF_TP_ADD_TC(tp, findrdataset_bad);
-       ATF_TP_ADD_TC(tp, addrdataset);
-       ATF_TP_ADD_TC(tp, addrdataset_bad);
-       ATF_TP_ADD_TC(tp, deleterdataset);
-       ATF_TP_ADD_TC(tp, deleterdataset_bad);
-       ATF_TP_ADD_TC(tp, subtractrdataset);
-       ATF_TP_ADD_TC(tp, subtractrdataset_bad);
-       ATF_TP_ADD_TC(tp, attachversion);
-       ATF_TP_ADD_TC(tp, attachversion_bad);
-       ATF_TP_ADD_TC(tp, closeversion);
-       ATF_TP_ADD_TC(tp, closeversion_bad);
-       ATF_TP_ADD_TC(tp, getnsec3parameters);
-       ATF_TP_ADD_TC(tp, getnsec3parameters_bad);
-       ATF_TP_ADD_TC(tp, resigned);
-       ATF_TP_ADD_TC(tp, resigned_bad);
-
-       return (atf_no_error());
-}
+#endif