From: Nicki Křížek Date: Wed, 10 Sep 2025 09:09:41 +0000 (+0200) Subject: Add module-specific python setup to system tests X-Git-Tag: v9.21.15~51^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7474d3829513d90370e6792dc9ceb68a6738328c;p=thirdparty%2Fbind9.git Add module-specific python setup to system tests During the system test execution, allow use of module-specific bootstrap() function in addition to the setup.sh script which this function should ultimately replace. The purpose of bootstrap() 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. --- diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index fc346865ddf..17985b8f07f 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -641,7 +641,7 @@ vulture: <<: *python_triggering_rules needs: [] script: - - vulture --exclude "*ans.py,conftest.py,isctest" --ignore-names "pytestmark,reconfigure_policy,setup_filters" bin/tests/system/ + - vulture --exclude "*ans.py,conftest.py,isctest" --ignore-names "bootstrap,pytestmark,reconfigure_policy,setup_filters" bin/tests/system/ ci-variables: <<: *precheck_job diff --git a/bin/tests/system/conftest.py b/bin/tests/system/conftest.py index 21c406e0840..bbb2c283859 100644 --- a/bin/tests/system/conftest.py +++ b/bin/tests/system/conftest.py @@ -555,14 +555,26 @@ def system_test( pytest.skip("Prerequisites missing.") def setup_test(): - templates.render_auto() - try: - isctest.run.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: + isctest.run.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: diff --git a/bin/tests/system/isctest/template.py b/bin/tests/system/isctest/template.py index 17cf7a2e1d6..7ac7c8b4f0f 100644 --- a/bin/tests/system/isctest/template.py +++ b/bin/tests/system/isctest/template.py @@ -68,14 +68,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)