]> 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 14:26:38 +0000 (16:26 +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.

(cherry picked from commit 7474d3829513d90370e6792dc9ceb68a6738328c)

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

index 562393663fa3de68baa7908503b672afd02c12c4..0e3f9fc22dc6a965417e8c3c537248dab47111a8 100644 (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 "bootstrap,pytestmark" bin/tests/system/
 
 ci-variables:
   <<: *precheck_job
index 2ea55e8aa6cb4f3d87cd1de67881b88d3f16ca14..b3b790c11f6fc24e7ef8a2744a9acdd5f0c744c0 100644 (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:
index 123d758ab04b5b53cd559e948ee8aa682a33cc94..3b175b9709ce64aa718024008b3318b86088fd45 100644 (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)