]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
test that cache is preserved on reconfing failure
authorColin Vidal <colin@isc.org>
Tue, 16 Sep 2025 15:14:46 +0000 (17:14 +0200)
committerColin Vidal <colin@isc.org>
Wed, 17 Sep 2025 14:45:51 +0000 (16:45 +0200)
A named bug scrap the cache on a second reload after an initial reload
failure. Adds a test checking that the cache is preserved between server
reconfiguration/reloads even if it fails at some point (after attempting
to re-use the cache) and the server is re-loaded later.

bin/tests/system/resolver/ns1/named.conf.j2 [new file with mode: 0644]
bin/tests/system/resolver/tests_resolver.py [new file with mode: 0644]
bin/tests/system/resolver/tests_sh_resolver.py

diff --git a/bin/tests/system/resolver/ns1/named.conf.j2 b/bin/tests/system/resolver/ns1/named.conf.j2
new file mode 100644 (file)
index 0000000..ff3caa8
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+ *
+ * SPDX-License-Identifier: MPL-2.0
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0.  If a copy of the MPL was not distributed with this
+ * file, you can obtain one at https://mozilla.org/MPL/2.0/.
+ *
+ * See the COPYRIGHT file distributed with this work for additional
+ * information regarding copyright ownership.
+ */
+{% set wrongoption = wrongoption | default(False) %}
+
+options {
+       query-source address 10.53.0.1;
+       notify-source 10.53.0.1;
+       transfer-source 10.53.0.1;
+       port @PORT@;
+       pid-file "named.pid";
+       listen-on { 10.53.0.1; };
+       listen-on-v6 { none; };
+       recursion yes;
+       dnssec-validation no;
+       attach-cache "globalcache";
+        max-zone-ttl unlimited;
+        resolver-query-timeout 5000; # 5 seconds
+        max-recursion-queries 100;
+        request-zoneversion yes;
+};
+
+view "default" {
+       zone "." {
+               type hint;
+               file "root.hint";
+       };
+{% if wrongoption %}
+       forwarders port 9999999 { 127.0.0.1; };
+{% endif %}
+};
+
+key rndc_key {
+       secret "1234abcd8765";
+       algorithm @DEFAULT_HMAC@;
+};
+
+controls {
+       inet 10.53.0.1 port @CONTROLPORT@ allow { any; } keys { rndc_key; };
+};
diff --git a/bin/tests/system/resolver/tests_resolver.py b/bin/tests/system/resolver/tests_resolver.py
new file mode 100644 (file)
index 0000000..286a33e
--- /dev/null
@@ -0,0 +1,39 @@
+# Copyright (C) Internet Systems Consortium, Inc. ("ISC")
+#
+# SPDX-License-Identifier: MPL-2.0
+#
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0.  If a copy of the MPL was not distributed with this
+# file, you can obtain one at https://mozilla.org/MPL/2.0/.
+#
+# See the COPYRIGHT file distributed with this work for additional
+# information regarding copyright ownership.
+
+import time
+
+
+import isctest
+
+
+def test_resolver_cache_reloadfails(ns1, templates):
+    ns1.rndc("flush")
+    msg = isctest.query.create("www.example.org.", "A")
+    res = isctest.query.udp(msg, "10.53.0.1")
+    isctest.check.noerror(res)
+    assert res.answer[0].ttl == 300
+    templates.render("ns1/named.conf", {"wrongoption": True})
+    try:
+        # The first reload fails, and the old cache list will be preserved
+        ns1.rndc("reload")
+    except isctest.rndc.RNDCException:
+        templates.render("ns1/named.conf", {"wrongoption": False})
+        # The second reload succeed, and the cache is still there, as preserved
+        # from the old cache list
+        ns1.rndc("reload")
+        time.sleep(3)
+        msg = isctest.query.create("www.example.org.", "A")
+        res = isctest.query.udp(msg, "10.53.0.1")
+        isctest.check.noerror(res)
+        # The ttl being lower than 300 (provided by fake authoritative) proves
+        # the cache is still in use
+        assert res.answer[0].ttl < 300
index 10a36ce4e4f5c1d2282db3ea8cd55d389b15a57a..0a90735408e086ffb95fd6a426b8ded671d52dd5 100644 (file)
@@ -11,6 +11,7 @@
 
 import pytest
 
+
 pytestmark = pytest.mark.extra_artifacts(
     [
         ".digrc",