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.
This commit is contained in:
Colin Vidal 2025-11-06 14:35:33 +01:00
parent 611a556a6c
commit 11a4df7ec5
4 changed files with 103 additions and 78 deletions

View file

@ -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()

View file

@ -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()

View file

@ -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()

View file

@ -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")