From 5fda3924db1220c5b5adc6e08fa6936fb563d4c8 Mon Sep 17 00:00:00 2001 From: Malte Meiboom Date: Fri, 23 Jan 2026 13:56:05 +0100 Subject: [PATCH] Add end-to-end Test - Add an infrastructur to run local e2e tests. - Add some tests. --- docker/MTAContainerFile | 21 ------------------- docker/{README => README.md} | 2 +- docker/mta_provision/usr/bin/prepare.sh | 4 ++-- e2e-tests/local_run.sh | 10 +++++++++ e2e-tests/runner.sh | 12 +++++++++++ e2e-tests/tests/10_basic.sh | 18 ++++++++++++++++ e2e-tests/tests/20_simple_encrypt.sh | 25 +++++++++++++++++++++++ e2e-tests/tests/21_simple_not_encrypt.sh | 25 +++++++++++++++++++++++ e2e-tests/tests/30_fetch.sh | 26 ++++++++++++++++++++++++ 9 files changed, 119 insertions(+), 24 deletions(-) rename docker/{README => README.md} (90%) create mode 100644 e2e-tests/local_run.sh create mode 100755 e2e-tests/runner.sh create mode 100644 e2e-tests/tests/10_basic.sh create mode 100644 e2e-tests/tests/20_simple_encrypt.sh create mode 100644 e2e-tests/tests/21_simple_not_encrypt.sh create mode 100644 e2e-tests/tests/30_fetch.sh diff --git a/docker/MTAContainerFile b/docker/MTAContainerFile index 833059f..f59b8b2 100644 --- a/docker/MTAContainerFile +++ b/docker/MTAContainerFile @@ -57,27 +57,6 @@ RUN apt-get update -yqq && \ openssl \ sq -RUN adduser --shell /bin/bash --disabled-password --gecos "" user && \ - mkdir -p /home/user/ && \ - usermod -a -G sudo user && \ - chown -R user:user /home/user - -RUN adduser --shell /bin/bash --disabled-password --gecos "" alice && \ - mkdir -p /home/alice/ && \ - chown -R alice:alice /home/alice - -RUN adduser --shell /bin/bash --disabled-password --gecos "" bob && \ - mkdir -p /home/bob/ && \ - chown -R bob:bob /home/bob - -RUN adduser --shell /bin/bash --disabled-password --gecos "" carol && \ - mkdir -p /home/carol/ && \ - chown -R carol:carol /home/carol - -RUN adduser --shell /bin/bash --disabled-password --gecos "" dave && \ - mkdir -p /home/dave/ && \ - chown -R dave:dave /home/dave - RUN adduser --shell /bin/bash --disabled-password --gecos "" hockeypuck COPY mta_provision/ / diff --git a/docker/README b/docker/README.md similarity index 90% rename from docker/README rename to docker/README.md index 2a68266..41b07ad 100644 --- a/docker/README +++ b/docker/README.md @@ -26,6 +26,6 @@ The mapped binary will be started, alongside `postfix` and `hockeypuck`. ``` $ docker run -ti --rm \ - --mount type=bind,src=$(pwd)/target/release,dst=/opt/husk/mapped/ + --mount type=bind,src=$(pwd),dst=/opt/husk/mapped/ localhost/mta bash -c "/usr/bin/prepare.sh && bash -i" ``` diff --git a/docker/mta_provision/usr/bin/prepare.sh b/docker/mta_provision/usr/bin/prepare.sh index d64bc1e..26bb6aa 100755 --- a/docker/mta_provision/usr/bin/prepare.sh +++ b/docker/mta_provision/usr/bin/prepare.sh @@ -7,8 +7,8 @@ echo "127.0.0.1 " $(hostname) > /etc/hosts echo "127.0.0.2 example.com" >> /etc/hosts ## build milter -if [ -f /opt/husk/mapped/husk ] ; then - HUSK_BIN=/opt/husk/mapped/husk +if [ -f /opt/husk/mapped/Cargo.toml ] ; then + HUSK_BIN=/opt/husk/mapped/target/release/husk else cd /opt/husk git clone https://gitlab.com/husk-project/husk-milter.git diff --git a/e2e-tests/local_run.sh b/e2e-tests/local_run.sh new file mode 100644 index 0000000..59003c5 --- /dev/null +++ b/e2e-tests/local_run.sh @@ -0,0 +1,10 @@ +#!/usr/bin/bash + +cargo build --release + +docker run -ti \ + --rm \ + --mount type=bind,src=$(pwd),dst=/opt/husk/mapped/ \ + localhost/mta \ + bash -c "/usr/bin/prepare.sh && bash /opt/husk/mapped/e2e-tests/runner.sh" + diff --git a/e2e-tests/runner.sh b/e2e-tests/runner.sh new file mode 100755 index 0000000..80e251e --- /dev/null +++ b/e2e-tests/runner.sh @@ -0,0 +1,12 @@ +#!/usr/bin/bash + +cd $(dirname $0) + +for TEST in ./tests/* ; do + if bash $TEST ; then + echo "success" + else + echo "failure" + exit 1 + fi +done diff --git a/e2e-tests/tests/10_basic.sh b/e2e-tests/tests/10_basic.sh new file mode 100644 index 0000000..adadf44 --- /dev/null +++ b/e2e-tests/tests/10_basic.sh @@ -0,0 +1,18 @@ +#!/usr/bin/bash + +echo "Basic: Test if MTA is working" + +adduser --shell /bin/bash --disabled-password --gecos "" mtatest +echo "test mail" | sendmail mtatest@example.com + +sleep 1 + +if [ -f /var/mail/mtatest ] ; then + RESULT_CODE=0 +else + RESULT_CODE=1 +fi + +deluser --remove-home mtatest + +exit $RESULT_CODE diff --git a/e2e-tests/tests/20_simple_encrypt.sh b/e2e-tests/tests/20_simple_encrypt.sh new file mode 100644 index 0000000..305b28b --- /dev/null +++ b/e2e-tests/tests/20_simple_encrypt.sh @@ -0,0 +1,25 @@ +#!/usr/bin/bash + +echo "Simple: Test encryption for available certificate" + +# There is an authenticated certificate for bob in the cert store +adduser --shell /bin/bash --disabled-password --gecos "" bob +echo "test mail" | sendmail bob@example.com + +sleep 1 + +if [ -f /var/mail/bob ] ; then + if grep -q "BEGIN PGP MESSAGE" /var/mail/bob ; then + RESULT_CODE=0 + else + echo "no encryption detected" + RESULT_CODE=1 + fi +else + echo "no mail detected" + RESULT_CODE=1 +fi + +deluser --remove-home bob + +exit $RESULT_CODE diff --git a/e2e-tests/tests/21_simple_not_encrypt.sh b/e2e-tests/tests/21_simple_not_encrypt.sh new file mode 100644 index 0000000..ad38101 --- /dev/null +++ b/e2e-tests/tests/21_simple_not_encrypt.sh @@ -0,0 +1,25 @@ +#!/usr/bin/bash + +echo "Simple: Test encryption for unavailable certificate" + +# There is no authenticated certificate for alice in the cert store +adduser --shell /bin/bash --disabled-password --gecos "" alice +echo "test mail" | sendmail alice@example.com + +sleep 1 + +if [ -f /var/mail/alice ] ; then + if grep -q "BEGIN PGP MESSAGE" /var/mail/alice ; then + echo "encryption detected - that is wrong" + RESULT_CODE=1 + else + RESULT_CODE=0 + fi +else + echo "no mail detected" + RESULT_CODE=1 +fi + +deluser --remove-home alice + +exit $RESULT_CODE diff --git a/e2e-tests/tests/30_fetch.sh b/e2e-tests/tests/30_fetch.sh new file mode 100644 index 0000000..85c797e --- /dev/null +++ b/e2e-tests/tests/30_fetch.sh @@ -0,0 +1,26 @@ +#!/usr/bin/bash + +echo "Test encryption for certificate an a keyserver" + +# There is a certificate for carol on the keyserver +# it's certified by an introducer +adduser --shell /bin/bash --disabled-password --gecos "" carol +echo "test mail" | sendmail carol@example.com + +sleep 1 + +if [ -f /var/mail/carol ] ; then + if grep -q "BEGIN PGP MESSAGE" /var/mail/carol ; then + RESULT_CODE=0 + else + echo "no encryption detected" + RESULT_CODE=1 + fi +else + echo "no mail detected" + RESULT_CODE=1 +fi + +deluser --remove-home carol + +exit $RESULT_CODE