From: Colin Vidal Date: Thu, 6 Nov 2025 13:35:33 +0000 (+0100) Subject: split ede24 system test into separate modules X-Git-Tag: v9.21.16~58^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=11a4df7ec5af1ac9197d0870f28fe83cf7b4ff48;p=thirdparty%2Fbind9.git split ede24 system test into separate modules Because ede24 system tests require stopping/restarting server, there is always the risk that the test ends (with a failure) with server in an wrong and impredictible state. This would make the other tests to fail in a strange way as well. To avoid this problem, split the test into different modules, so if a module fails, the other module is not impacted as it uses separate server instances. --- diff --git a/bin/tests/system/ede24/common.py b/bin/tests/system/ede24/common.py new file mode 100644 index 00000000000..89b37b2993c --- /dev/null +++ b/bin/tests/system/ede24/common.py @@ -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 isctest + + +def check_soa_noerror(): + msg = isctest.query.create("foo.fr", "SOA") + res = isctest.query.udp(msg, "10.53.0.2") + isctest.check.noerror(res) + + +def check_soa_servfail_ede24(edemsg): + msg = isctest.query.create("foo.fr", "SOA") + res = isctest.query.udp(msg, "10.53.0.2") + isctest.check.servfail(res) + + # Few CI machines uses old version of dnspython which doesn't supports + # EDNS, so we effectively bypass the check for those one. (It's fine, a + # bunch of other CI machines _does_ have recent version of dnspython). + if hasattr(res, "extended_errors"): + assert len(res.extended_errors()) == 1 + assert res.extended_errors()[0].to_text() == f"EDE 24 (Invalid Data): {edemsg}" + + +def check_ns2_ready(ns2): + # Sanity check that everything works first, once we're sure the foo.fr zone + # has transfered to ns2. + with ns2.watch_log_from_start() as watcher: + watcher.wait_for_line("Transfer status: success") + check_soa_noerror() diff --git a/bin/tests/system/ede24/tests_ede24.py b/bin/tests/system/ede24/tests_ede24.py deleted file mode 100644 index a492ff74577..00000000000 --- a/bin/tests/system/ede24/tests_ede24.py +++ /dev/null @@ -1,78 +0,0 @@ -# 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 os - -import isctest - - -def check_soa_noerror(): - msg = isctest.query.create("foo.fr", "SOA") - res = isctest.query.udp(msg, "10.53.0.2") - isctest.check.noerror(res) - - -def check_soa_servfail_ede24(edemsg): - msg = isctest.query.create("foo.fr", "SOA") - res = isctest.query.udp(msg, "10.53.0.2") - isctest.check.servfail(res) - - # Few CI machines uses old version of dnspython which doesn't supports - # EDNS, so we effectively bypass the check for those one. (It's fine, a - # bunch of other CI machines _does_ have recent version of dnspython). - if hasattr(res, "extended_errors"): - assert len(res.extended_errors()) == 1 - assert res.extended_errors()[0].to_text() == f"EDE 24 (Invalid Data): {edemsg}" - - -def test_ede24_noloaded(ns1, ns2): - # Sanity check that everything works first, once we're sure the foo.fr zone - # has transfered to ns2. - with ns2.watch_log_from_start() as watcher: - watcher.wait_for_line("Transfer status: success") - check_soa_noerror() - - # Stop all servers, and we'll restart only ns2. - ns1.stop() - ns2.stop() - with ns2.watch_log_from_here() as watcher: - ns2.start(["--noclean", "--restart", "--port", os.environ["PORT"]]) - watcher.wait_for_line("failure trying primary 10.53.0.1") - - # ns2 attempts an XFR but ns1 since is off the zone DB can't be loaded. - check_soa_servfail_ede24("zone not loaded") - - -def test_ede24_expired(ns1, ns2): - # Restart ns1 then checks the server notify the zone in ns2 and ns2 serves - # the zone again. - with ns2.watch_log_from_here() as watcher: - ns1.start(["--noclean", "--restart", "--port", os.environ["PORT"]]) - watcher.wait_for_line("Transfer status: success") - check_soa_noerror() - - # Stop the primary and wait for expiration of the zone in the secondary. - with ns2.watch_log_from_here() as watcher: - ns1.stop() - log_sequence = [ - " zone foo.fr/IN: expired", - " zone foo.fr/IN: stop zone timer", - ] - watcher.wait_for_sequence(log_sequence) - - # ns2 can't answer anymore. - check_soa_servfail_ede24("zone expired") - - # Restart the primary and wait for the zone to be back up again. - with ns2.watch_log_from_here() as watcher: - ns1.start(["--noclean", "--restart", "--port", os.environ["PORT"]]) - watcher.wait_for_line("Transfer status: success") - check_soa_noerror() diff --git a/bin/tests/system/ede24/tests_ede24_expired.py b/bin/tests/system/ede24/tests_ede24_expired.py new file mode 100644 index 00000000000..02e129f4ba1 --- /dev/null +++ b/bin/tests/system/ede24/tests_ede24_expired.py @@ -0,0 +1,36 @@ +# 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 os + +from ede24.common import check_ns2_ready, check_soa_noerror, check_soa_servfail_ede24 + + +def test_ede24_expired(ns1, ns2): + check_ns2_ready(ns2) + + # Stop the primary and wait for expiration of the zone in the secondary. + with ns2.watch_log_from_here() as watcher: + ns1.stop() + log_sequence = [ + " zone foo.fr/IN: expired", + " zone foo.fr/IN: stop zone timer", + ] + watcher.wait_for_sequence(log_sequence) + + # ns2 can't answer anymore. + check_soa_servfail_ede24("zone expired") + + # Restart the primary and wait for the zone to be back up again. + with ns2.watch_log_from_here() as watcher: + ns1.start(["--noclean", "--restart", "--port", os.environ["PORT"]]) + watcher.wait_for_line("Transfer status: success") + check_soa_noerror() diff --git a/bin/tests/system/ede24/tests_ede24_noloaded.py b/bin/tests/system/ede24/tests_ede24_noloaded.py new file mode 100644 index 00000000000..90b77b8a556 --- /dev/null +++ b/bin/tests/system/ede24/tests_ede24_noloaded.py @@ -0,0 +1,28 @@ +# 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 os + +from ede24.common import check_ns2_ready, check_soa_servfail_ede24 + + +def test_ede24_noloaded(ns1, ns2): + check_ns2_ready(ns2) + + # Stop all servers, and we'll restart only ns2. + ns1.stop() + ns2.stop() + with ns2.watch_log_from_here() as watcher: + ns2.start(["--noclean", "--restart", "--port", os.environ["PORT"]]) + watcher.wait_for_line("failure trying primary 10.53.0.1") + + # ns2 attempts an XFR but ns1 since is off the zone DB can't be loaded. + check_soa_servfail_ede24("zone not loaded")