From c1024403fad3a6caf9e1546395c5b54788a8f4cb Mon Sep 17 00:00:00 2001 From: Marcel Date: Wed, 8 Jan 2025 09:46:39 +0100 Subject: [PATCH] test/relay: init --- flake.nix | 3 +- tests/clamav.nix | 2 +- tests/relay.nix | 78 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 tests/relay.nix diff --git a/flake.nix b/flake.nix index 6fb5637..2b9a497 100644 --- a/flake.nix +++ b/flake.nix @@ -34,12 +34,13 @@ "clamav" "multiple" "ldap" + "relay" ]; genTest = testName: release: { "name"= "${testName}-${builtins.replaceStrings ["."] ["_"] release.name}"; "value"= import (./tests/. + "/${testName}.nix") { pkgs = release.pkgs; - inherit blobs; + inherit blobs lib; }; }; # Generate an attribute set such as diff --git a/tests/clamav.nix b/tests/clamav.nix index ae186df..3828a72 100644 --- a/tests/clamav.nix +++ b/tests/clamav.nix @@ -14,7 +14,7 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see -{ pkgs ? import {}, blobs}: +{ pkgs ? import {}, blobs, ...}: pkgs.nixosTest { name = "clamav"; diff --git a/tests/relay.nix b/tests/relay.nix new file mode 100644 index 0000000..3088cc3 --- /dev/null +++ b/tests/relay.nix @@ -0,0 +1,78 @@ +# This tests is used to test features requiring several mail domains. + +{ lib, pkgs ? import { }, ... }: + +let + hashPassword = password: pkgs.runCommand + "password-${password}-hashed" + { buildInputs = [ pkgs.mkpasswd ]; inherit password; } + '' + mkpasswd -sm bcrypt <<<"$password" > $out + ''; + + password = pkgs.writeText "password" "password"; + + domainGenerator = domain: { + imports = [ ../default.nix ]; + virtualisation.memorySize = 1024; + mailserver = { + enable = true; + fqdn = "mail.${domain}"; + domains = [ domain ]; + localDnsResolver = false; + loginAccounts = { + "user@${domain}" = { + hashedPasswordFile = hashPassword "password"; + }; + }; + enableImap = true; + enableImapSsl = true; + }; + services = { + dnsmasq = { + enable = true; + settings.mx-host = [ "domain1.com,domain1,10" "domain2.com,domain2,10" ]; + }; + # disable rspamd because of graylisting + postfix.config.smtpd_milters = lib.mkForce [ ]; + rspamd.enable = lib.mkForce false; + redis.servers.rspamd.enable = false; + }; + systemd.services.postfix.requires = lib.mkForce [ "postfix-setup.service" ]; + }; + +in + +pkgs.nixosTest { + name = "relay"; + nodes = { + domain1 = { + imports = [ + ../default.nix + (domainGenerator "domain1.com") + ]; + mailserver.relayDomains = [ "replay.domain1.com" ]; + # ip of itself + services.postfix.networks = [ "[2001:db8:1::1]/128" ]; + }; + domain2 = domainGenerator "domain2.com"; + client = { pkgs, ... }: { + environment.systemPackages = [ + (pkgs.writeScriptBin "mail-check" '' + ${pkgs.python3}/bin/python ${../scripts/mail-check.py} $@ + '') + ]; + }; + }; + testScript = '' + start_all() + + domain1.wait_for_unit("multi-user.target") + domain2.wait_for_unit("multi-user.target") + + # user@domain1.com sends a mail to user@domain2.com + client.succeed( + "mail-check send-and-read --smtp-port 25 --smtp-starttls --smtp-host domain1 --from-addr user@relay.domain1.com --imap-host domain2 --to-addr user@domain2.com --dst-password-file ${password} --ignore-dkim-spf" + ) + ''; +}