2 * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 1999-2001 Internet Software Consortium.
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15 * PERFORMANCE OF THIS SOFTWARE.
18 /* $Id: t_db.c,v 1.39 2009/09/01 00:22:25 jinmei Exp $ */
25 #include <isc/entropy.h>
28 #include <isc/string.h>
32 #include <dns/fixedname.h>
33 #include <dns/rdata.h>
34 #include <dns/rdataclass.h>
35 #include <dns/rdatatype.h>
36 #include <dns/rdatalist.h>
37 #include <dns/rdataset.h>
38 #include <dns/result.h>
40 #include <tests/t_api.h>
43 t_create(const char *db_type, const char *origin, const char *class,
44 const char *model, isc_mem_t *mctx, dns_db_t **db)
47 isc_result_t dns_result;
49 isc_textregion_t region;
50 isc_buffer_t origin_buffer;
51 dns_fixedname_t dns_origin;
52 dns_rdataclass_t rdataclass;
55 dbtype = dns_dbtype_zone;
56 if (strcasecmp(model, "cache") == 0)
57 dbtype = dns_dbtype_cache;
59 dns_fixedname_init(&dns_origin);
61 isc_buffer_init(&origin_buffer, origin, len);
62 isc_buffer_add(&origin_buffer, len);
63 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin),
64 &origin_buffer, NULL, 0, NULL);
65 if (dns_result != ISC_R_SUCCESS) {
66 t_info("dns_name_fromtext failed %s\n",
67 dns_result_totext(dns_result));
71 DE_CONST(class, region.base);
72 region.length = strlen(class);
73 dns_result = dns_rdataclass_fromtext(&rdataclass, ®ion);
74 if (dns_result != ISC_R_SUCCESS) {
75 t_info("dns_rdataclass_fromtext failed %s\n",
76 dns_result_totext(dns_result));
80 dns_result = dns_db_create(mctx, db_type,
81 dns_fixedname_name(&dns_origin),
82 dbtype, rdataclass, 0, NULL, db);
83 if (dns_result != ISC_R_SUCCESS)
84 t_info("dns_db_create failed %s\n",
85 dns_result_totext(dns_result));
92 t_dns_db_load(char **av) {
98 char *expected_load_result;
101 char *expected_find_result;
106 isc_result_t dns_result;
107 isc_result_t isc_result;
111 isc_textregion_t textregion;
112 isc_buffer_t findname_buffer;
113 dns_fixedname_t dns_findname;
114 dns_fixedname_t dns_foundname;
115 dns_rdataset_t rdataset;
116 dns_rdatatype_t rdatatype;
117 dns_dbversion_t *versionp;
118 isc_result_t exp_load_result;
119 isc_result_t exp_find_result;
121 result = T_UNRESOLVED;
130 expected_load_result = T_ARG(5);
132 find_type = T_ARG(7);
133 expected_find_result = T_ARG(8);
135 t_info("testing using file %s and name %s\n", filename, findname);
137 exp_load_result = t_dns_result_fromtext(expected_load_result);
138 exp_find_result = t_dns_result_fromtext(expected_find_result);
140 isc_result = isc_mem_create(0, 0, &mctx);
141 if (isc_result != ISC_R_SUCCESS) {
142 t_info("isc_mem_create failed %s\n",
143 isc_result_totext(isc_result));
144 return(T_UNRESOLVED);
147 isc_result = isc_entropy_create(mctx, &ectx);
148 if (isc_result != ISC_R_SUCCESS) {
149 t_info("isc_entropy_create failed %s\n",
150 isc_result_totext(isc_result));
151 isc_mem_destroy(&mctx);
152 return(T_UNRESOLVED);
155 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
156 if (isc_result != ISC_R_SUCCESS) {
157 t_info("isc_hash_create failed %s\n",
158 isc_result_totext(isc_result));
159 isc_entropy_detach(&ectx);
160 isc_mem_destroy(&mctx);
161 return(T_UNRESOLVED);
164 dns_result = t_create(db_type, origin, class, model, mctx, &db);
165 if (dns_result != ISC_R_SUCCESS) {
167 isc_entropy_detach(&ectx);
168 isc_mem_destroy(&mctx);
169 return(T_UNRESOLVED);
172 dns_result = dns_db_load(db, filename);
173 if (dns_result != exp_load_result) {
174 t_info("dns_db_load returned %s, expected %s\n",
175 dns_result_totext(dns_result),
176 dns_result_totext(exp_load_result));
179 isc_entropy_detach(&ectx);
180 isc_mem_destroy(&mctx);
183 if (dns_result != ISC_R_SUCCESS) {
188 dns_fixedname_init(&dns_findname);
189 len = strlen(findname);
190 isc_buffer_init(&findname_buffer, findname, len);
191 isc_buffer_add(&findname_buffer, len);
192 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_findname),
193 &findname_buffer, NULL, 0, NULL);
194 if (dns_result != ISC_R_SUCCESS) {
195 t_info("dns_name_fromtext failed %s\n",
196 dns_result_totext(dns_result));
199 isc_entropy_detach(&ectx);
200 isc_mem_destroy(&mctx);
201 return(T_UNRESOLVED);
204 textregion.base = find_type;
205 textregion.length = strlen(find_type);
206 dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
207 if (dns_result != ISC_R_SUCCESS) {
208 t_info("dns_rdatatype_fromtext %s failed %s\n",
210 dns_result_totext(dns_result));
213 isc_entropy_detach(&ectx);
214 isc_mem_destroy(&mctx);
215 return(T_UNRESOLVED);
219 dns_fixedname_init(&dns_foundname);
220 dns_rdataset_init(&rdataset);
221 if (dns_db_iszone(db))
222 dns_db_currentversion(db, &versionp);
225 dns_result = dns_db_find(db,
226 dns_fixedname_name(&dns_findname),
232 dns_fixedname_name(&dns_foundname),
235 if (dns_result != exp_find_result) {
236 t_info("dns_db_find returned %s, expected %s\n",
237 dns_result_totext(dns_result),
238 dns_result_totext(exp_find_result));
244 if (dns_result != ISC_R_NOTFOUND) {
245 dns_db_detachnode(db, &nodep);
246 if (dns_rdataset_isassociated(&rdataset))
247 dns_rdataset_disassociate(&rdataset);
250 if (dns_db_iszone(db))
251 dns_db_closeversion(db, &versionp, ISC_FALSE);
255 isc_entropy_detach(&ectx);
256 isc_mem_destroy(&mctx);
260 static const char *a1 =
261 "A call to dns_db_load(db, filename) loads the contents of "
262 "the database in filename into db.";
268 t_assert("dns_db_load", 1, T_REQUIRED, "%s", a1);
269 result = t_eval("dns_db_load_data", t_dns_db_load, 9);
274 static const char *a2 =
275 "When the database db has cache semantics, a call to "
276 "dns_db_iscache(db) returns ISC_TRUE.";
279 t_dns_db_zc_x(char *filename, char *db_type, char *origin, char *class,
280 dns_dbtype_t dbtype, isc_boolean_t(*cf)(dns_db_t *),
281 isc_boolean_t exp_result)
286 isc_result_t dns_result;
287 isc_result_t isc_result;
290 dns_rdataclass_t rdataclass;
291 isc_textregion_t textregion;
292 isc_buffer_t origin_buffer;
293 dns_fixedname_t dns_origin;
295 result = T_UNRESOLVED;
301 t_info("testing using file %s\n", filename);
303 dns_fixedname_init(&dns_origin);
304 len = strlen(origin);
305 isc_buffer_init(&origin_buffer, origin, len);
306 isc_buffer_add(&origin_buffer, len);
307 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin),
308 &origin_buffer, NULL, 0, NULL);
309 if (dns_result != ISC_R_SUCCESS) {
310 t_info("dns_name_fromtext failed %s\n",
311 dns_result_totext(dns_result));
312 return(T_UNRESOLVED);
315 textregion.base = class;
316 textregion.length = strlen(class);
317 dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
318 if (dns_result != ISC_R_SUCCESS) {
319 t_info("dns_rdataclass_fromtext failed %s\n",
320 dns_result_totext(dns_result));
321 return(T_UNRESOLVED);
324 isc_result = isc_mem_create(0, 0, &mctx);
325 if (isc_result != ISC_R_SUCCESS) {
326 t_info("isc_mem_create failed %s\n",
327 isc_result_totext(isc_result));
328 return(T_UNRESOLVED);
331 isc_result = isc_entropy_create(mctx, &ectx);
332 if (isc_result != ISC_R_SUCCESS) {
333 t_info("isc_entropy_create failed %s\n",
334 isc_result_totext(isc_result));
335 isc_mem_destroy(&mctx);
336 return(T_UNRESOLVED);
339 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
340 if (isc_result != ISC_R_SUCCESS) {
341 t_info("isc_hash_create failed %s\n",
342 isc_result_totext(isc_result));
343 isc_entropy_detach(&ectx);
344 isc_mem_destroy(&mctx);
345 return(T_UNRESOLVED);
348 dns_result = dns_db_create(mctx, db_type,
349 dns_fixedname_name(&dns_origin),
350 dbtype, rdataclass, 0, NULL, &db);
351 if (dns_result != ISC_R_SUCCESS) {
352 t_info("dns_db_create failed %s\n",
353 dns_result_totext(dns_result));
355 isc_entropy_detach(&ectx);
356 isc_mem_destroy(&mctx);
357 return(T_UNRESOLVED);
360 dns_result = dns_db_load(db, filename);
361 if (dns_result == ISC_R_SUCCESS) {
362 if ((*cf)(db) == exp_result)
367 t_info("dns_db_load failed %s\n",
368 dns_result_totext(dns_result));
374 isc_entropy_detach(&ectx);
375 isc_mem_destroy(&mctx);
380 test_dns_db_zc_x(const char *filename, dns_dbtype_t dbtype,
381 isc_boolean_t(*cf)(dns_db_t *), isc_boolean_t exp_result)
391 char *tokens[T_MAXTOKS];
396 fp = fopen(filename, "r");
399 while ((p = t_fgetbs(fp)) != NULL) {
404 * Skip comment lines.
406 if ((isspace((unsigned char)*p)) || (*p == '#')) {
411 cnt = t_bustline(p, tokens);
413 result = t_dns_db_zc_x(tokens[0], /* file */
414 tokens[1], /* type */
415 tokens[2], /* origin */
416 tokens[3], /* class */
419 exp_result);/* expect */
420 if (result != T_PASS) {
421 if (result == T_FAIL)
427 t_info("bad format in %s at line %d\n",
436 t_info("Missing datafile %s\n", filename);
440 result = T_UNRESOLVED;
442 if (nfails == 0 && nprobs == 0)
454 t_assert("dns_db_iscache", 2, T_REQUIRED, "%s", a2);
455 result = test_dns_db_zc_x("dns_db_iscache_1_data",
456 dns_dbtype_cache, dns_db_iscache, ISC_TRUE);
461 static const char *a3 =
462 "When the database db has zone semantics, a call to "
463 "dns_db_iscache(db) returns ISC_FALSE.";
470 t_assert("dns_db_iscache", 3, T_REQUIRED, "%s", a3);
471 result = test_dns_db_zc_x("dns_db_iscache_2_data",
472 dns_dbtype_zone, dns_db_iscache, ISC_FALSE);
477 static const char *a4 =
478 "When the database db has zone semantics, a call to "
479 "dns_db_iszone(db) returns ISC_TRUE.";
486 t_assert("dns_db_iszone", 4, T_REQUIRED, "%s", a4);
487 result = test_dns_db_zc_x("dns_db_iszone_1_data",
488 dns_dbtype_zone, dns_db_iszone, ISC_TRUE);
493 static const char *a5 =
494 "When the database db has cache semantics, a call to "
495 "dns_db_iszone(db) returns ISC_FALSE.";
501 t_assert("dns_db_iszone", 5, T_REQUIRED, "%s", a5);
502 result = test_dns_db_zc_x("dns_db_iszone_2_data",
503 dns_dbtype_cache, dns_db_iszone, ISC_FALSE);
508 t_dns_db_origin(char **av) {
516 isc_result_t dns_result;
517 isc_result_t isc_result;
521 dns_fixedname_t dns_origin;
522 dns_fixedname_t dns_dborigin;
523 isc_buffer_t origin_buffer;
532 t_info("testing with database %s and origin %s\n",
535 isc_result = isc_mem_create(0, 0, &mctx);
536 if (isc_result != ISC_R_SUCCESS) {
537 t_info("isc_mem_create failed %s\n",
538 isc_result_totext(isc_result));
539 return(T_UNRESOLVED);
542 isc_result = isc_entropy_create(mctx, &ectx);
543 if (isc_result != ISC_R_SUCCESS) {
544 t_info("isc_entropy_create failed %s\n",
545 isc_result_totext(isc_result));
546 isc_mem_destroy(&mctx);
547 return(T_UNRESOLVED);
550 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
551 if (isc_result != ISC_R_SUCCESS) {
552 t_info("isc_hash_create failed %s\n",
553 isc_result_totext(isc_result));
554 isc_entropy_detach(&ectx);
555 isc_mem_destroy(&mctx);
556 return(T_UNRESOLVED);
559 dns_result = t_create("rbt", origin, "in", "isc_true", mctx, &db);
560 if (dns_result != ISC_R_SUCCESS) {
561 t_info("t_create failed %s\n",
562 dns_result_totext(dns_result));
564 isc_entropy_detach(&ectx);
565 isc_mem_destroy(&mctx);
566 return(T_UNRESOLVED);
568 dns_fixedname_init(&dns_origin);
569 dns_fixedname_init(&dns_dborigin);
571 len = strlen(origin);
572 isc_buffer_init(&origin_buffer, origin, len);
573 isc_buffer_add(&origin_buffer, len);
575 dns_result = dns_db_load(db, filename);
576 if (dns_result != ISC_R_SUCCESS) {
577 t_info("dns_db_load failed %s\n",
578 dns_result_totext(dns_result));
581 isc_entropy_detach(&ectx);
582 isc_mem_destroy(&mctx);
583 return(T_UNRESOLVED);
586 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_origin),
587 &origin_buffer, NULL, 0, NULL);
588 if (dns_result != ISC_R_SUCCESS) {
589 t_info("dns_name_fromtext failed %s\n",
590 dns_result_totext(dns_result));
593 isc_entropy_detach(&ectx);
594 isc_mem_destroy(&mctx);
595 return(T_UNRESOLVED);
597 order = dns_name_compare(dns_fixedname_name(&dns_origin),
602 t_info("dns_name_compare returned %d\n", order);
608 isc_entropy_detach(&ectx);
609 isc_mem_destroy(&mctx);
614 static const char *a6 =
615 "A call to dns_db_origin(db) returns the origin of the database.";
621 t_assert("dns_db_origin", 6, T_REQUIRED, "%s", a6);
622 result = t_eval("dns_db_origin_data", t_dns_db_origin, 2);
627 static const char *a7 =
628 "A call to dns_db_class(db) returns the class of the database.";
631 #define CLASSBUFLEN 256
634 t_dns_db_class(char **av) {
640 isc_result_t dns_result;
641 isc_result_t isc_result;
645 dns_rdataclass_t rdataclass;
646 dns_rdataclass_t db_rdataclass;
647 isc_textregion_t textregion;
655 t_info("testing with database %s and class %s\n",
658 textregion.base = class;
659 textregion.length = strlen(class);
660 dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
661 if (dns_result != ISC_R_SUCCESS) {
662 t_info("dns_rdataclass_fromtext failed %s\n",
663 dns_result_totext(dns_result));
664 return(T_UNRESOLVED);
667 isc_result = isc_mem_create(0, 0, &mctx);
668 if (isc_result != ISC_R_SUCCESS) {
669 t_info("isc_mem_create failed %s\n",
670 isc_result_totext(isc_result));
671 return(T_UNRESOLVED);
674 isc_result = isc_entropy_create(mctx, &ectx);
675 if (isc_result != ISC_R_SUCCESS) {
676 t_info("isc_entropy_create failed %s\n",
677 isc_result_totext(isc_result));
678 isc_mem_destroy(&mctx);
679 return(T_UNRESOLVED);
682 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
683 if (isc_result != ISC_R_SUCCESS) {
684 t_info("isc_hash_create failed %s\n",
685 isc_result_totext(isc_result));
686 isc_entropy_detach(&ectx);
687 isc_mem_destroy(&mctx);
688 return(T_UNRESOLVED);
691 dns_result = t_create("rbt", ".", class, "isc_true", mctx, &db);
692 if (dns_result != ISC_R_SUCCESS) {
693 t_info("t_create failed %s\n",
694 dns_result_totext(dns_result));
696 isc_entropy_detach(&ectx);
697 isc_mem_destroy(&mctx);
698 return(T_UNRESOLVED);
701 dns_result = dns_db_load(db, filename);
702 if (dns_result != ISC_R_SUCCESS) {
703 t_info("dns_db_load failed %s\n",
704 dns_result_totext(dns_result));
707 isc_entropy_detach(&ectx);
708 isc_mem_destroy(&mctx);
709 return(T_UNRESOLVED);
712 db_rdataclass = dns_db_class(db);
713 if (db_rdataclass == rdataclass)
716 char classbuf[DNS_RDATACLASS_FORMATSIZE];
717 dns_rdataclass_format(db_rdataclass,
718 classbuf, sizeof(classbuf));
719 t_info("dns_db_class returned %s, expected %s\n",
726 isc_entropy_detach(&ectx);
727 isc_mem_destroy(&mctx);
735 t_assert("dns_db_class", 7, T_REQUIRED, "%s", a7);
736 result = t_eval("dns_db_class_data", t_dns_db_class, 2);
741 static const char *a8 =
742 "A call to dns_db_currentversion() opens the current "
743 "version for reading.";
746 t_dns_db_currentversion(char **av) {
758 isc_result_t dns_result;
759 isc_result_t isc_result;
763 isc_textregion_t textregion;
764 isc_buffer_t findname_buffer;
765 dns_fixedname_t dns_findname;
766 dns_fixedname_t dns_foundname;
767 dns_rdataset_t rdataset;
768 dns_rdatatype_t rdatatype;
769 dns_dbversion_t *cversionp;
770 dns_dbversion_t *nversionp;
772 result = T_UNRESOLVED;
785 t_info("testing using file %s and name %s\n", filename, findname);
787 isc_result = isc_mem_create(0, 0, &mctx);
788 if (isc_result != ISC_R_SUCCESS) {
789 t_info("isc_mem_create failed %s\n",
790 isc_result_totext(isc_result));
791 return(T_UNRESOLVED);
794 isc_result = isc_entropy_create(mctx, &ectx);
795 if (isc_result != ISC_R_SUCCESS) {
796 t_info("isc_entropy_create failed %s\n",
797 isc_result_totext(isc_result));
798 isc_mem_destroy(&mctx);
799 return(T_UNRESOLVED);
802 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
803 if (isc_result != ISC_R_SUCCESS) {
804 t_info("isc_hash_create failed %s\n",
805 isc_result_totext(isc_result));
806 isc_entropy_detach(&ectx);
807 isc_mem_destroy(&mctx);
808 return(T_UNRESOLVED);
811 dns_result = t_create(db_type, origin, class, model, mctx, &db);
812 if (dns_result != ISC_R_SUCCESS) {
814 isc_entropy_detach(&ectx);
815 isc_mem_destroy(&mctx);
816 return(T_UNRESOLVED);
819 dns_result = dns_db_load(db, filename);
820 if (dns_result != ISC_R_SUCCESS) {
821 t_info("dns_db_load returned %s\n",
822 dns_result_totext(dns_result));
825 isc_entropy_detach(&ectx);
826 isc_mem_destroy(&mctx);
827 return(T_UNRESOLVED);
830 dns_fixedname_init(&dns_findname);
831 len = strlen(findname);
832 isc_buffer_init(&findname_buffer, findname, len);
833 isc_buffer_add(&findname_buffer, len);
834 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_findname),
835 &findname_buffer, NULL, 0, NULL);
836 if (dns_result != ISC_R_SUCCESS) {
837 t_info("dns_name_fromtext failed %s\n",
838 dns_result_totext(dns_result));
841 isc_entropy_detach(&ectx);
842 isc_mem_destroy(&mctx);
843 return(T_UNRESOLVED);
846 textregion.base = findtype;
847 textregion.length = strlen(findtype);
848 dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
849 if (dns_result != ISC_R_SUCCESS) {
850 t_info("dns_rdatatype_fromtext %s failed %s\n",
852 dns_result_totext(dns_result));
855 isc_entropy_detach(&ectx);
856 isc_mem_destroy(&mctx);
857 return(T_UNRESOLVED);
861 * find a name we know is there
865 dns_fixedname_init(&dns_foundname);
866 dns_rdataset_init(&rdataset);
867 dns_db_currentversion(db, &cversionp);
870 dns_result = dns_db_find(db,
871 dns_fixedname_name(&dns_findname),
877 dns_fixedname_name(&dns_foundname),
880 if (dns_result != ISC_R_SUCCESS) {
881 t_info("unable to find %s using current version\n", findname);
882 dns_db_closeversion(db, &cversionp, ISC_FALSE);
885 isc_entropy_detach(&ectx);
886 isc_mem_destroy(&mctx);
887 return(T_UNRESOLVED);
891 * create a new version
892 * delete the found rdataset in the new version
893 * attempt to find the rdataset again and expect the find to fail
894 * close/commit the new version
895 * attempt to find the rdataset in the current version and
896 * expect the find to succeed
900 dns_result = dns_db_newversion(db, &nversionp);
901 if (dns_result != ISC_R_SUCCESS) {
902 t_info("dns_db_newversion failed %s\n",
903 dns_result_totext(dns_result));
904 dns_db_detachnode(db, &nodep);
905 dns_rdataset_disassociate(&rdataset);
906 dns_db_closeversion(db, &cversionp, ISC_FALSE);
909 isc_entropy_detach(&ectx);
910 isc_mem_destroy(&mctx);
911 return(T_UNRESOLVED);
915 * Delete the found rdataset in the new version.
917 dns_result = dns_db_deleterdataset(db, nodep, nversionp, rdatatype, 0);
918 if (dns_result != ISC_R_SUCCESS) {
919 t_info("dns_db_deleterdataset failed %s\n",
920 dns_result_totext(dns_result));
921 dns_rdataset_disassociate(&rdataset);
922 dns_db_detachnode(db, &nodep);
923 dns_db_closeversion(db, &nversionp, ISC_FALSE);
924 dns_db_closeversion(db, &cversionp, ISC_FALSE);
927 isc_entropy_detach(&ectx);
928 isc_mem_destroy(&mctx);
929 return(T_UNRESOLVED);
933 * Don't need these now.
935 dns_rdataset_disassociate(&rdataset);
936 dns_db_detachnode(db, &nodep);
940 * Find the deleted rdataset and expect it to fail.
942 dns_result = dns_db_find(db,
943 dns_fixedname_name(&dns_findname),
949 dns_fixedname_name(&dns_foundname),
952 if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
953 t_info("unexpectedly found %s using current version\n",
955 dns_db_closeversion(db, &cversionp, ISC_FALSE);
956 dns_db_closeversion(db, &nversionp, ISC_FALSE);
959 isc_entropy_detach(&ectx);
960 isc_mem_destroy(&mctx);
965 * Close/commit the new version.
967 dns_db_closeversion(db, &nversionp, ISC_TRUE);
970 * Find the deleted rdata in the current version.
972 dns_result = dns_db_find(db, dns_fixedname_name(&dns_findname),
973 cversionp, rdatatype, DNS_DBFIND_GLUEOK,
974 0, &nodep, dns_fixedname_name(&dns_foundname),
978 * And expect it to succeed.
980 if (dns_result == ISC_R_SUCCESS) {
983 t_info("cound not find %s using current version\n", findname);
984 dns_db_closeversion(db, &cversionp, ISC_FALSE);
987 isc_entropy_detach(&ectx);
988 isc_mem_destroy(&mctx);
992 dns_db_detachnode(db, &nodep);
993 dns_rdataset_disassociate(&rdataset);
995 dns_db_closeversion(db, &cversionp, ISC_FALSE);
998 isc_entropy_detach(&ectx);
999 isc_mem_destroy(&mctx);
1008 t_assert("dns_db_currentversion", 8, T_REQUIRED, "%s", a8);
1009 result = t_eval("dns_db_currentversion_data",
1010 t_dns_db_currentversion, 7);
1014 static const char *a9 =
1015 "A call to dns_db_newversion() opens a new version for "
1016 "reading and writing.";
1019 t_dns_db_newversion(char **av) {
1033 isc_result_t dns_result;
1034 isc_result_t isc_result;
1036 isc_entropy_t *ectx;
1037 dns_dbnode_t *nodep;
1038 dns_dbnode_t *found_nodep;
1039 isc_textregion_t textregion;
1040 isc_buffer_t newname_buffer;
1041 dns_fixedname_t dns_newname;
1042 dns_fixedname_t dns_foundname;
1043 dns_rdata_t added_rdata = DNS_RDATA_INIT;
1044 const char * added_rdata_data;
1045 dns_rdataset_t added_rdataset;
1046 dns_rdata_t found_rdata = DNS_RDATA_INIT;
1047 dns_rdataset_t found_rdataset;
1048 dns_rdatatype_t rdatatype;
1049 dns_rdataclass_t rdataclass;
1050 dns_dbversion_t *nversionp;
1051 dns_rdatalist_t rdatalist;
1053 result = T_UNRESOLVED;
1055 filename = T_ARG(0);
1067 * Open a new version, add some data, commit it,
1068 * close it, open a new version, and check that changes
1072 t_info("testing using file %s and name %s\n", filename, newname);
1074 isc_result = isc_mem_create(0, 0, &mctx);
1075 if (isc_result != ISC_R_SUCCESS) {
1076 t_info("isc_mem_create failed %s\n",
1077 isc_result_totext(isc_result));
1078 return(T_UNRESOLVED);
1081 isc_result = isc_entropy_create(mctx, &ectx);
1082 if (isc_result != ISC_R_SUCCESS) {
1083 t_info("isc_entropy_create failed %s\n",
1084 isc_result_totext(isc_result));
1085 isc_mem_destroy(&mctx);
1086 return(T_UNRESOLVED);
1089 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
1090 if (isc_result != ISC_R_SUCCESS) {
1091 t_info("isc_hash_create failed %s\n",
1092 isc_result_totext(isc_result));
1093 isc_entropy_detach(&ectx);
1094 isc_mem_destroy(&mctx);
1095 return(T_UNRESOLVED);
1098 dns_result = t_create(db_type, origin, class, model, mctx, &db);
1099 if (dns_result != ISC_R_SUCCESS) {
1101 isc_entropy_detach(&ectx);
1102 isc_mem_destroy(&mctx);
1103 return(T_UNRESOLVED);
1106 dns_result = dns_db_load(db, filename);
1107 if (dns_result != ISC_R_SUCCESS) {
1108 t_info("dns_db_load returned %s\n",
1109 dns_result_totext(dns_result));
1112 isc_entropy_detach(&ectx);
1113 isc_mem_destroy(&mctx);
1114 return(T_UNRESOLVED);
1121 dns_fixedname_init(&dns_newname);
1122 len = strlen(newname);
1123 isc_buffer_init(&newname_buffer, newname, len);
1124 isc_buffer_add(&newname_buffer, len);
1125 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_newname),
1126 &newname_buffer, NULL, 0, NULL);
1127 if (dns_result != ISC_R_SUCCESS) {
1128 t_info("dns_name_fromtext failed %s\n",
1129 dns_result_totext(dns_result));
1132 isc_entropy_detach(&ectx);
1133 isc_mem_destroy(&mctx);
1134 return(T_UNRESOLVED);
1138 dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_newname),
1140 if (dns_result != ISC_R_SUCCESS) {
1141 t_info("dns_db_findnode failed %s\n",
1142 dns_result_totext(dns_result));
1145 isc_entropy_detach(&ectx);
1146 isc_mem_destroy(&mctx);
1147 return(T_UNRESOLVED);
1151 * Open a new version and associate some rdata with the new name.
1154 textregion.base = newtype;
1155 textregion.length = strlen(newtype);
1156 dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
1158 if (dns_result != ISC_R_SUCCESS) {
1159 t_info("dns_rdatatype_fromtext %s failed %s\n",
1161 dns_result_totext(dns_result));
1162 dns_db_detachnode(db, &nodep);
1165 isc_entropy_detach(&ectx);
1166 isc_mem_destroy(&mctx);
1167 return(T_UNRESOLVED);
1170 textregion.base = class;
1171 textregion.length = strlen(class);
1172 dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
1173 if (dns_result != ISC_R_SUCCESS) {
1174 t_info("dns_rdataclass_fromtext failed %s\n",
1175 dns_result_totext(dns_result));
1176 dns_db_detachnode(db, &nodep);
1179 isc_entropy_detach(&ectx);
1180 isc_mem_destroy(&mctx);
1181 return(T_UNRESOLVED);
1184 dns_rdata_init(&added_rdata);
1185 added_rdata_data = "\x10\x00\x00\x01";
1186 DE_CONST(added_rdata_data, added_rdata.data);
1187 added_rdata.length = 4;
1188 added_rdata.rdclass = rdataclass;
1189 added_rdata.type = rdatatype;
1191 dns_rdataset_init(&added_rdataset);
1192 rdatalist.type = rdatatype;
1193 rdatalist.covers = 0;
1194 rdatalist.rdclass = rdataclass;
1196 ISC_LIST_INIT(rdatalist.rdata);
1197 ISC_LIST_APPEND(rdatalist.rdata, &added_rdata, link);
1199 dns_result = dns_rdatalist_tordataset(&rdatalist, &added_rdataset);
1200 if (dns_result != ISC_R_SUCCESS) {
1201 t_info("dns_rdatalist_tordataset failed %s\n",
1202 dns_result_totext(dns_result));
1203 dns_db_detachnode(db, &nodep);
1206 isc_entropy_detach(&ectx);
1207 isc_mem_destroy(&mctx);
1208 return(T_UNRESOLVED);
1212 dns_result = dns_db_newversion(db, &nversionp);
1213 if (dns_result != ISC_R_SUCCESS) {
1214 t_info("dns_db_newversion failed %s\n",
1215 dns_result_totext(dns_result));
1216 dns_db_detachnode(db, &nodep);
1219 isc_entropy_detach(&ectx);
1220 isc_mem_destroy(&mctx);
1221 return(T_UNRESOLVED);
1224 dns_result = dns_db_addrdataset(db, nodep, nversionp, 0,
1225 &added_rdataset, 0, NULL);
1226 if (dns_result != ISC_R_SUCCESS) {
1227 t_info("dns_db_addrdataset failed %s\n",
1228 dns_result_totext(dns_result));
1229 dns_db_closeversion(db, &nversionp, ISC_FALSE);
1230 dns_db_detachnode(db, &nodep);
1233 isc_entropy_detach(&ectx);
1234 isc_mem_destroy(&mctx);
1235 return(T_UNRESOLVED);
1239 * Close and commit the version.
1241 dns_db_closeversion(db, &nversionp, ISC_TRUE);
1242 dns_db_detachnode(db, &nodep);
1243 if (dns_rdataset_isassociated(&added_rdataset))
1244 dns_rdataset_disassociate(&added_rdataset);
1248 * Open a new version and find the data we added.
1250 dns_fixedname_init(&dns_foundname);
1251 dns_rdataset_init(&found_rdataset);
1254 dns_db_newversion(db, &nversionp);
1257 * Find the recently added name and rdata.
1259 dns_result = dns_db_find(db, dns_fixedname_name(&dns_newname),
1260 nversionp, rdatatype, 0, 0, &found_nodep,
1261 dns_fixedname_name(&dns_foundname),
1262 &found_rdataset, NULL);
1264 if (dns_result != ISC_R_SUCCESS) {
1265 /* XXXWPK - NXRRSET ??? reference counts ??? */
1266 t_info("dns_db_find failed %s\n",
1267 dns_result_totext(dns_result));
1268 dns_db_closeversion(db, &nversionp, ISC_FALSE);
1269 dns_db_detachnode(db, &found_nodep);
1270 if (dns_rdataset_isassociated(&found_rdataset))
1271 dns_rdataset_disassociate(&found_rdataset);
1274 isc_entropy_detach(&ectx);
1275 isc_mem_destroy(&mctx);
1279 dns_result = dns_rdataset_first(&found_rdataset);
1280 if (dns_result != ISC_R_SUCCESS) {
1281 t_info("dns_rdataset_first failed %s\n",
1282 dns_result_totext(dns_result));
1283 dns_db_detachnode(db, &nodep);
1284 if (dns_rdataset_isassociated(&found_rdataset))
1285 dns_rdataset_disassociate(&found_rdataset);
1286 dns_db_closeversion(db, &nversionp, ISC_FALSE);
1289 isc_entropy_detach(&ectx);
1290 isc_mem_destroy(&mctx);
1295 * Now make sure its what we expect.
1297 dns_rdata_init(&found_rdata);
1298 dns_rdataset_current(&found_rdataset, &found_rdata);
1299 rval = dns_rdata_compare(&added_rdata, &found_rdata);
1303 t_info("dns_rdata_compare returned %d\n", rval);
1308 * Don't need these now.
1310 dns_db_closeversion(db, &nversionp, ISC_FALSE);
1311 if (dns_rdataset_isassociated(&found_rdataset))
1312 dns_rdataset_disassociate(&found_rdataset);
1313 dns_db_detachnode(db, &found_nodep);
1316 isc_entropy_detach(&ectx);
1317 isc_mem_destroy(&mctx);
1326 t_assert("dns_db_newversion", 9, T_REQUIRED, "%s", a9);
1327 result = t_eval("dns_db_newversion_data", t_dns_db_newversion, 7);
1331 static const char *a10 =
1332 "When versionp points to a read-write version and commit is "
1333 "ISC_TRUE, a call to dns_db_closeversion(db, versionp, commit) "
1334 "causes all changes made in the version to take effect, "
1335 "and returns ISC_R_SUCCESS.";
1338 t_dns_db_closeversion_1(char **av) {
1346 char *existing_name;
1347 char *existing_type;
1354 isc_result_t dns_result;
1355 isc_result_t isc_result;
1357 isc_entropy_t *ectx;
1358 dns_dbnode_t *nodep;
1359 isc_textregion_t textregion;
1360 isc_buffer_t name_buffer;
1361 dns_fixedname_t dns_newname;
1362 dns_fixedname_t dns_foundname;
1363 dns_fixedname_t dns_existingname;
1364 dns_rdata_t added_rdata = DNS_RDATA_INIT;
1365 const char * added_rdata_data;
1366 dns_rdataset_t added_rdataset;
1367 dns_rdata_t found_rdata = DNS_RDATA_INIT;
1368 dns_rdataset_t found_rdataset;
1369 dns_rdatatype_t new_rdatatype;
1370 dns_rdatatype_t existing_rdatatype;
1371 dns_rdataclass_t rdataclass;
1372 dns_dbversion_t *nversionp;
1373 dns_dbversion_t *cversionp;
1374 dns_rdatalist_t rdatalist;
1376 filename = T_ARG(0);
1381 new_name = T_ARG(5);
1382 new_type = T_ARG(6);
1383 existing_name = T_ARG(7);
1384 existing_type = T_ARG(8);
1387 result = T_UNRESOLVED;
1393 * Open a new version, add some data,
1394 * remove some data, close with commit, open the current
1395 * version and check that changes are present.
1398 t_info("testing using file %s and name %s\n", filename, new_name);
1400 isc_result = isc_mem_create(0, 0, &mctx);
1401 if (isc_result != ISC_R_SUCCESS) {
1402 t_info("isc_mem_create failed %s\n",
1403 isc_result_totext(isc_result));
1404 return(T_UNRESOLVED);
1407 isc_result = isc_entropy_create(mctx, &ectx);
1408 if (isc_result != ISC_R_SUCCESS) {
1409 t_info("isc_entropy_create failed %s\n",
1410 isc_result_totext(isc_result));
1411 isc_mem_destroy(&mctx);
1412 return(T_UNRESOLVED);
1415 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
1416 if (isc_result != ISC_R_SUCCESS) {
1417 t_info("isc_hash_create failed %s\n",
1418 isc_result_totext(isc_result));
1419 isc_entropy_detach(&ectx);
1420 isc_mem_destroy(&mctx);
1421 return(T_UNRESOLVED);
1424 dns_result = t_create(db_type, origin, class, model, mctx, &db);
1425 if (dns_result != ISC_R_SUCCESS) {
1427 isc_entropy_detach(&ectx);
1428 isc_mem_destroy(&mctx);
1429 return(T_UNRESOLVED);
1432 dns_result = dns_db_load(db, filename);
1433 if (dns_result != ISC_R_SUCCESS) {
1434 t_info("dns_db_load returned %s\n",
1435 dns_result_totext(dns_result));
1438 isc_entropy_detach(&ectx);
1439 isc_mem_destroy(&mctx);
1440 return(T_UNRESOLVED);
1444 * Remove all rdata for an existing name.
1447 dns_fixedname_init(&dns_existingname);
1448 len = strlen(existing_name);
1449 isc_buffer_init(&name_buffer, existing_name, len);
1450 isc_buffer_add(&name_buffer, len);
1451 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_existingname),
1452 &name_buffer, NULL, 0, NULL);
1453 if (dns_result != ISC_R_SUCCESS) {
1454 t_info("dns_name_fromtext failed %s\n",
1455 dns_result_totext(dns_result));
1458 isc_entropy_detach(&ectx);
1459 isc_mem_destroy(&mctx);
1460 return(T_UNRESOLVED);
1463 textregion.base = existing_type;
1464 textregion.length = strlen(existing_type);
1465 dns_result = dns_rdatatype_fromtext(&existing_rdatatype, &textregion);
1466 if (dns_result != ISC_R_SUCCESS) {
1467 t_info("dns_rdatatype_fromtext %s failed %s\n",
1469 dns_result_totext(dns_result));
1470 dns_db_detachnode(db, &nodep);
1473 isc_entropy_detach(&ectx);
1474 isc_mem_destroy(&mctx);
1475 return(T_UNRESOLVED);
1479 dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_existingname),
1481 if (dns_result != ISC_R_SUCCESS) {
1482 t_info("dns_db_findnode %s\n",
1483 dns_result_totext(dns_result));
1486 isc_entropy_detach(&ectx);
1487 isc_mem_destroy(&mctx);
1488 return(T_UNRESOLVED);
1491 /* open a new version */
1493 dns_result = dns_db_newversion(db, &nversionp);
1494 if (dns_result != ISC_R_SUCCESS) {
1495 t_info("dns_db_newversion failed %s\n",
1496 dns_result_totext(dns_result));
1497 dns_db_detachnode(db, &nodep);
1500 isc_entropy_detach(&ectx);
1501 isc_mem_destroy(&mctx);
1502 return(T_UNRESOLVED);
1505 dns_result = dns_db_deleterdataset(db, nodep, nversionp,
1506 existing_rdatatype, 0);
1507 if (dns_result != ISC_R_SUCCESS) {
1508 t_info("dns_db_deleterdataset failed %s\n",
1509 dns_result_totext(dns_result));
1510 dns_db_closeversion(db, &nversionp, ISC_FALSE);
1511 dns_db_detachnode(db, &nodep);
1514 isc_entropy_detach(&ectx);
1515 isc_mem_destroy(&mctx);
1516 return(T_UNRESOLVED);
1520 * add a new name and associate some rdata with it
1523 dns_db_detachnode(db, &nodep);
1526 dns_fixedname_init(&dns_newname);
1527 len = strlen(new_name);
1528 isc_buffer_init(&name_buffer, new_name, len);
1529 isc_buffer_add(&name_buffer, len);
1530 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_newname),
1531 &name_buffer, NULL, 0, NULL);
1532 if (dns_result != ISC_R_SUCCESS) {
1533 t_info("dns_name_fromtext failed %s\n",
1534 dns_result_totext(dns_result));
1535 dns_db_closeversion(db, &nversionp, ISC_FALSE);
1538 isc_entropy_detach(&ectx);
1539 isc_mem_destroy(&mctx);
1540 return(T_UNRESOLVED);
1543 dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_newname),
1545 if (dns_result != ISC_R_SUCCESS) {
1546 t_info("dns_db_findnode failed %s\n",
1547 dns_result_totext(dns_result));
1548 dns_db_closeversion(db, &nversionp, ISC_FALSE);
1551 isc_entropy_detach(&ectx);
1552 isc_mem_destroy(&mctx);
1553 return(T_UNRESOLVED);
1557 * associate some rdata with the new name
1560 textregion.base = new_type;
1561 textregion.length = strlen(new_type);
1562 dns_result = dns_rdatatype_fromtext(&new_rdatatype, &textregion);
1563 if (dns_result != ISC_R_SUCCESS) {
1564 t_info("dns_rdatatype_fromtext %s failed %s\n",
1566 dns_result_totext(dns_result));
1567 dns_db_detachnode(db, &nodep);
1570 isc_entropy_detach(&ectx);
1571 isc_mem_destroy(&mctx);
1572 return(T_UNRESOLVED);
1575 textregion.base = class;
1576 textregion.length = strlen(class);
1577 dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
1578 if (dns_result != ISC_R_SUCCESS) {
1579 t_info("dns_rdataclass_fromtext failed %s\n",
1580 dns_result_totext(dns_result));
1581 dns_db_detachnode(db, &nodep);
1584 isc_entropy_detach(&ectx);
1585 isc_mem_destroy(&mctx);
1586 return(T_UNRESOLVED);
1589 dns_rdata_init(&added_rdata);
1590 added_rdata_data = "\x10\x00\x00\x01";
1591 DE_CONST(added_rdata_data, added_rdata.data);
1592 added_rdata.length = 4;
1593 added_rdata.rdclass = rdataclass;
1594 added_rdata.type = new_rdatatype;
1596 dns_rdataset_init(&added_rdataset);
1597 rdatalist.type = new_rdatatype;
1598 rdatalist.covers = 0;
1599 rdatalist.rdclass = rdataclass;
1601 ISC_LIST_INIT(rdatalist.rdata);
1602 ISC_LIST_APPEND(rdatalist.rdata, &added_rdata, link);
1604 dns_result = dns_rdatalist_tordataset(&rdatalist, &added_rdataset);
1605 if (dns_result != ISC_R_SUCCESS) {
1606 t_info("dns_rdatalist_tordataset failed %s\n",
1607 dns_result_totext(dns_result));
1608 dns_db_detachnode(db, &nodep);
1611 isc_entropy_detach(&ectx);
1612 isc_mem_destroy(&mctx);
1613 return(T_UNRESOLVED);
1616 dns_result = dns_db_addrdataset(db, nodep, nversionp, 0,
1617 &added_rdataset, 0, NULL);
1618 if (dns_result != ISC_R_SUCCESS) {
1619 t_info("dns_db_addrdataset failed %s\n",
1620 dns_result_totext(dns_result));
1621 dns_db_closeversion(db, &nversionp, ISC_FALSE);
1622 dns_db_detachnode(db, &nodep);
1625 isc_entropy_detach(&ectx);
1626 isc_mem_destroy(&mctx);
1627 return(T_UNRESOLVED);
1630 /* close and commit the version */
1631 dns_db_closeversion(db, &nversionp, ISC_TRUE);
1632 dns_db_detachnode(db, &nodep);
1635 /* open the current version and check changes */
1636 dns_fixedname_init(&dns_foundname);
1637 dns_rdataset_init(&found_rdataset);
1639 dns_db_currentversion(db, &cversionp);
1641 /* find the recently added name and rdata */
1642 dns_result = dns_db_find(db,
1643 dns_fixedname_name(&dns_newname),
1649 dns_fixedname_name(&dns_foundname),
1650 &found_rdataset, NULL);
1652 if (dns_result != ISC_R_SUCCESS) {
1653 /* XXXWPK NXRRSET ??? reference counting ??? */
1654 t_info("dns_db_find failed %s\n",
1655 dns_result_totext(dns_result));
1656 dns_db_closeversion(db, &cversionp, ISC_FALSE);
1657 dns_db_detachnode(db, &nodep);
1658 if (dns_rdataset_isassociated(&found_rdataset))
1659 dns_rdataset_disassociate(&found_rdataset);
1662 isc_entropy_detach(&ectx);
1663 isc_mem_destroy(&mctx);
1667 dns_result = dns_rdataset_first(&found_rdataset);
1668 if (dns_result != ISC_R_SUCCESS) {
1669 t_info("dns_rdataset_first failed %s\n",
1670 dns_result_totext(dns_result));
1671 dns_db_detachnode(db, &nodep);
1672 if (dns_rdataset_isassociated(&found_rdataset))
1673 dns_rdataset_disassociate(&found_rdataset);
1674 dns_db_closeversion(db, &cversionp, ISC_FALSE);
1677 isc_entropy_detach(&ectx);
1678 isc_mem_destroy(&mctx);
1683 * Now make sure its what we expect.
1685 dns_rdata_init(&found_rdata);
1686 dns_rdataset_current(&found_rdataset, &found_rdata);
1687 rval = dns_rdata_compare(&added_rdata, &found_rdata);
1689 t_info("dns_rdata_compare returned %d\n", rval);
1694 * Now check the rdata deletion.
1697 if (dns_rdataset_isassociated(&found_rdataset))
1698 dns_rdataset_disassociate(&found_rdataset);
1699 dns_rdataset_init(&found_rdataset);
1700 dns_db_detachnode(db, &nodep);
1702 dns_fixedname_init(&dns_foundname);
1704 dns_result = dns_db_find(db, dns_fixedname_name(&dns_existingname),
1705 cversionp, existing_rdatatype,
1707 dns_fixedname_name(&dns_foundname),
1708 &found_rdataset, NULL);
1711 if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
1712 dns_rdataset_disassociate(&found_rdataset);
1713 dns_db_detachnode(db, &nodep);
1714 t_info("dns_db_find %s returned %s\n", existing_name,
1715 dns_result_totext(dns_result));
1719 dns_db_closeversion(db, &cversionp, ISC_FALSE);
1722 isc_entropy_detach(&ectx);
1723 isc_mem_destroy(&mctx);
1737 t_assert("dns_db_closeversion", 10, T_REQUIRED, "%s", a10);
1738 result = t_eval("dns_db_closeversion_1_data",
1739 t_dns_db_closeversion_1, 9);
1743 static const char *a11 =
1744 "When versionp points to a read-write version and commit is "
1745 "ISC_FALSE, a call to dns_db_closeversion(db, versionp, commit) "
1746 "causes all changes made in the version to to be rolled back, "
1747 "and returns ISC_R_SUCCESS.";
1750 t_dns_db_closeversion_2(char **av) {
1758 char *existing_name;
1759 char *existing_type;
1766 isc_result_t dns_result;
1767 isc_result_t isc_result;
1769 isc_entropy_t *ectx;
1770 dns_dbnode_t *nodep;
1771 isc_textregion_t textregion;
1772 isc_buffer_t name_buffer;
1773 dns_fixedname_t dns_newname;
1774 dns_fixedname_t dns_foundname;
1775 dns_fixedname_t dns_existingname;
1776 dns_rdata_t added_rdata = DNS_RDATA_INIT;
1777 const char * added_rdata_data;
1778 dns_rdataset_t added_rdataset;
1779 dns_rdata_t found_rdata = DNS_RDATA_INIT;
1780 dns_rdataset_t found_rdataset;
1781 dns_rdatatype_t new_rdatatype;
1782 dns_rdatatype_t existing_rdatatype;
1783 dns_rdataclass_t rdataclass;
1784 dns_dbversion_t *nversionp;
1785 dns_dbversion_t *cversionp;
1786 dns_rdatalist_t rdatalist;
1788 filename = T_ARG(0);
1793 new_name = T_ARG(5);
1794 new_type = T_ARG(6);
1795 existing_name = T_ARG(7);
1796 existing_type = T_ARG(8);
1799 result = T_UNRESOLVED;
1805 * Open a new version, add some data,
1806 * remove some data, close with commit, open the current
1807 * version and check that changes are present.
1810 t_info("testing using file %s and name %s\n", filename, new_name);
1812 isc_result = isc_mem_create(0, 0, &mctx);
1813 if (isc_result != ISC_R_SUCCESS) {
1814 t_info("isc_mem_create failed %s\n",
1815 isc_result_totext(isc_result));
1816 return(T_UNRESOLVED);
1819 isc_result = isc_entropy_create(mctx, &ectx);
1820 if (isc_result != ISC_R_SUCCESS) {
1821 t_info("isc_entropy_create failed %s\n",
1822 isc_result_totext(isc_result));
1823 isc_mem_destroy(&mctx);
1824 return(T_UNRESOLVED);
1827 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
1828 if (isc_result != ISC_R_SUCCESS) {
1829 t_info("isc_hash_create failed %s\n",
1830 isc_result_totext(isc_result));
1831 isc_entropy_detach(&ectx);
1832 isc_mem_destroy(&mctx);
1833 return(T_UNRESOLVED);
1836 dns_result = t_create(db_type, origin, class, model, mctx, &db);
1837 if (dns_result != ISC_R_SUCCESS) {
1839 isc_entropy_detach(&ectx);
1840 isc_mem_destroy(&mctx);
1841 return(T_UNRESOLVED);
1844 dns_result = dns_db_load(db, filename);
1845 if (dns_result != ISC_R_SUCCESS) {
1846 t_info("dns_db_load returned %s\n",
1847 dns_result_totext(dns_result));
1850 isc_entropy_detach(&ectx);
1851 isc_mem_destroy(&mctx);
1852 return(T_UNRESOLVED);
1856 * Remove all rdata for an existing name.
1859 dns_fixedname_init(&dns_existingname);
1860 len = strlen(existing_name);
1861 isc_buffer_init(&name_buffer, existing_name, len);
1862 isc_buffer_add(&name_buffer, len);
1863 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_existingname),
1864 &name_buffer, NULL, 0, NULL);
1865 if (dns_result != ISC_R_SUCCESS) {
1866 t_info("dns_name_fromtext failed %s\n",
1867 dns_result_totext(dns_result));
1870 isc_entropy_detach(&ectx);
1871 isc_mem_destroy(&mctx);
1872 return(T_UNRESOLVED);
1875 textregion.base = existing_type;
1876 textregion.length = strlen(existing_type);
1877 dns_result = dns_rdatatype_fromtext(&existing_rdatatype, &textregion);
1878 if (dns_result != ISC_R_SUCCESS) {
1879 t_info("dns_rdatatype_fromtext %s failed %s\n",
1881 dns_result_totext(dns_result));
1882 dns_db_detachnode(db, &nodep);
1885 isc_entropy_detach(&ectx);
1886 isc_mem_destroy(&mctx);
1887 return(T_UNRESOLVED);
1891 dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_existingname),
1893 if (dns_result != ISC_R_SUCCESS) {
1894 t_info("dns_db_findnode %s\n",
1895 dns_result_totext(dns_result));
1898 isc_entropy_detach(&ectx);
1899 isc_mem_destroy(&mctx);
1900 return(T_UNRESOLVED);
1904 * Open a new version.
1907 dns_result = dns_db_newversion(db, &nversionp);
1908 if (dns_result != ISC_R_SUCCESS) {
1909 t_info("dns_db_newversion failed %s\n",
1910 dns_result_totext(dns_result));
1911 dns_db_detachnode(db, &nodep);
1914 isc_entropy_detach(&ectx);
1915 isc_mem_destroy(&mctx);
1916 return(T_UNRESOLVED);
1919 dns_result = dns_db_deleterdataset(db, nodep, nversionp,
1920 existing_rdatatype, 0);
1921 if (dns_result != ISC_R_SUCCESS) {
1922 t_info("dns_db_deleterdataset failed %s\n",
1923 dns_result_totext(dns_result));
1924 dns_db_closeversion(db, &nversionp, ISC_FALSE);
1925 dns_db_detachnode(db, &nodep);
1928 isc_entropy_detach(&ectx);
1929 isc_mem_destroy(&mctx);
1930 return(T_UNRESOLVED);
1934 * add a new name and associate some rdata with it
1937 dns_db_detachnode(db, &nodep);
1940 dns_fixedname_init(&dns_newname);
1941 len = strlen(new_name);
1942 isc_buffer_init(&name_buffer, new_name, len);
1943 isc_buffer_add(&name_buffer, len);
1944 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_newname),
1945 &name_buffer, NULL, 0, NULL);
1946 if (dns_result != ISC_R_SUCCESS) {
1947 t_info("dns_name_fromtext failed %s\n",
1948 dns_result_totext(dns_result));
1949 dns_db_closeversion(db, &nversionp, ISC_FALSE);
1952 isc_entropy_detach(&ectx);
1953 isc_mem_destroy(&mctx);
1954 return(T_UNRESOLVED);
1957 dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_newname),
1959 if (dns_result != ISC_R_SUCCESS) {
1960 t_info("dns_db_findnode failed %s\n",
1961 dns_result_totext(dns_result));
1962 dns_db_closeversion(db, &nversionp, ISC_FALSE);
1965 isc_entropy_detach(&ectx);
1966 isc_mem_destroy(&mctx);
1967 return(T_UNRESOLVED);
1970 textregion.base = new_type;
1971 textregion.length = strlen(new_type);
1972 dns_result = dns_rdatatype_fromtext(&new_rdatatype, &textregion);
1973 if (dns_result != ISC_R_SUCCESS) {
1974 t_info("dns_rdatatype_fromtext %s failed %s\n",
1975 new_type, dns_result_totext(dns_result));
1976 dns_db_detachnode(db, &nodep);
1979 isc_entropy_detach(&ectx);
1980 isc_mem_destroy(&mctx);
1981 return(T_UNRESOLVED);
1984 textregion.base = class;
1985 textregion.length = strlen(class);
1986 dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion);
1987 if (dns_result != ISC_R_SUCCESS) {
1988 t_info("dns_rdataclass_fromtext failed %s\n",
1989 dns_result_totext(dns_result));
1990 dns_db_detachnode(db, &nodep);
1993 isc_entropy_detach(&ectx);
1994 isc_mem_destroy(&mctx);
1995 return(T_UNRESOLVED);
1998 dns_rdata_init(&added_rdata);
1999 added_rdata_data = "\x10\x00\x00\x01";
2000 DE_CONST(added_rdata_data, added_rdata.data);
2001 added_rdata.length = 4;
2002 added_rdata.rdclass = rdataclass;
2003 added_rdata.type = new_rdatatype;
2005 dns_rdataset_init(&added_rdataset);
2006 rdatalist.type = new_rdatatype;
2007 rdatalist.covers = 0;
2008 rdatalist.rdclass = rdataclass;
2010 ISC_LIST_INIT(rdatalist.rdata);
2011 ISC_LIST_APPEND(rdatalist.rdata, &added_rdata, link);
2013 dns_result = dns_rdatalist_tordataset(&rdatalist, &added_rdataset);
2014 if (dns_result != ISC_R_SUCCESS) {
2015 t_info("dns_rdatalist_tordataset failed %s\n",
2016 dns_result_totext(dns_result));
2017 dns_db_detachnode(db, &nodep);
2020 isc_entropy_detach(&ectx);
2021 isc_mem_destroy(&mctx);
2022 return(T_UNRESOLVED);
2025 dns_result = dns_db_addrdataset(db, nodep, nversionp, 0,
2026 &added_rdataset, 0, NULL);
2027 if (dns_result != ISC_R_SUCCESS) {
2028 t_info("dns_db_addrdataset failed %s\n",
2029 dns_result_totext(dns_result));
2030 dns_db_closeversion(db, &nversionp, ISC_FALSE);
2031 dns_db_detachnode(db, &nodep);
2034 isc_entropy_detach(&ectx);
2035 isc_mem_destroy(&mctx);
2036 return(T_UNRESOLVED);
2040 * Check that our changes took.
2042 dns_db_detachnode(db, &nodep);
2044 dns_fixedname_init(&dns_foundname);
2045 dns_rdataset_init(&found_rdataset);
2048 * Find the recently added name and rdata.
2050 dns_result = dns_db_find(db, dns_fixedname_name(&dns_newname),
2051 nversionp, new_rdatatype, 0, 0, &nodep,
2052 dns_fixedname_name(&dns_foundname),
2053 &found_rdataset, NULL);
2055 if ((dns_result == ISC_R_NOTFOUND) ||
2056 (dns_result == DNS_R_NXDOMAIN) ||
2057 (dns_result == DNS_R_NXRRSET)) {
2059 t_info("dns_db_find failed %s\n",
2060 dns_result_totext(dns_result));
2061 dns_db_closeversion(db, &nversionp, ISC_FALSE);
2062 dns_db_detachnode(db, &nodep);
2063 if (dns_rdataset_isassociated(&found_rdataset))
2064 dns_rdataset_disassociate(&found_rdataset);
2067 isc_entropy_detach(&ectx);
2068 isc_mem_destroy(&mctx);
2072 dns_result = dns_rdataset_first(&found_rdataset);
2073 if (dns_result != ISC_R_SUCCESS) {
2074 t_info("dns_rdataset_first failed %s\n",
2075 dns_result_totext(dns_result));
2076 dns_db_detachnode(db, &nodep);
2077 if (dns_rdataset_isassociated(&found_rdataset))
2078 dns_rdataset_disassociate(&found_rdataset);
2079 dns_db_closeversion(db, &nversionp, ISC_FALSE);
2082 isc_entropy_detach(&ectx);
2083 isc_mem_destroy(&mctx);
2088 * Now make sure its what we expect.
2090 dns_rdata_init(&found_rdata);
2091 dns_rdataset_current(&found_rdataset, &found_rdata);
2092 rval = dns_rdata_compare(&added_rdata, &found_rdata);
2094 t_info("dns_rdata_compare returned %d\n", rval);
2099 * Now check the rdata deletion.
2101 if (dns_rdataset_isassociated(&found_rdataset))
2102 dns_rdataset_disassociate(&found_rdataset);
2103 dns_rdataset_init(&found_rdataset);
2104 dns_db_detachnode(db, &nodep);
2106 dns_fixedname_init(&dns_foundname);
2108 dns_result = dns_db_find(db,
2109 dns_fixedname_name(&dns_existingname),
2115 dns_fixedname_name(&dns_foundname),
2116 &found_rdataset, NULL);
2119 if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2120 t_info("dns_db_find %s returned %s\n", existing_name,
2121 dns_result_totext(dns_result));
2122 if (dns_rdataset_isassociated(&found_rdataset))
2123 dns_rdataset_disassociate(&found_rdataset);
2124 dns_db_detachnode(db, &nodep);
2130 * Close the version without a commit.
2132 dns_db_closeversion(db, &nversionp, ISC_FALSE);
2135 * Open the current version and check changes.
2137 dns_fixedname_init(&dns_foundname);
2138 dns_rdataset_init(&found_rdataset);
2140 dns_db_currentversion(db, &cversionp);
2143 * Find the recently added name and rdata.
2145 dns_result = dns_db_find(db,
2146 dns_fixedname_name(&dns_newname),
2152 dns_fixedname_name(&dns_foundname),
2153 &found_rdataset, NULL);
2155 if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2156 t_info("dns_db_find %s returned %s\n", new_name,
2157 dns_result_totext(dns_result));
2158 dns_rdataset_disassociate(&found_rdataset);
2159 dns_db_detachnode(db, &nodep);
2160 dns_db_closeversion(db, &cversionp, ISC_FALSE);
2163 isc_entropy_detach(&ectx);
2164 isc_mem_destroy(&mctx);
2169 * Now check the rdata deletion.
2172 dns_rdataset_init(&found_rdataset);
2173 dns_fixedname_init(&dns_foundname);
2175 dns_result = dns_db_find(db, dns_fixedname_name(&dns_existingname),
2176 cversionp, existing_rdatatype, 0, 0,
2177 &nodep, dns_fixedname_name(&dns_foundname),
2178 &found_rdataset, NULL);
2181 if ((dns_result == ISC_R_NOTFOUND) ||
2182 (dns_result == DNS_R_NXDOMAIN) ||
2183 (dns_result == DNS_R_NXRRSET)) {
2185 t_info("dns_db_find %s returned %s\n", existing_name,
2186 dns_result_totext(dns_result));
2187 dns_rdataset_disassociate(&found_rdataset);
2188 dns_db_detachnode(db, &nodep);
2192 dns_db_detachnode(db, &nodep);
2193 dns_rdataset_disassociate(&found_rdataset);
2194 dns_db_closeversion(db, &cversionp, ISC_FALSE);
2197 isc_entropy_detach(&ectx);
2198 isc_mem_destroy(&mctx);
2212 t_assert("dns_db_closeversion", 11, T_REQUIRED, "%s", a11);
2213 result = t_eval("dns_db_closeversion_2_data",
2214 t_dns_db_closeversion_2, 9);
2218 static const char *a12 =
2219 "A call to dns_db_expirenode() marks as stale all records at node "
2220 "which expire at or before 'now'. If 'now' is zero, then the current "
2221 "time will be used.";
2224 t_dns_db_expirenode(char **av) {
2229 char *existing_name;
2232 char *exp_find_result;
2237 isc_result_t dns_result;
2238 isc_result_t exp_result;
2239 isc_result_t isc_result;
2241 isc_entropy_t *ectx;
2242 dns_dbnode_t *nodep;
2243 isc_buffer_t name_buffer;
2244 dns_fixedname_t dns_foundname;
2245 dns_fixedname_t dns_existingname;
2246 isc_stdtime_t node_expire_time;
2247 isc_stdtime_t find_expire_time;
2249 dns_rdataset_t rdataset;
2251 filename = T_ARG(0);
2255 existing_name = T_ARG(4);
2256 node_xtime = T_ARG(5);
2257 find_xtime = T_ARG(6);
2258 exp_find_result = T_ARG(7);
2262 result = T_UNRESOLVED;
2265 * Find a node, mark it as stale, do a dns_db_find on the name and
2266 * expect it to fail.
2269 t_info("testing using file %s and name %s\n", filename, existing_name);
2271 node_expire_time = (isc_stdtime_t) strtol(node_xtime, NULL, 10);
2272 find_expire_time = (isc_stdtime_t) strtol(find_xtime, NULL, 10);
2273 exp_result = t_dns_result_fromtext(exp_find_result);
2275 isc_stdtime_get(&now);
2277 dns_fixedname_init(&dns_existingname);
2278 len = strlen(existing_name);
2279 isc_buffer_init(&name_buffer, existing_name, len);
2280 isc_buffer_add(&name_buffer, len);
2281 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_existingname),
2282 &name_buffer, NULL, 0, NULL);
2283 if (dns_result != ISC_R_SUCCESS) {
2284 t_info("dns_name_fromtext failed %s\n",
2285 dns_result_totext(dns_result));
2286 return(T_UNRESOLVED);
2289 isc_result = isc_mem_create(0, 0, &mctx);
2290 if (isc_result != ISC_R_SUCCESS) {
2291 t_info("isc_mem_create failed %s\n",
2292 isc_result_totext(isc_result));
2293 return(T_UNRESOLVED);
2296 isc_result = isc_entropy_create(mctx, &ectx);
2297 if (isc_result != ISC_R_SUCCESS) {
2298 t_info("isc_entropy_create failed %s\n",
2299 isc_result_totext(isc_result));
2300 isc_mem_destroy(&mctx);
2301 return(T_UNRESOLVED);
2304 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2305 if (isc_result != ISC_R_SUCCESS) {
2306 t_info("isc_hash_create failed %s\n",
2307 isc_result_totext(isc_result));
2308 isc_entropy_detach(&ectx);
2309 isc_mem_destroy(&mctx);
2310 return(T_UNRESOLVED);
2314 dns_result = t_create(db_type, origin, class, "cache", mctx, &db);
2315 if (dns_result != ISC_R_SUCCESS) {
2317 isc_entropy_detach(&ectx);
2318 isc_mem_destroy(&mctx);
2319 return(T_UNRESOLVED);
2322 dns_result = dns_db_load(db, filename);
2323 if (dns_result != ISC_R_SUCCESS) {
2324 t_info("dns_db_load returned %s\n",
2325 dns_result_totext(dns_result));
2328 isc_entropy_detach(&ectx);
2329 isc_mem_destroy(&mctx);
2330 return(T_UNRESOLVED);
2336 * Check that the node is there.
2338 dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_existingname),
2340 if (dns_result != ISC_R_SUCCESS) {
2341 t_info("unable to find %s\n", existing_name);
2344 isc_entropy_detach(&ectx);
2345 isc_mem_destroy(&mctx);
2346 return(T_UNRESOLVED);
2352 if (node_expire_time != 0)
2353 node_expire_time += now;
2355 dns_result = dns_db_expirenode(db, nodep, node_expire_time);
2356 if (dns_result != ISC_R_SUCCESS) {
2357 t_info("dns_db_expirenode failed %s\n",
2358 dns_result_totext(dns_result));
2359 dns_db_detachnode(db, &nodep);
2362 isc_entropy_detach(&ectx);
2363 isc_mem_destroy(&mctx);
2367 dns_fixedname_init(&dns_foundname);
2368 dns_rdataset_init(&rdataset);
2369 dns_db_detachnode(db, &nodep);
2372 if (find_expire_time != 0)
2373 find_expire_time += now;
2375 dns_result = dns_db_find(db,
2376 dns_fixedname_name(&dns_existingname),
2382 dns_fixedname_name(&dns_foundname),
2385 if (dns_result == exp_result) {
2388 t_info("dns_db_find %s returned %s\n", existing_name,
2389 dns_result_totext(dns_result));
2393 if ((dns_result != ISC_R_NOTFOUND) &&
2394 (dns_result != DNS_R_NXDOMAIN) &&
2395 (dns_result != DNS_R_NXRRSET)) {
2398 * Don't need to disassociate the rdataset because
2399 * we're searching with dns_rdatatype_any.
2401 dns_db_detachnode(db, &nodep);
2407 isc_entropy_detach(&ectx);
2408 isc_mem_destroy(&mctx);
2417 t_assert("dns_db_expirenode", 12, T_REQUIRED, "%s", a12);
2418 result = t_eval("dns_db_expirenode_data", t_dns_db_expirenode, 8);
2422 static const char *a13 =
2423 "If the node name exists, then a call to "
2424 "dns_db_findnode(db, name, ISC_FALSE, nodep) initializes nodep "
2425 "to point to the node and returns ISC_R_SUCCESS, otherwise "
2426 "it returns ISC_R_NOTFOUND.";
2429 t_dns_db_findnode_1(char **av) {
2437 char *expected_result;
2442 isc_result_t dns_result;
2443 isc_result_t isc_result;
2445 isc_entropy_t *ectx;
2446 dns_dbnode_t *nodep;
2447 isc_buffer_t name_buffer;
2448 dns_rdataset_t rdataset;
2449 dns_rdatatype_t rdatatype;
2450 isc_textregion_t textregion;
2451 dns_fixedname_t dns_name;
2452 dns_dbversion_t *cversionp;
2453 isc_result_t exp_result;
2455 filename = T_ARG(0);
2460 find_name = T_ARG(5);
2461 find_type = T_ARG(6);
2462 expected_result = T_ARG(7);
2467 result = T_UNRESOLVED;
2469 t_info("testing using file %s and name %s\n", filename, find_name);
2471 exp_result = t_dns_result_fromtext(expected_result);
2473 textregion.base = find_type;
2474 textregion.length = strlen(find_type);
2475 dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
2476 if (dns_result != ISC_R_SUCCESS) {
2477 t_info("dns_rdatatype_fromtext %s failed %s\n",
2479 dns_result_totext(dns_result));
2480 return(T_UNRESOLVED);
2483 isc_result = isc_mem_create(0, 0, &mctx);
2484 if (isc_result != ISC_R_SUCCESS) {
2485 t_info("isc_mem_create failed %s\n",
2486 isc_result_totext(isc_result));
2487 return(T_UNRESOLVED);
2490 isc_result = isc_entropy_create(mctx, &ectx);
2491 if (isc_result != ISC_R_SUCCESS) {
2492 t_info("isc_entropy_create failed %s\n",
2493 isc_result_totext(isc_result));
2494 isc_mem_destroy(&mctx);
2495 return(T_UNRESOLVED);
2498 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2499 if (isc_result != ISC_R_SUCCESS) {
2500 t_info("isc_hash_create failed %s\n",
2501 isc_result_totext(isc_result));
2502 isc_mem_destroy(&mctx);
2503 return(T_UNRESOLVED);
2506 dns_result = t_create(db_type, origin, class, model, mctx, &db);
2507 if (dns_result != ISC_R_SUCCESS) {
2508 isc_mem_destroy(&mctx);
2509 return(T_UNRESOLVED);
2512 dns_result = dns_db_load(db, filename);
2513 if (dns_result != ISC_R_SUCCESS) {
2514 t_info("dns_db_load returned %s\n",
2515 dns_result_totext(dns_result));
2517 isc_mem_destroy(&mctx);
2518 return(T_UNRESOLVED);
2522 dns_fixedname_init(&dns_name);
2524 len = strlen(find_name);
2525 isc_buffer_init(&name_buffer, find_name, len);
2526 isc_buffer_add(&name_buffer, len);
2527 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_name),
2528 &name_buffer, NULL, 0, NULL);
2530 dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2532 if (dns_result != exp_result) {
2533 t_info("dns_db_findnode failed %s\n",
2534 dns_result_totext(dns_result));
2535 if (dns_result == ISC_R_SUCCESS)
2536 dns_db_detachnode(db, &nodep);
2538 isc_mem_destroy(&mctx);
2543 * if we're expecting the find to succeed and it did,
2544 * check that the node has been initialized
2545 * by checking for the specified type of rdata
2546 * and expecting the search to succeed
2549 if (dns_result == ISC_R_SUCCESS) {
2551 dns_db_currentversion(db, &cversionp);
2552 dns_rdataset_init(&rdataset);
2554 dns_result = dns_db_findrdataset(db, nodep, cversionp,
2556 0, &rdataset, NULL);
2557 if (dns_result == ISC_R_SUCCESS) {
2558 dns_rdataset_disassociate(&rdataset);
2561 t_info("dns_db_findrdataset failed %s\n",
2562 dns_result_totext(dns_result));
2565 dns_db_closeversion(db, &cversionp, ISC_FALSE);
2566 dns_db_detachnode(db, &nodep);
2573 isc_entropy_detach(&ectx);
2574 isc_mem_destroy(&mctx);
2583 t_assert("dns_db_findnode", 13, T_REQUIRED, "%s", a13);
2584 result = t_eval("dns_db_findnode_1_data", t_dns_db_findnode_1, 8);
2588 static const char *a14 =
2589 "If the node name does not exist and create is ISC_TRUE, "
2590 "then a call to dns_db_findnode(db, name, create, nodep) "
2591 "creates the node, initializes nodep to point to the node, "
2592 "and returns ISC_R_SUCCESS.";
2595 t_dns_db_findnode_2(char **av) {
2607 isc_result_t dns_result;
2608 isc_result_t isc_result;
2610 isc_entropy_t *ectx;
2611 dns_dbnode_t *nodep;
2612 dns_dbnode_t *newnodep;
2613 isc_buffer_t name_buffer;
2614 dns_rdataset_t rdataset;
2615 dns_fixedname_t dns_name;
2616 dns_fixedname_t dns_foundname;
2617 dns_dbversion_t *cversionp;
2619 filename = T_ARG(0);
2626 result = T_UNRESOLVED;
2632 t_info("testing using file %s and name %s\n", filename, newname);
2634 isc_result = isc_mem_create(0, 0, &mctx);
2635 if (isc_result != ISC_R_SUCCESS) {
2636 t_info("isc_mem_create failed %s\n",
2637 isc_result_totext(isc_result));
2638 return(T_UNRESOLVED);
2641 isc_result = isc_entropy_create(mctx, &ectx);
2642 if (isc_result != ISC_R_SUCCESS) {
2643 t_info("isc_entropy_create failed %s\n",
2644 isc_result_totext(isc_result));
2645 return(T_UNRESOLVED);
2648 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2649 if (isc_result != ISC_R_SUCCESS) {
2650 t_info("isc_hash_create failed %s\n",
2651 isc_result_totext(isc_result));
2652 return(T_UNRESOLVED);
2655 dns_result = t_create(db_type, origin, class, model, mctx, &db);
2656 if (dns_result != ISC_R_SUCCESS) {
2658 isc_entropy_detach(&ectx);
2659 isc_mem_destroy(&mctx);
2660 return(T_UNRESOLVED);
2663 dns_result = dns_db_load(db, filename);
2664 if (dns_result != ISC_R_SUCCESS) {
2665 t_info("dns_db_load returned %s\n",
2666 dns_result_totext(dns_result));
2669 isc_entropy_detach(&ectx);
2670 isc_mem_destroy(&mctx);
2671 return(T_UNRESOLVED);
2675 dns_fixedname_init(&dns_name);
2678 * Make sure the name isn't there
2680 len = strlen(newname);
2681 isc_buffer_init(&name_buffer, newname, len);
2682 isc_buffer_add(&name_buffer, len);
2683 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_name),
2684 &name_buffer, NULL, 0, NULL);
2686 dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2688 if ((dns_result != ISC_R_NOTFOUND) &&
2689 (dns_result != DNS_R_NXDOMAIN) &&
2690 (dns_result != DNS_R_NXRRSET)) {
2691 t_info("dns_db_findnode %s\n",
2692 dns_result_totext(dns_result));
2693 dns_db_detachnode(db, &nodep);
2696 isc_entropy_detach(&ectx);
2697 isc_mem_destroy(&mctx);
2698 return(T_UNRESOLVED);
2704 dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2706 if (dns_result != ISC_R_SUCCESS) {
2707 t_info("dns_db_findnode %s\n",
2708 dns_result_totext(dns_result));
2711 isc_entropy_detach(&ectx);
2712 isc_mem_destroy(&mctx);
2720 dns_rdataset_init(&rdataset);
2721 dns_fixedname_init(&dns_foundname);
2723 dns_db_currentversion(db, &cversionp);
2726 * First try dns_db_find DNS_R_NXDOMAIN.
2728 dns_result = dns_db_find(db,
2729 dns_fixedname_name(&dns_name),
2735 dns_fixedname_name(&dns_foundname),
2737 if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2738 dns_db_detachnode(db, &newnodep);
2741 if (dns_result != DNS_R_NXDOMAIN) {
2742 t_info("dns_db_find %s\n",
2743 dns_result_totext(dns_result));
2748 * Then try dns_db_findnode ISC_R_SUCCESS.
2750 dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_name),
2751 ISC_FALSE, &newnodep);
2752 t_info("dns_db_findnode %s\n", dns_result_totext(dns_result));
2753 if (dns_result == ISC_R_SUCCESS) {
2754 dns_db_detachnode(db, &newnodep);
2756 t_info("dns_db_findnode %s failed %s\n", newname,
2757 dns_result_totext(dns_result));
2762 dns_db_detachnode(db, &nodep);
2763 dns_db_closeversion(db, &cversionp, ISC_FALSE);
2766 isc_entropy_detach(&ectx);
2767 isc_mem_destroy(&mctx);
2781 t_assert("dns_db_findnode", 14, T_REQUIRED, "%s", a14);
2782 result = t_eval("dns_db_findnode_2_data", t_dns_db_findnode_2, 6);
2787 t_dns_db_find_x(char **av) {
2797 char *expected_result;
2803 isc_result_t dns_result;
2804 isc_result_t isc_result;
2805 isc_stdtime_t ftime;
2807 isc_result_t exp_result;
2809 isc_entropy_t *ectx;
2810 dns_dbnode_t *nodep;
2811 isc_textregion_t textregion;
2812 isc_buffer_t findname_buffer;
2813 dns_fixedname_t dns_findname;
2814 dns_fixedname_t dns_foundname;
2815 dns_rdataset_t rdataset;
2816 dns_rdatatype_t rdatatype;
2817 dns_dbversion_t *cversionp;
2819 result = T_UNRESOLVED;
2823 dborigin = T_ARG(2);
2826 findname = T_ARG(5);
2827 findtype = T_ARG(6);
2828 findopts = T_ARG(7);
2829 findtime = T_ARG(8);
2830 expected_result = T_ARG(9);
2836 t_info("testing using %s, name %s, type %s\n", dbfile, findname,
2839 isc_result = isc_mem_create(0, 0, &mctx);
2840 if (isc_result != ISC_R_SUCCESS) {
2841 t_info("isc_mem_create failed %s\n",
2842 isc_result_totext(isc_result));
2843 return(T_UNRESOLVED);
2846 isc_result = isc_entropy_create(mctx, &ectx);
2847 if (isc_result != ISC_R_SUCCESS) {
2848 t_info("isc_entropy_create failed %s\n",
2849 isc_result_totext(isc_result));
2850 isc_mem_destroy(&mctx);
2851 return(T_UNRESOLVED);
2854 isc_result = isc_hash_create(mctx, ectx, DNS_NAME_MAXWIRE);
2855 if (isc_result != ISC_R_SUCCESS) {
2856 t_info("isc_hash_create failed %s\n",
2857 isc_result_totext(isc_result));
2858 isc_entropy_detach(&ectx);
2859 isc_mem_destroy(&mctx);
2860 return(T_UNRESOLVED);
2863 dns_result = t_create(dbtype, dborigin, dbclass, dbmodel, mctx, &db);
2864 if (dns_result != ISC_R_SUCCESS) {
2866 isc_entropy_detach(&ectx);
2867 isc_mem_destroy(&mctx);
2868 return(T_UNRESOLVED);
2871 dns_result = dns_db_load(db, dbfile);
2872 if (dns_result != ISC_R_SUCCESS) {
2873 t_info("dns_db_load returned %s\n",
2874 dns_result_totext(dns_result));
2877 isc_entropy_detach(&ectx);
2878 isc_mem_destroy(&mctx);
2879 return(T_UNRESOLVED);
2882 exp_result = t_dns_result_fromtext(expected_result);
2884 dns_fixedname_init(&dns_findname);
2885 len = strlen(findname);
2886 isc_buffer_init(&findname_buffer, findname, len);
2887 isc_buffer_add(&findname_buffer, len);
2888 dns_result = dns_name_fromtext(dns_fixedname_name(&dns_findname),
2889 &findname_buffer, NULL, 0, NULL);
2890 if (dns_result != ISC_R_SUCCESS) {
2891 t_info("dns_name_fromtext failed %s\n",
2892 dns_result_totext(dns_result));
2895 isc_entropy_detach(&ectx);
2896 isc_mem_destroy(&mctx);
2897 return(T_UNRESOLVED);
2900 textregion.base = findtype;
2901 textregion.length = strlen(findtype);
2902 dns_result = dns_rdatatype_fromtext(&rdatatype, &textregion);
2903 if (dns_result != ISC_R_SUCCESS) {
2904 t_info("dns_rdatatype_fromtext %s failed %s\n",
2906 dns_result_totext(dns_result));
2909 isc_entropy_detach(&ectx);
2910 isc_mem_destroy(&mctx);
2911 return(T_UNRESOLVED);
2914 if (strstr(findopts, "DNS_DBFIND_GLUEOK"))
2915 opts |= DNS_DBFIND_GLUEOK;
2916 if (strstr(findopts, "DNS_DBFIND_VALIDATEGLUE"))
2917 opts |= DNS_DBFIND_VALIDATEGLUE;
2919 isc_stdtime_get(&now);
2921 ftime = strtol(findtime, NULL, 10);
2926 dns_fixedname_init(&dns_foundname);
2927 dns_rdataset_init(&rdataset);
2928 if (dns_db_iszone(db))
2929 dns_db_currentversion(db, &cversionp);
2932 dns_result = dns_db_find(db,
2933 dns_fixedname_name(&dns_findname),
2939 dns_fixedname_name(&dns_foundname),
2942 if (dns_result != exp_result) {
2943 t_info("dns_db_find %s %s unexpectedly returned %s, "
2945 findname, findtype, dns_result_totext(dns_result),
2946 dns_result_totext(exp_result));
2952 if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) {
2954 if ((dns_result != DNS_R_NXRRSET) &&
2955 (dns_result != DNS_R_ZONECUT))
2956 if (dns_rdataset_isassociated(&rdataset))
2957 dns_rdataset_disassociate(&rdataset);
2958 dns_db_detachnode(db, &nodep);
2961 if (dns_db_iszone(db))
2962 dns_db_closeversion(db, &cversionp, ISC_FALSE);
2965 isc_entropy_detach(&ectx);
2966 isc_mem_destroy(&mctx);
2971 static const char *a15 =
2972 "A call to dns_db_find(db, name, version, type, options, now, ...) "
2973 "finds the best match for 'name' and 'type' in version 'version' "
2980 t_assert("dns_db_find", 15, T_REQUIRED, "%s", a15);
2981 result = t_eval("dns_db_find_1_data", t_dns_db_find_x, 10);
2986 static const char *a16 =
2987 "When the desired node and type were found, but are glue, "
2988 "and the DNS_DBFIND_GLUEOK option is set, a call to "
2989 "dns_db_find(db, name, version, type, options, now, ...) "
2990 "returns DNS_R_GLUE.";
2996 t_assert("dns_db_find", 16, T_REQUIRED, "%s", a16);
2997 result = t_eval("dns_db_find_2_data", t_dns_db_find_x, 10);
3001 static const char *a17 =
3002 "A call to dns_db_find() returns DNS_R_DELEGATION when the data "
3003 "requested is beneath a zone cut.";
3009 t_assert("dns_db_find", 17, T_REQUIRED, "%s", a17);
3010 result = t_eval("dns_db_find_3_data", t_dns_db_find_x, 10);
3014 static const char *a18 =
3015 "A call to dns_db_find() returns DNS_R_DELEGATION when type is "
3016 "dns_rdatatype_any and the desired node is a zone cut.";
3022 t_assert("dns_db_find", 18, T_REQUIRED, "%s", a18);
3023 result = t_eval("dns_db_find_4_data", t_dns_db_find_x, 10);
3027 static const char *a19 =
3028 "A call to dns_db_find() returns DNS_R_DNAME when the data "
3029 "requested is beneath a DNAME.";
3035 t_assert("dns_db_find", 19, T_REQUIRED, "%s", a19);
3036 result = t_eval("dns_db_find_5_data", t_dns_db_find_x, 10);
3040 static const char *a20 =
3041 "A call to dns_db_find() returns DNS_R_CNAME when the requested "
3042 "rdataset was not found but there is a CNAME at the desired name.";
3048 t_assert("dns_db_find", 20, T_REQUIRED, "%s", a20);
3049 result = t_eval("dns_db_find_6_data", t_dns_db_find_x, 10);
3053 static const char *a21 =
3054 "A call to dns_db_find() returns DNS_R_NXDOMAIN when name "
3061 t_assert("dns_db_find", 21, T_REQUIRED, "%s", a21);
3062 result = t_eval("dns_db_find_7_data", t_dns_db_find_x, 10);
3066 static const char *a22 =
3067 "A call to dns_db_find() returns DNS_R_NXRRSET when "
3068 "the desired name exists, but the desired type does not.";
3074 t_assert("dns_db_find", 22, T_REQUIRED, "%s", a22);
3075 result = t_eval("dns_db_find_8_data", t_dns_db_find_x, 10);
3079 static const char *a23 =
3080 "When db is a cache database, a call to dns_db_find() "
3081 "returns ISC_R_NOTFOUND when the desired name does not exist, "
3082 "and no delegation could be found.";
3088 t_assert("dns_db_find", 23, T_REQUIRED, "%s", a23);
3089 result = t_eval("dns_db_find_9_data", t_dns_db_find_x, 10);
3093 static const char *a24 =
3094 "When db is a cache database, an rdataset will be found only "
3095 "if at least one rdataset at the found node expires after 'now'.";
3101 t_assert("dns_db_find", 24, T_REQUIRED, "%s", a24);
3102 result = t_eval("dns_db_find_10_data", t_dns_db_find_x, 10);
3106 static const char *a25 =
3107 "A call to dns_db_load(db, filename) returns DNS_R_NOTZONETOP "
3108 "when the zone data contains a SOA not at the zone apex.";
3114 t_assert("dns_db_load", 25, T_REQUIRED, "%s", a25);
3115 result = t_eval("dns_db_load_soa_not_top", t_dns_db_load, 9);
3119 testspec_t T_testlist[] = {
3120 { t1, "dns_db_load" },
3121 { t2, "dns_db_iscache" },
3122 { t3, "dns_db_iscache" },
3123 { t4, "dns_db_iszone" },
3124 { t5, "dns_db_iszone" },
3125 { t6, "dns_db_origin" },
3126 { t7, "dns_db_class" },
3127 { t8, "dns_db_currentversion" },
3128 { t9, "dns_db_newversion" },
3129 { t10, "dns_db_closeversion" },
3130 { t11, "dns_db_closeversion" },
3131 { t12, "dns_db_expirenode" },
3132 { t13, "dns_db_findnode" },
3133 { t14, "dns_db_findnode" },
3134 { t15, "dns_db_find" },
3135 { t16, "dns_db_find" },
3136 { t17, "dns_db_find" },
3137 { t18, "dns_db_find" },
3138 { t19, "dns_db_find" },
3139 { t20, "dns_db_find" },
3140 { t21, "dns_db_find" },
3141 { t22, "dns_db_find" },
3142 { t23, "dns_db_find" },
3143 { t24, "dns_db_find" },
3144 { t25, "dns_db_load" },