about summary refs log tree commit diff
path: root/nixos
diff options
context:
space:
mode:
authorSandro <sandro.jaeckel@gmail.com>2024-05-23 13:54:39 +0200
committerGitHub <noreply@github.com>2024-05-23 13:54:39 +0200
commit360221d4bf8af6bf74c00a4e07fffbf8479de7dd (patch)
tree765f11c274e3dcb16d73683698223a754bbc6e05 /nixos
parent56141e2236e2607f3e54858a9617b2eb8b4adee8 (diff)
parent2c4128ea01c48cdd3e0adce10aaffd7c44495ea7 (diff)
Merge pull request #313096 from onny/stalwart-fix-test
Diffstat (limited to 'nixos')
-rw-r--r--nixos/modules/services/mail/stalwart-mail.nix4
-rw-r--r--nixos/tests/stalwart-mail.nix241
2 files changed, 136 insertions, 109 deletions
diff --git a/nixos/modules/services/mail/stalwart-mail.nix b/nixos/modules/services/mail/stalwart-mail.nix
index c69a2ca400bae..06b48c86907c5 100644
--- a/nixos/modules/services/mail/stalwart-mail.nix
+++ b/nixos/modules/services/mail/stalwart-mail.nix
@@ -70,7 +70,9 @@ in {
       storage.lookup = mkDefault "db";
       storage.blob = mkDefault "blob";
       resolver.type = mkDefault "system";
-      resolver.public-suffix = mkDefault ["https://publicsuffix.org/list/public_suffix_list.dat"];
+      resolver.public-suffix = lib.mkDefault [
+        "file://${pkgs.publicsuffix-list}/share/publicsuffix/public_suffix_list.dat"
+      ];
     };
 
     systemd.services.stalwart-mail = {
diff --git a/nixos/tests/stalwart-mail.nix b/nixos/tests/stalwart-mail.nix
index 581090cd70f48..4075b32e2c1f7 100644
--- a/nixos/tests/stalwart-mail.nix
+++ b/nixos/tests/stalwart-mail.nix
@@ -1,122 +1,147 @@
 # Rudimentary test checking that the Stalwart email server can:
 # - receive some message through SMTP submission, then
 # - serve this message through IMAP.
+{
+  system ? builtins.currentSystem,
+  config ? { },
+  pkgs ? import ../../.. { inherit system config; },
 
+  lib ? pkgs.lib,
+}:
 let
   certs = import ./common/acme/server/snakeoil-certs.nix;
   domain = certs.domain;
-
-in import ./make-test-python.nix ({ lib, ... }: {
-  name = "stalwart-mail";
-
-  nodes.main = { pkgs, ... }: {
-    security.pki.certificateFiles = [ certs.ca.cert ];
-
-    services.stalwart-mail = {
-      enable = true;
-      settings = {
-        server.hostname = domain;
-
-        certificate."snakeoil" = {
-          cert = "file://${certs.${domain}.cert}";
-          private-key = "file://${certs.${domain}.key}";
-        };
-
-        server.tls = {
-          certificate = "snakeoil";
+  makeTest = import ./make-test-python.nix;
+  mkTestName =
+    pkg: "${pkg.pname}_${pkg.version}";
+  stalwartPackages = {
+    inherit (pkgs) stalwart-mail_0_6 stalwart-mail;
+  };
+  stalwartAtLeast = lib.versionAtLeast;
+  makeStalwartTest =
+    {
+      package,
+      name ? mkTestName package,
+    }:
+    makeTest {
+      inherit name;
+      meta.maintainers = with lib.maintainers; [
+        happysalada pacien onny
+      ];
+
+      nodes.machine = { lib, ... }: {
+
+        security.pki.certificateFiles = [ certs.ca.cert ];
+
+        services.stalwart-mail = {
           enable = true;
-          implicit = false;
-        };
-
-        server.listener = {
-          "smtp-submission" = {
-            bind = [ "[::]:587" ];
-            protocol = "smtp";
-          };
-
-          "imap" = {
-            bind = [ "[::]:143" ];
-            protocol = "imap";
+          inherit package;
+          settings = {
+            server.hostname = domain;
+
+            # TODO: Remove backwards compatibility as soon as we drop legacy version 0.6.0
+            certificate."snakeoil" = let
+              certPath = if stalwartAtLeast package.version "0.7.0" then "%{file://${certs.${domain}.cert}}%" else "file://${certs.${domain}.cert}";
+              keyPath = if stalwartAtLeast package.version "0.7.0" then "%{file:${certs.${domain}.key}}%" else "file://${certs.${domain}.key}";
+            in {
+              cert = certPath;
+              private-key = keyPath;
+            };
+
+            server.tls = {
+              certificate = "snakeoil";
+              enable = true;
+              implicit = false;
+            };
+
+            server.listener = {
+              "smtp-submission" = {
+                bind = [ "[::]:587" ];
+                protocol = "smtp";
+              };
+
+              "imap" = {
+                bind = [ "[::]:143" ];
+                protocol = "imap";
+              };
+            };
+
+            session.auth.mechanisms = "[plain]";
+            session.auth.directory = "'in-memory'";
+            storage.directory = "in-memory";
+
+            session.rcpt.directory = "'in-memory'";
+            queue.outbound.next-hop = "'local'";
+
+            directory."in-memory" = {
+              type = "memory";
+              # TODO: Remove backwards compatibility as soon as we drop legacy version 0.6.0
+              principals = let
+                condition = if stalwartAtLeast package.version "0.7.0" then "class" else "type";
+              in builtins.map (p: p // { ${condition} = "individual"; }) [
+                {
+                  name = "alice";
+                  secret = "foobar";
+                  email = [ "alice@${domain}" ];
+                }
+                {
+                  name = "bob";
+                  secret = "foobar";
+                  email = [ "bob@${domain}" ];
+                }
+              ];
+            };
           };
         };
 
-        resolver.public-suffix = [ ];  # do not fetch from web in sandbox
-
-        session.auth.mechanisms = "[plain]";
-        session.auth.directory = "'in-memory'";
-        storage.directory = "in-memory";
-
-        session.rcpt.directory = "'in-memory'";
-        queue.outbound.next-hop = "'local'";
-
-        directory."in-memory" = {
-          type = "memory";
-          principals = [
-            {
-              type = "individual";
-              name = "alice";
-              secret = "foobar";
-              email = [ "alice@${domain}" ];
-            }
-            {
-              type = "individual";
-              name = "bob";
-              secret = "foobar";
-              email = [ "bob@${domain}" ];
-            }
-          ];
-        };
-      };
-    };
+        environment.systemPackages = [
+          (pkgs.writers.writePython3Bin "test-smtp-submission" { } ''
+            from smtplib import SMTP
+
+            with SMTP('localhost', 587) as smtp:
+                smtp.starttls()
+                smtp.login('alice', 'foobar')
+                smtp.sendmail(
+                    'alice@${domain}',
+                    'bob@${domain}',
+                    """
+                        From: alice@${domain}
+                        To: bob@${domain}
+                        Subject: Some test message
+
+                        This is a test message.
+                    """.strip()
+                )
+          '')
+
+          (pkgs.writers.writePython3Bin "test-imap-read" { } ''
+            from imaplib import IMAP4
+
+            with IMAP4('localhost') as imap:
+                imap.starttls()
+                status, [caps] = imap.login('bob', 'foobar')
+                assert status == 'OK'
+                imap.select()
+                status, [ref] = imap.search(None, 'ALL')
+                assert status == 'OK'
+                [msgId] = ref.split()
+                status, msg = imap.fetch(msgId, 'BODY[TEXT]')
+                assert status == 'OK'
+                assert msg[0][1].strip() == b'This is a test message.'
+          '')
+        ];
 
-    environment.systemPackages = [
-      (pkgs.writers.writePython3Bin "test-smtp-submission" { } ''
-        from smtplib import SMTP
-
-        with SMTP('localhost', 587) as smtp:
-            smtp.starttls()
-            smtp.login('alice', 'foobar')
-            smtp.sendmail(
-                'alice@${domain}',
-                'bob@${domain}',
-                """
-                    From: alice@${domain}
-                    To: bob@${domain}
-                    Subject: Some test message
-
-                    This is a test message.
-                """.strip()
-            )
-      '')
-
-      (pkgs.writers.writePython3Bin "test-imap-read" { } ''
-        from imaplib import IMAP4
-
-        with IMAP4('localhost') as imap:
-            imap.starttls()
-            status, [caps] = imap.login('bob', 'foobar')
-            assert status == 'OK'
-            imap.select()
-            status, [ref] = imap.search(None, 'ALL')
-            assert status == 'OK'
-            [msgId] = ref.split()
-            status, msg = imap.fetch(msgId, 'BODY[TEXT]')
-            assert status == 'OK'
-            assert msg[0][1].strip() == b'This is a test message.'
-      '')
-    ];
-  };
-
-  testScript = /* python */ ''
-    main.wait_for_unit("stalwart-mail.service")
-    main.wait_for_open_port(587)
-    main.wait_for_open_port(143)
+      };
 
-    main.succeed("test-smtp-submission")
-    main.succeed("test-imap-read")
-  '';
+      testScript = ''
+        start_all()
+        machine.wait_for_unit("stalwart-mail.service")
+        machine.wait_for_open_port(587)
+        machine.wait_for_open_port(143)
 
-  meta = {
-    maintainers = with lib.maintainers; [ happysalada pacien ];
-  };
-})
+        machine.succeed("test-smtp-submission")
+        machine.succeed("test-imap-read")
+      '';
+    };
+in
+lib.mapAttrs (_: package: makeStalwartTest { inherit package; }) stalwartPackages