[9.18] new: test: Add module-specific python setup to system tests

During the system test execution, allow use of module-specific setup()
function in addition to the setup.sh script which this function should
ultimately replace.

The purpose of setup() is two-fold. First, it can execute any commands
needed to create the initial conditions for the test, such as creating
key materials, manipulating files etc. Second, it should return any
test-specific template values as a dictionary. Those will be used to
render the jinja2 templates.

Backport of MR !10983

Merge branch 'backport-nicki/pytest-add-python-setup-func-9.18' into 'bind-9.18'

See merge request isc-projects/bind9!11127
This commit is contained in:
Nicki Křížek 2025-10-21 18:20:04 +02:00
commit bb2654801b
3 changed files with 25 additions and 13 deletions

View file

@ -649,7 +649,7 @@ vulture:
<<: *python_triggering_rules
needs: []
script:
- vulture --exclude "*/ans*/ans.py,conftest.py,get_algorithms.py,isctest" --ignore-names "pytestmark" bin/tests/system/
- vulture --exclude "*/ans*/ans.py,conftest.py,get_algorithms.py,isctest" --ignore-names "after_servers_start,bootstrap,pytestmark" bin/tests/system/
ci-variables:
<<: *precheck_job

View file

@ -656,14 +656,26 @@ def system_test(
pytest.skip("Prerequisites missing.")
def setup_test():
templates.render_auto()
try:
shell(f"{system_test_dir}/setup.sh")
except FileNotFoundError:
pass # setup.sh is optional
except subprocess.CalledProcessError as exc:
isctest.log.error("Failed to run test setup")
pytest.fail(f"setup.sh exited with {exc.returncode}")
template_data = None
bootstrap_fn = getattr(request.module, "bootstrap", None)
if bootstrap_fn:
isctest.log.debug("Running test bootstrap()")
try:
template_data = bootstrap_fn()
except Exception as exc: # pylint: disable=broad-exception-caught
isctest.log.error("Failed to run test bootstrap()")
kind = type(exc).__name__
pytest.fail(f"bootstrap() failed with {kind}")
templates.render_auto(template_data)
setup_sh_path = f"{system_test_dir}/setup.sh"
if os.path.exists(setup_sh_path):
try:
shell(f"{system_test_dir}/setup.sh")
except subprocess.CalledProcessError as exc:
isctest.log.error("Failed to run test setup.sh")
pytest.fail(f"setup.sh exited with {exc.returncode}")
def start_servers():
try:

View file

@ -87,14 +87,14 @@ class TemplateEngine:
stream = self.j2env.get_template(template).stream(data)
stream.dump(output, encoding="utf-8")
def render_auto(self):
def render_auto(self, data: Optional[Dict[str, Any]] = None):
"""
Render all *.j2 templates with default values and write the output to
files without the .j2 extensions.
Render all *.j2 templates with default (and optionally the provided)
values and write the output to files without the .j2 extensions.
"""
templates = [
str(filepath.relative_to(self.directory))
for filepath in self.directory.rglob("*.j2")
]
for template in templates:
self.render(template[:-3])
self.render(template[:-3], data)