]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add module-specific python setup to system tests
authorNicki Křížek <nicki@isc.org>
Wed, 10 Sep 2025 09:09:41 +0000 (11:09 +0200)
committerNicki Křížek <nicki@isc.org>
Tue, 21 Oct 2025 13:07:49 +0000 (15:07 +0200)
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.

.gitlab-ci.yml
bin/tests/system/conftest.py
bin/tests/system/isctest/template.py

index fc346865ddfde74f8de5ac6f7f7106b37188287e..17985b8f07f75c23fac65ebe3484dd492daebd9a 100644 (file)
@@ -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
index 21c406e0840c7ebce9180c2ed1ff9a91e95681e8..bbb2c283859608fd5c8555013551645beddd3b57 100644 (file)
@@ -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:
index 17cf7a2e1d6f88eb3790f26516f1db7701121ad1..7ac7c8b4f0fb3e3625efe98877b94610c3c5ef38 100644 (file)
@@ -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)