📄 t_db.c
字号:
/* * Copyright (C) 2004 Internet Systems Consortium, Inc. ("ISC") * Copyright (C) 1999-2001 Internet Software Consortium. * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * PERFORMANCE OF THIS SOFTWARE. *//* $Id: t_db.c,v 1.29.206.3 2004/10/25 01:36:06 marka Exp $ */#include <config.h>#include <ctype.h>#include <stdlib.h>#include <isc/entropy.h>#include <isc/hash.h>#include <isc/mem.h>#include <isc/string.h>#include <isc/util.h>#include <dns/db.h>#include <dns/fixedname.h>#include <dns/rdata.h>#include <dns/rdataclass.h>#include <dns/rdatatype.h>#include <dns/rdatalist.h>#include <dns/rdataset.h>#include <dns/result.h>#include <tests/t_api.h>static isc_result_tt_create(const char *db_type, const char *origin, const char *class, const char *model, isc_mem_t *mctx, dns_db_t **db){ int len; isc_result_t dns_result; dns_dbtype_t dbtype; isc_textregion_t region; isc_buffer_t origin_buffer; dns_fixedname_t dns_origin; dns_rdataclass_t rdataclass; dbtype = dns_dbtype_zone; if (strcasecmp(model, "cache") == 0) dbtype = dns_dbtype_cache; dns_fixedname_init(&dns_origin); len = strlen(origin); isc_buffer_init(&origin_buffer, origin, len); isc_buffer_add(&origin_buffer, len); dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin), &origin_buffer, NULL, ISC_FALSE, NULL); if (dns_result != ISC_R_SUCCESS) { t_info("dns_name_fromtext failed %s\n", dns_result_totext(dns_result)); return(dns_result); } DE_CONST(class, region.base); region.length = strlen(class); dns_result = dns_rdataclass_fromtext(&rdataclass, ®ion); if (dns_result != ISC_R_SUCCESS) { t_info("dns_rdataclass_fromtext failed %s\n", dns_result_totext(dns_result)); return(dns_result); } dns_result = dns_db_create(mctx, db_type, dns_fixedname_name(&dns_origin), dbtype, rdataclass, 0, NULL, db); if (dns_result != ISC_R_SUCCESS) t_info("dns_db_create failed %s\n", dns_result_totext(dns_result)); return(dns_result);}static intt_dns_db_load(char **av) { char *filename; char *db_type; char *origin; char *model; char *class; char *expected_load_result; char *findname; char *find_type; char *expected_find_result; int result; int len; dns_db_t *db; isc_result_t dns_result; isc_result_t isc_result; isc_mem_t *mctx; isc_entropy_t *ectx; dns_dbnode_t *nodep; isc_textregion_t textregion; isc_buffer_t findname_buffer; dns_fixedname_t dns_findname; dns_fixedname_t dns_foundname; dns_rdataset_t rdataset; dns_rdatatype_t rdatatype; dns_dbversion_t *versionp; isc_result_t exp_load_result; isc_result_t exp_find_result; result = T_UNRESOLVED; db = NULL; mctx = NULL; ectx = NULL; filename = T_ARG(0); db_type = T_ARG(1); origin = T_ARG(2); model = T_ARG(3); class = T_ARG(4); expected_load_result = T_ARG(5); findname = T_ARG(6); find_type = T_ARG(7); expected_find_result = T_ARG(8); t_info("testing using file %s and name %s\n", filename, findname); exp_load_result = t_dns_result_fromtext(expected_load_result); exp_find_result = t_dns_result_fromtext(expected_find_result); isc_result = isc_mem_create(0, 0, &mctx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %s\n", isc_result_totext(isc_result)); return(T_UNRESOLVED); } isc_result = isc_entropy_create(mctx, &ectx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_entropy_create failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); if (isc_result != ISC_R_SUCCESS) { t_info("isc_hash_create failed %s\n", isc_result_totext(isc_result)); isc_entropy_detach(&ectx); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } dns_result = t_create(db_type, origin, class, model, mctx, &db); if (dns_result != ISC_R_SUCCESS) { isc_hash_destroy(); isc_entropy_detach(&ectx); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } dns_result = dns_db_load(db, filename); if (dns_result != exp_load_result) { t_info("dns_db_load returned %s, expected %s\n", dns_result_totext(dns_result), dns_result_totext(exp_load_result)); dns_db_detach(&db); isc_hash_destroy(); isc_entropy_detach(&ectx); isc_mem_destroy(&mctx); return(T_FAIL); } if (dns_result != ISC_R_SUCCESS) { result = T_PASS; goto cleanup_db; } dns_fixedname_init(&dns_findname); len = strlen(findname); isc_buffer_init(&findname_buffer, findname, len); isc_buffer_add(&findname_buffer, len); dns_result = dns_name_fromtext(dns_fixedname_name(&dns_findname), &findname_buffer, NULL, ISC_FALSE, NULL); if (dns_result != ISC_R_SUCCESS) { t_info("dns_name_fromtext failed %s\n", dns_result_totext(dns_result)); dns_db_detach(&db); isc_hash_destroy(); isc_entropy_detach(&ectx); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } textregion.base = find_type; textregion.length = strlen(find_type); dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion); if (dns_result != ISC_R_SUCCESS) { t_info("dns_rdatatype_fromtext %s failed %s\n", find_type, dns_result_totext(dns_result)); dns_db_detach(&db); isc_hash_destroy(); isc_entropy_detach(&ectx); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } versionp = NULL; dns_fixedname_init(&dns_foundname); dns_rdataset_init(&rdataset); if (dns_db_iszone(db)) dns_db_currentversion(db, &versionp); nodep = NULL; dns_result = dns_db_find(db, dns_fixedname_name(&dns_findname), versionp, rdatatype, DNS_DBFIND_GLUEOK, 0, &nodep, dns_fixedname_name(&dns_foundname), &rdataset, NULL); if (dns_result != exp_find_result) { t_info("dns_db_find returned %s, expected %s\n", dns_result_totext(dns_result), dns_result_totext(exp_find_result)); result = T_FAIL; } else { result = T_PASS; } if (dns_result != ISC_R_NOTFOUND) { dns_db_detachnode(db, &nodep); if (dns_rdataset_isassociated(&rdataset)) dns_rdataset_disassociate(&rdataset); } if (dns_db_iszone(db)) dns_db_closeversion(db, &versionp, ISC_FALSE); cleanup_db: dns_db_detach(&db); isc_hash_destroy(); isc_entropy_detach(&ectx); isc_mem_destroy(&mctx); return(result);}static const char *a1 = "A call to dns_db_load(db, filename) loads the contents of " "the database in filename into db.";static voidt1(void) { int result; t_assert("dns_db_load", 1, T_REQUIRED, a1); result = t_eval("dns_db_load_data", t_dns_db_load, 9); t_result(result);}static const char *a2 = "When the database db has cache semantics, a call to " "dns_db_iscache(db) returns ISC_TRUE.";static intt_dns_db_zc_x(char *filename, char *db_type, char *origin, char *class, dns_dbtype_t dbtype, isc_boolean_t(*cf)(dns_db_t *), isc_boolean_t exp_result){ int result; int len; dns_db_t *db; isc_result_t dns_result; isc_result_t isc_result; isc_mem_t *mctx; isc_entropy_t *ectx; dns_rdataclass_t rdataclass; isc_textregion_t textregion; isc_buffer_t origin_buffer; dns_fixedname_t dns_origin; result = T_UNRESOLVED; db = NULL; mctx = NULL; ectx = NULL; t_info("testing using file %s\n", filename); dns_fixedname_init(&dns_origin); len = strlen(origin); isc_buffer_init(&origin_buffer, origin, len); isc_buffer_add(&origin_buffer, len); dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin), &origin_buffer, NULL, ISC_FALSE, NULL); if (dns_result != ISC_R_SUCCESS) { t_info("dns_name_fromtext failed %s\n", dns_result_totext(dns_result)); return(T_UNRESOLVED); } textregion.base = class; textregion.length = strlen(class); dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion); if (dns_result != ISC_R_SUCCESS) { t_info("dns_rdataclass_fromtext failed %s\n", dns_result_totext(dns_result)); return(T_UNRESOLVED); } isc_result = isc_mem_create(0, 0, &mctx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %s\n", isc_result_totext(isc_result)); return(T_UNRESOLVED); } isc_result = isc_entropy_create(mctx, &ectx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_entropy_create failed %s\n", isc_result_totext(isc_result)); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE); if (isc_result != ISC_R_SUCCESS) { t_info("isc_hash_create failed %s\n", isc_result_totext(isc_result)); isc_entropy_detach(&ectx); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } dns_result = dns_db_create(mctx, db_type, dns_fixedname_name(&dns_origin), dbtype, rdataclass, 0, NULL, &db); if (dns_result != ISC_R_SUCCESS) { t_info("dns_db_create failed %s\n", dns_result_totext(dns_result)); isc_hash_destroy(); isc_entropy_detach(&ectx); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } dns_result = dns_db_load(db, filename); if (dns_result == ISC_R_SUCCESS) { if ((*cf)(db) == exp_result) result = T_PASS; else result = T_FAIL; } else { t_info("dns_db_load failed %s\n", dns_result_totext(dns_result)); result = T_FAIL; } dns_db_detach(&db); isc_hash_destroy(); isc_entropy_detach(&ectx); isc_mem_destroy(&mctx); return(result);}static inttest_dns_db_zc_x(const char *filename, dns_dbtype_t dbtype, isc_boolean_t(*cf)(dns_db_t *), isc_boolean_t exp_result){ FILE *fp; char *p; int line; int cnt; int result; int nfails; int nprobs; char *tokens[T_MAXTOKS]; nfails = 0; nprobs = 0; fp = fopen(filename, "r"); if (fp != NULL) { line = 0; while ((p = t_fgetbs(fp)) != NULL) { ++line; /* * Skip comment lines. */ if ((isspace((unsigned char)*p)) || (*p == '#')) continue; cnt = t_bustline(p, tokens); if (cnt == 4) { result = t_dns_db_zc_x(tokens[0], /* file */ tokens[1], /* type */ tokens[2], /* origin */ tokens[3], /* class */ dbtype, /* cache */ cf, /* check func */ exp_result);/* expect */ if (result != T_PASS) { if (result == T_FAIL) ++nfails; else ++nprobs; } } else { t_info("bad format in %s at line %d\n", filename, line); ++nprobs; } (void)free(p); } (void)fclose(fp); } else { t_info("Missing datafile %s\n", filename); ++nprobs; } result = T_UNRESOLVED; if (nfails == 0 && nprobs == 0) result = T_PASS; else if (nfails) result = T_FAIL; return(result);}static voidt2(void) { int result; t_assert("dns_db_iscache", 2, T_REQUIRED, a2); result = test_dns_db_zc_x("dns_db_iscache_1_data", dns_dbtype_cache, dns_db_iscache, ISC_TRUE); t_result(result);}static const char *a3 = "When the database db has zone semantics, a call to " "dns_db_iscache(db) returns ISC_FALSE.";static voidt3(void) { int result; t_assert("dns_db_iscache", 3, T_REQUIRED, a3); result = test_dns_db_zc_x("dns_db_iscache_2_data", dns_dbtype_zone, dns_db_iscache, ISC_FALSE); t_result(result);}static const char *a4 = "When the database db has zone semantics, a call to " "dns_db_iszone(db) returns ISC_TRUE.";static voidt4(void) { int result; t_assert("dns_db_iszone", 4, T_REQUIRED, a4); result = test_dns_db_zc_x("dns_db_iszone_1_data", dns_dbtype_zone, dns_db_iszone, ISC_TRUE); t_result(result);}static const char *a5 = "When the database db has cache semantics, a call to " "dns_db_iszone(db) returns ISC_FALSE.";static voidt5(void) { int result; t_assert("dns_db_iszone", 5, T_REQUIRED, a5); result = test_dns_db_zc_x("dns_db_iszone_2_data", dns_dbtype_cache, dns_db_iszone, ISC_FALSE); t_result(result);}static intt_dns_db_origin(char **av) { char *filename; char *origin; int result; int len; int order; isc_result_t dns_result; isc_result_t isc_result; isc_mem_t *mctx; isc_entropy_t *ectx; dns_db_t *db;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -